在Scikit-Learn中为线性回归获得较大的交叉验证分数

3
我已经清洗和准备好了一个数据集,可以用4种不同的回归类型进行建模 - 线性回归、Lasso回归、Ridge回归和随机森林决策树。
问题出在线性回归模型上。当运行k = 5的CV时,我得到了以下结果:
linreg = LinearRegression()
linreg.fit(X_train, y_train)

y_pred = linreg.predict(X_test)
cv_scores_linreg = cross_val_score(linreg, X_train, y_train, cv=5)


print("R^2: {}".format(linreg.score(X_test, y_test)))
rmse = np.sqrt(mean_squared_error(y_test, y_pred))
print("Root Mean Squared Error: {}".format(rmse))
print("Mean 5-Fold CV Score: {}".format(np.mean(cv_scores_linreg)))

print(cv_scores_linreg)

这会给我输出一个分数:

R^2: 0.40113615279035175
Root Mean Squared Error: 0.7845007237654832
Mean 5-Fold CV Score: -8.07591739989044e+19
[ 3.70497335e-01 -9.07945703e+19  3.38625853e-01  3.38206306e-01
 -3.13001300e+20]

我使用随机森林算法:

rf_reg = RandomForestRegressor()    
rf_reg.fit(X_train, y_train)

y_pred_rf = rf_reg.predict(X_test)

cv_scores_rf = cross_val_score(rf_reg, X_train, y_train, cv=5)
print("R^2: {}".format(rf_reg.score(X_test, y_test)))
rmse = np.sqrt(mean_squared_error(y_test, y_pred_rf))
print("Root Mean Squared Error: {}".format(rmse))
print("Mean 5-Fold CV Score: {}".format(np.mean(cv_scores_rf)))

print(cv_scores_rf)

这将会得到:

R^2: 0.42158777391603736
Root Mean Squared Error: 0.770988735248686
Mean 5-Fold CV Score: 0.3894909330419569
[0.39982241 0.39516204 0.37037191 0.38400655 0.39809175]

我不明白为什么我的其他模型都给出与随机森林类似的值,唯一的异常是线性模型。当我改变k = 10、20、30等时,每增加10个k就会出现1个新的巨大得分值。

我已经删除了所有空数据、空格,并将我的数据放入对数尺度中以使其归一化。当只有线性模型产生问题时,可能出了什么问题?


可能是,但我关心的不是值的符号,而是指数为19和20。我不知道这是从哪里来的。 - HelloToEarth
你应该尝试在cross_val_score中复现示例(通过使用可重现的cv来检查每次测试折叠的分数),或者在这里发布重复行为的数据。没有实际数据,我们无法提供帮助。 - Vivek Kumar
是的,正如@VivekKumar所说的那样,没有数据很难判断。检查线性模型背后的假设并检查您的数据是否满足它们。最重要的是,请检查是否有高度相关的变量。如果是这样,请删除其中一个变量或尝试使用岭回归,它是一种惩罚线性回归,可以处理共线性。 - Marcus V.
1个回答

0

我曾经面临同样的问题。 通过使用岭回归而不是简单线性回归解决了它。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接