LinearRegression和svm.SVR之间的区别(内核="线性")

时间:2017-10-27 08:40:45

标签: 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.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()

之间的区别

3 个答案:

答案 0 :(得分:4)

cross_validation.train_test_split :将数组或矩阵拆分为随机训练和测试子集。

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

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

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

参考: https://cs.adelaide.edu.au/~chhshen/teaching/ML_SVR.pdf

答案 1 :(得分:1)

这是我发现的:

直观地说,正如所有回归量一样,它试图通过最小化成本函数来拟合数据线。但是,关于SVR的有趣部分是您可以部署非线性内核。在这种情况下,您最终进行非线性回归,即拟合曲线而不是线。 此过程基于内核技巧和解决方案/模型在双重而非原始中的表示。也就是说,模型表示为训练点的组合,而不是特征和一些权重的函数。同时基本算法保持不变:非线性过程中唯一真正的变化是核函数,它从简单的内积变为非线性函数。

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

答案 2 :(得分:0)

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

我们有样本 X 并且想要预测目标 Y

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

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

<块引用>

损失(w) = Sum_1_N(x_n^T * w - y_n) ^ 2 --> min(w)

因为它是一个凸函数,所以总能找到全局最小值。 通过 wLoss 求导并将总和转换为向量后,您将得到:

<块引用>

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

因此,在 ML(我确定 sklearn 也有相同的实现)中,w 是根据上述公式计算的。 X 是训练样本,当您调用 fit 方法时。 在 predict 中,这个权重只是乘以 X_test。 因此,与诸如 svm 之类的收敛方法相比,决策是明确且快速的(除了大选择,因为在这种情况下寻找逆矩阵是一项复杂的任务)。

此外:LassoRidge 解决了相同的任务,但它们的损失中还有权重的正则化。 在这种情况下,您也可以显式计算权重。

SVM.Linear 几乎做了同样的事情,除了它有一个最大化边距的优化任务(我很抱歉,但很难把它放下,因为我没有找到如何写此处为 Tex 格式)。 所以它使用梯度下降方法来寻找全局极值。 Sklearn 的类 SVM 甚至有属性 max_iter 用于收敛任务。

总而言之:线性回归有明确的决策,而 SVM 由于数值(计算)解决方案而找到真实决策的近似。