LinearRegression 和 svm.SVR(kernel="linear") 之间的区别
difference between LinearRegression and svm.SVR(kernel="linear")
首先,这个论坛上有一些问题与这个非常相似,但请相信我 none 匹配,所以请不要重复。
我遇到了两种使用 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()
之间的区别
cross_validation.train_test_split :将数组或矩阵拆分为随机训练和测试子集。
在第二个代码中,拆分不是随机的。
svm.SVR:Support Vector Regression (SVR) 使用与 SVM 相同的原理进行分类,只有一些细微差别。首先,因为输出是一个实数,所以预测手头的信息变得非常困难,这具有无限的可能性。在回归的情况下,公差范围 (epsilon) 被设置为近似于已经从问题中请求的 SVM。但除此之外,还有一个更复杂的原因,算法更复杂,需要考虑。然而,主要思想总是相同的:为了最小化错误,个性化最大化边缘的超平面,记住部分错误是可以容忍的。
线性回归:在统计学中,线性回归是一种线性方法,用于模拟标量因变量 y 和一个或多个解释变量(或自变量)之间的关系,表示为 X . 一个解释变量的情况称为一元线性回归
这是我发现的:
直觉上,作为所有回归器,它试图通过最小化成本函数来拟合数据线。然而,关于 SVR 的有趣部分是您可以部署非线性内核。在这种情况下,您结束了非线性回归,即拟合曲线而不是直线。
这个过程基于内核技巧和 solution/model 在对偶中而不是在原始中的表示。也就是说,模型表示为训练点的组合,而不是特征和某些权重的函数。同时基本算法保持不变:在走向非线性的过程中唯一真正变化的是核函数,它从一个简单的内积变成了一些非线性函数。
因此 SVR 也允许非线性拟合问题,而 LinearRegression() 仅适用于直线的简单线性回归(在两种情况下都可能包含任意数量的特征)。
这些方法的主要区别在于数学背景!
我们有 个样本 X 并且想要预测 目标 Y。
线性回归方法只是最小化最小二乘误差:
对于一个对象目标 y = x^T * w,其中 w 是模型的权重。
Loss(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 是根据上面的公式计算的。
当您调用 fit
方法时,X 是训练样本。
在 predict
中,这个权重只是乘以 X_test
。
因此,与 svm 等收敛方法相比,决策是明确且更快的(除了大选择,因为在这种情况下寻找逆矩阵是一项复杂的任务)。
此外:Lasso
和 Ridge
解决了相同的任务,但在其损失中还对权重进行了正则化。
您也可以在这种情况下显式计算权重。
SVM.Linear 做的事情几乎一样,除了它有一个最大化边距的优化任务(我很抱歉,但很难放下,因为我没有在这里了解如何以 Tex 格式编写)。
所以它使用梯度下降法来寻找全局极值。
Sklearn 的 class SVM 甚至具有用于收敛任务的属性 max_iter
。
总结一下:线性回归有明确的决定,SVM 找到真实决定的近似值,因为数值(计算)解决方案。
首先,这个论坛上有一些问题与这个非常相似,但请相信我 none 匹配,所以请不要重复。
我遇到了两种使用 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()
之间的区别cross_validation.train_test_split :将数组或矩阵拆分为随机训练和测试子集。
在第二个代码中,拆分不是随机的。
svm.SVR:Support Vector Regression (SVR) 使用与 SVM 相同的原理进行分类,只有一些细微差别。首先,因为输出是一个实数,所以预测手头的信息变得非常困难,这具有无限的可能性。在回归的情况下,公差范围 (epsilon) 被设置为近似于已经从问题中请求的 SVM。但除此之外,还有一个更复杂的原因,算法更复杂,需要考虑。然而,主要思想总是相同的:为了最小化错误,个性化最大化边缘的超平面,记住部分错误是可以容忍的。
线性回归:在统计学中,线性回归是一种线性方法,用于模拟标量因变量 y 和一个或多个解释变量(或自变量)之间的关系,表示为 X . 一个解释变量的情况称为一元线性回归
这是我发现的:
直觉上,作为所有回归器,它试图通过最小化成本函数来拟合数据线。然而,关于 SVR 的有趣部分是您可以部署非线性内核。在这种情况下,您结束了非线性回归,即拟合曲线而不是直线。 这个过程基于内核技巧和 solution/model 在对偶中而不是在原始中的表示。也就是说,模型表示为训练点的组合,而不是特征和某些权重的函数。同时基本算法保持不变:在走向非线性的过程中唯一真正变化的是核函数,它从一个简单的内积变成了一些非线性函数。
因此 SVR 也允许非线性拟合问题,而 LinearRegression() 仅适用于直线的简单线性回归(在两种情况下都可能包含任意数量的特征)。
这些方法的主要区别在于数学背景!
我们有 个样本 X 并且想要预测 目标 Y。
线性回归方法只是最小化最小二乘误差:
对于一个对象目标 y = x^T * w,其中 w 是模型的权重。
Loss(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 是根据上面的公式计算的。
当您调用 fit
方法时,X 是训练样本。
在 predict
中,这个权重只是乘以 X_test
。
因此,与 svm 等收敛方法相比,决策是明确且更快的(除了大选择,因为在这种情况下寻找逆矩阵是一项复杂的任务)。
此外:Lasso
和 Ridge
解决了相同的任务,但在其损失中还对权重进行了正则化。
您也可以在这种情况下显式计算权重。
SVM.Linear 做的事情几乎一样,除了它有一个最大化边距的优化任务(我很抱歉,但很难放下,因为我没有在这里了解如何以 Tex 格式编写)。
所以它使用梯度下降法来寻找全局极值。
Sklearn 的 class SVM 甚至具有用于收敛任务的属性 max_iter
。
总结一下:线性回归有明确的决定,SVM 找到真实决定的近似值,因为数值(计算)解决方案。