Machine learning 线性回归和svm.SVR之间的差异(内核=“线性”)

Machine learning 线性回归和svm.SVR之间的差异(内核=“线性”),machine-learning,scikit-learn,regression,python-3.5,sklearn-pandas,Machine Learning,Scikit Learn,Regression,Python 3.5,Sklearn Pandas,首先,在这个论坛上有一些问题非常类似于这个,但相信我,没有匹配,所以请不要重复 我使用scikit的sklearn遇到了两种线性回归方法,但我无法理解这两种方法之间的区别,特别是在第一个代码中,有一个方法train_test_split()被调用,而在另一个方法中,直接拟合方法被调用 我正在使用多种资源进行学习,这一问题让我非常困惑 第一个是使用SVR X = np.array(df.drop(['label'], 1)) X = preprocessing.scale(X) y = np.

首先,在这个论坛上有一些问题非常类似于这个,但相信我,没有匹配,所以请不要重复

我使用scikit的sklearn遇到了两种线性回归方法,但我无法理解这两种方法之间的区别,特别是在第一个代码中,有一个方法train_test_split()被调用,而在另一个方法中,直接拟合方法被调用

我正在使用多种资源进行学习,这一问题让我非常困惑

第一个是使用SVR

X = np.array(df.drop(['label'], 1))

X = preprocessing.scale(X)

y = np.array(df['label'])

X_train, X_test, y_train, y_test = cross_validation.train_test_split(X, y, test_size=0.2)

clf = svm.SVR(kernel='linear')

clf.fit(X_train, y_train)

confidence = clf.score(X_test, y_test)
第二个是这个

# Split the data into training/testing sets
diabetes_X_train = diabetes_X[:-20]
diabetes_X_test = diabetes_X[-20:]

# Split the targets into training/testing sets
diabetes_y_train = diabetes.target[:-20]
diabetes_y_test = diabetes.target[-20:]

# Create linear regression object
regr = linear_model.LinearRegression()

# Train the model using the training sets
regr.fit(diabetes_X_train, diabetes_y_train)

# Make predictions using the testing set
diabetes_y_pred = regr.predict(diabetes_X_test)

因此,我主要关注的是使用svr(kernel=“linear”)和使用LinearRegression()之间的区别。train\u test\u split:将数组或矩阵拆分为随机序列和测试子集

在第二个代码中,拆分不是随机的

svm.SVR:支持向量回归(SVR)使用与svm相同的原理进行分类,只有一些细微的差异。首先,因为输出是一个实数,所以很难预测手头的信息,因为它有无限的可能性。在回归的情况下,设置了一个近似于SVM的容差(ε),该SVM可能已经从问题中请求了。但除此之外,还有一个更复杂的原因,算法更复杂,因此需要考虑。然而,主要的想法总是一样的:为了最小化错误,个性化的超平面,最大限度地提高了边距,记住部分错误是可以容忍的

线性回归:在统计学中,线性回归是一种线性方法,用于建模标量因变量y与表示为X的一个或多个解释变量(或自变量)之间的关系。一个解释变量的情况称为简单线性回归

参考: 这是我发现的:

直觉上,作为所有回归者,它试图通过最小化成本函数来拟合数据线。然而,SVR的有趣之处在于,您可以部署一个非线性内核。在这种情况下,您将结束非线性回归,即拟合曲线而不是直线。 这个过程是基于内核技巧和解决方案/模型的对偶表示,而不是原始表示。也就是说,模型表示为训练点的组合,而不是特征和某些权重的函数。同时,基本算法保持不变:非线性过程中唯一真正的变化是核函数,它从一个简单的内积变为一些非线性函数


因此SVR也允许非线性拟合问题,而LinearRegression()仅适用于具有直线的简单线性回归(在这两种情况下可能包含任意数量的特征)。

这些方法的主要区别在于数学背景

我们有样本X,希望预测目标Y

线性回归方法只是将最小二乘误差最小化:

对于一个对象目标y=x^T*w,其中w是模型的权重

损耗(w)=总损耗(x^T*w-y^N)^2-->最小损耗(w)

因为它是一个凸泛函,所以总是会找到全局最小值。 通过w损失进行导数并将总和转换为向量后,您将得到:

w=(X^T*X)^(-1)*(X^T*Y)

因此,在ML中(我确信sklearn也有相同的实现),w是根据上述公式计算的。 当您调用
fit
方法时,X是训练样本。 在
predict
中,此权重仅在
X\u测试时相乘。
因此,与svm等收敛方法相比,决策是明确的,速度更快(除了较大的选择,因为在这种情况下,求逆矩阵是一项复杂的任务)

此外:
Lasso
Ridge
解决了相同的任务,但在它们的损失中还具有对权重的正则化。 在这种情况下,你也可以直接计算权重

SVM.Linear的作用几乎相同,只是它有一个优化任务来最大化边际(很抱歉,很难把它写下来,因为我在这里没有找到如何用Tex格式书写)。 所以它使用梯度下降法来寻找全局极值。 Sklearn的类SVM甚至有属性
max_iter
,用于聚合任务


总而言之:线性回归有明确的决策,支持向量机通过数值(计算)解决方案找到实际决策的近似值。

感谢您的深入解释,但我仍然怀疑svr(核=线性)和线性回归之间的差异。你能帮助理解吗?你是想说线性回归()方法只有在y值依赖于一个独立变量时才有效吗?如果我的定义有误,请纠正我:@VivekKumar linearRegression()仅用于拟合直线,但带有线性核的svm也可以拟合曲线。这就是我所问的,区别,而不是其他任何东西。所以,你是说,支持向量机可以拟合曲线,即使使用线性核?我从文档中引用的答案指出,核功能也提供了拟合曲线的选项,而LinearRegression()非常特定于直线拟合。除此之外,支持向量机对于行数不多的数据集很有用,这是一个普遍的事实。我很欣赏这次头脑风暴。这就是stackoverflow真正值得注意的地方。@Dev_-Man:你的回答中引用的话是,SVR是一种比线性回归更通用的方法,因为它允许非线性内核,但是在你最初的问题中,你专门问了关于线性内核的SVR,而这个qoute并没有解释