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源码理解

sklearn中LinearRegression关键源码解读

sklearn的LinearRegression源码理解

numpy.linalg.lstsq 和 sklearn.linear_model.LinearRegression 的区别

Python:Sklearn.linear_model.LinearRegression 工作很奇怪