SKLearn LinearRegression 预测结果是不是取决于列顺序?
Posted
技术标签:
【中文标题】SKLearn LinearRegression 预测结果是不是取决于列顺序?【英文标题】:Does SKLearn LinearRegression prediction result depend on column order?SKLearn LinearRegression 预测结果是否取决于列顺序? 【发布时间】:2021-10-06 02:12:52 【问题描述】:似乎SKLearn LinearRegression 的预测结果取决于X_train
(和X_test
)的列顺序,尽管在我的理解中OLS 线性回归解决方案应该独立于它:
import pandas as pd
from sklearn.linear_model import LinearRegression
X_train = pd.DataFrame(
'x2': [0.41881871483604843, 0.41881871483604843, 0.41881871483604843, -2.2128066838437888, 0.41881871483604843],
'x1': [0.3226465587013849, 0.3226465587013849, 0.3226465587013849, -2.1432281979935226, 0.3226465587013849],
'x3': [0.41881871483604843, 0.41881871483604843, 0.41881871483604843, -2.2128066838437888, 0.41881871483604843]
)
y_train = pd.Series([0.00208714705719199, 0.0, 0.0373802794439473, 0.4751917903756102, 0.01156975729482886])
X_test = pd.DataFrame(
'x2': [0.6718361093920282, 0.39636690075505104, 0.4225844259460428, 0.4225844259460428, 0.6991034460436102],
'x1': [1.417088758155678, 0.25726707774120766, 0.25726707774120766, 0.25726707774120766, 1.417088758155678],
'x3': [0.6718361093920282, 0.39636690075505104, 0.4225844259460428, 0.4225844259460428,0.6991034460436102]
)
y_test = pd.Series([0.21970766666406633, 0.1452871258871291, 0.08888275135771367, 0.08914350635018843, 0.04924794822392303])
model = LinearRegression().fit(X_train, y_train)
yhat_train = model.predict(X_train)
yhat_test = model.predict(X_test)
# Sort columns.
cols = sorted(X_train.columns)
sorted_X_train = X_train[cols].copy()
sorted_X_test = X_test[cols].copy()
sorted_model = LinearRegression()
sorted_model = sorted_model.fit(sorted_X_train, y_train)
sorted_yhat_train = sorted_model.predict(sorted_X_train)
sorted_yhat_test = sorted_model.predict(sorted_X_test)
print(f'yhat_test : yhat_test')
print(f'sorted_yhat_test: sorted_yhat_test')
结果:
yhat_test : [-8.13124851e+12 4.20539351e+11 6.53526629e+11 6.53526629e+11
-7.88893187e+12]
sorted_yhat_test: [-0.08075183 0.0192414 0.01603989 0.01603989 -0.08408154]
系数也不同(值也不同,而不仅仅是顺序)。我在这里做错了什么?
【问题讨论】:
【参考方案1】:您的特征空间包含多重共线性,因此 OLS 问题没有唯一的解决方案,而且列顺序等小变化会影响选择的解决方案也许并不奇怪。
但是,发生了一些奇怪的事情。 LinearRegression
在后台使用 scipy.linalg.lstsq
来解决 OLS。直接在您的示例上调用lstsq
,我得到两个输入的系数相同(当然是重新排序)! sklearn
确实首先运行 _preprocess_data
,对数据进行居中和缩放。手动执行此操作,我可以确认输出与预期的一样,只是相互重新排序,但现在在这两个上调用 lstsq
我得到不同的系数!更何况等级不一样! LAPACK 驱动程序可能会理解这种差异,这超出了我的专业知识。
【讨论】:
以上是关于SKLearn LinearRegression 预测结果是不是取决于列顺序?的主要内容,如果未能解决你的问题,请参考以下文章
sklearn中LinearRegression使用及源码解读
sklearn中LinearRegression关键源码解读
numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 的区别