【问题标题】:difference between LinearRegression and svm.SVR(kernel="linear")LinearRegression 和 svm.SVR(kernel="linear") 之间的区别
【发布时间】:2018-04-08 19:32:17
【问题描述】:

首先,这个论坛上的问题与这个问题非常相似,但相信我没有匹配项,所以请不要重复。

我遇到了两种使用 scikit 的 sklearn 进行线性回归的方法,但我无法理解两者之间的区别,尤其是在第一个代码中调用了一个方法 train_test_split() 而在另一个直接调用 fit 方法的情况下。

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

首先使用 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() 之间的区别

【问题讨论】:

  • 我建议你使用 kaggle 数据集并运行这两个数据集。每次将训练的行数更改为有效数字。您也会看到速度上的差异。我相信许多其他参数会有所不同。

标签: machine-learning scikit-learn regression python-3.5 sklearn-pandas


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的深入解释,但我仍然对 svr(kernel=linear) 和 LinearRegression 之间的区别存有疑问。你能帮忙理解一下吗?
  • 您是不是想说 LinearRegression() 方法仅在 y 值依赖于一个自变量时才有效?如果我错了请纠正我
  • 与定义的区别?
【解决方案2】:

这是我发现的:

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

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

【讨论】:

  • @VivekKumar linearRegression() 仅用于拟合直线,但具有线性内核的 svm 也可以拟合曲线。这就是我所问的,区别而不是其他任何东西
  • 那么,你是说,即使是线性核,SVM 也能拟合曲线?
  • 我从文档中引用的答案指出,内核工具也提供了拟合曲线的选项,而 LinearRegression() 非常特定于直线拟合。除此之外,支持向量机适用于行数不高的数据集是一个普遍的事实。我欣赏头脑风暴。这是关于 stackoverflow 的东西,这真的很明显。
  • @Dev_Man:您回答中的引述是说 SVR 是一种比线性回归更通用的方法,因为它允许非线性内核,但是在您最初的问题中,您专门询问了具有线性内核的 SVR 和这个qoute没有明确解释线性核的情况是否等同于线性回归。
  • @Wassermann 对,我想我需要检查 SVR(线性内核)和线性 reg 是否以相同的方式计算线,给出相同的线方程,我怀疑 SVR 给出的线方程像线性 reg 可以。
【解决方案3】:

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

我们有样本 X,想要预测 目标 Y。

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

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

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

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

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

所以,在 ML(我确信 sklearn 也有相同的实现)中,w 是根据上面的公式计算的。 X 是训练样本,当您调用 fit 方法时。 在predict 中,这个权重只是乘以X_test。 因此,决策比 svm 等收敛方法更明确且更快(除了 Big selections,因为在这种情况下找到逆矩阵是一项复杂的任务)。

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

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

总结一下:线性回归具有显式决策,而 SVM 由于数值(计算)解决方案而找到实际决策的近似值。

【讨论】:

    猜你喜欢
    • 2018-01-05
    • 2017-03-27
    • 2021-06-13
    • 2016-04-21
    • 2022-01-07
    • 1970-01-01
    • 2021-12-25
    • 2020-05-10
    • 2014-09-20
    相关资源
    最近更新 更多