使用网格搜索和交叉验证创建岭回归模型

数据挖掘 机器学习 Python 回归 交叉验证 网格搜索
2022-03-04 18:10:45

我为岭回归创建了 python 代码。为此,我将交叉验证和网格搜索技术结合使用。我得到了输出结果。我想检查我的回归模型构建步骤是否正确?有人可以解释一下吗?

from sklearn.linear_model import Ridge
ridge_reg = Ridge()
from sklearn.model_selection import GridSearchCV
params_Ridge = {'alpha': [1,0.1,0.01,0.001,0.0001,0] , "fit_intercept": [True, False], "solver": ['svd', 'cholesky', 'lsqr', 'sparse_cg', 'sag', 'saga']}
Ridge_GS = GridSearchCV(ridge_reg, param_grid=params_Ridge, n_jobs=-1)
Ridge_GS.fit(x_train,y_train)
Ridge_GS.best_params_

输出 - {'alpha': 1, 'fit_intercept': True, 'solver': 'cholesky'}

Ridgeregression = Ridge(random_state=3, **Ridge_GS.best_params_)
from sklearn.model_selection import cross_val_score
all_accuracies = cross_val_score(estimator=Ridgeregression, X=x_train, y=y_train, cv=5)
all_accuracies

输出 - 数组([0.93335508, 0.8984485, 0.91529146, 0.89309012, 0.90829416])

print(all_accuracies.mean())

输出 - 0.909695864130532

Ridgeregression.fit(x_train,y_train)
Ridgeregression.score(x_test,y_test)

输出 - 0.9113458623386644

是 0.9113458623386644 我的岭回归精度(R sqred)吗?如果是,那么 0.909695864130532 值的含义是什么。

1个回答

是 0.9113458623386644 我的岭回归精度(R sqred)吗?如果是,那么 0.909695864130532 值的含义是什么。

这些都是 R^2 值

第一个分数是训练集上的交叉验证分数,第二个是你的测试集分数。第一个可能有点偏颇,因为这些模型是使用在使用该数据集时选择的超参数构建的(但我认为是不同的 cv-split)。第二个分数应该是公正的,并且可能应该是您报告的测试分数。(第二个分数比应该是乐观的分数要好一些;也许只是随机的,也许是因为训练/测试的分裂,也许是因为该模型已经看到了更多的数据。)

我想检查我的回归模型构建步骤是否正确?有人可以解释一下吗?

在我看来一切都还好。

您可以节省一些代码和培训时间;默认情况下GridSearchCV,使用识别的超参数在整个训练集上重新拟合模型,因此您不需要适合最后一个代码块。它还具有cv_results_best_score_属性为您提供交叉验证分数,但由于您已使用它们来选择最佳超参数,因此最佳分数不再是未来性能的无偏估计。

还要注意,有一个用于调整正则化参数的内置函数,但它使用不同的 CV 方法并将 RMSE 作为默认记分器。