cross_val_score 和 gridsearchCV 是如何工作的?

Posted

技术标签:

【中文标题】cross_val_score 和 gridsearchCV 是如何工作的?【英文标题】:How does cross_val_score and gridsearchCV works? 【发布时间】:2018-11-10 18:10:25 【问题描述】:

我是 python 新手,我一直在尝试弄清楚 gridsearchCV 和 cross_val_score 是如何工作的。

查找赔率导致设置了一种验证实验,但我仍然不明白我做错了什么。

为了简化我正在使用 gridsearchCV 是最简单的方法,并尝试验证和了解正在发生的事情:

这里是:

import pandas as pd
import numpy as np
from sklearn.preprocessing import StandardScaler, RobustScaler, QuantileTransformer
from sklearn.feature_selection import SelectKBest, f_regression, RFECV
from sklearn.decomposition import PCA
from sklearn.linear_model import RidgeCV,Ridge, LinearRegression
from sklearn.pipeline import Pipeline, make_pipeline
from sklearn.model_selection import GridSearchCV,KFold,TimeSeriesSplit,PredefinedSplit,cross_val_score
from sklearn.metrics import mean_squared_error,make_scorer,r2_score,mean_absolute_error,mean_squared_error
from math import sqrt

我创建了一个交叉验证对象(用于 gridsearchCV 和 cross_val_score)和一个用于管道和简单线性回归的训练/测试数据集。我检查了这两个数据集是否相同:

train_indices = np.full((15,), -1, dtype=int)
test_indices = np.full((6,), 0, dtype=int)
test_fold = np.append(train_indices, test_indices)
kf = PredefinedSplit(test_fold)

for train_index, test_index in kf.split(X):
    print('TRAIN:', train_index, 'TEST:', test_index)
    X_train_kf = X[train_index]
    X_test_kf = X[test_index]

train_data = list(range(0,15))
test_data = list(range(15,21))

X_train, y_train=X[train_data,:],y[train_data]
X_test, y_test=X[test_data,:],y[test_data]

这是我的工作:

实例化一个简单的线性模型并将其与手动数据集一起使用

lr=LinearRegression()
lm=lr.fit(X,y)
lmscore_train=lm.score(X_train,y_train) 

->r2=0.4686662249071524

lmscore_test=lm.score(X_test,y_test)

->r2 0.6264021467338086

现在我尝试使用管道做完全相同的事情:

pipe_steps = ([('est', LinearRegression())])
pipe=Pipeline(pipe_steps)
p=pipe.fit(X,y)
pscore_train=p.score(X_train,y_train) 

->r2=0.4686662249071524

pscore_test=p.score(X_test,y_test)

->r2 0.6264021467338086

LinearRegression 和管道完美匹配

现在我尝试通过使用预定义拆分 kf 的 cross_val_score 来做同样的事情

cv_scores = cross_val_score(lm, X, y, cv=kf)  

->r2 = -1.234474757883921470e+01?!?! (这应该是考试成绩)

现在让我们试试 gridsearchCV

scoring = 'r_squared':'r2'
grid_parameters = [] 
gridsearch=GridSearchCV(p, grid_parameters, verbose=3,cv=kf,scoring=scoring,return_train_score='true',refit='r_squared')
gs=gridsearch.fit(X,y)
results=gs.cv_results_

来自 cv_results_ 我再次得到 ->mean_test_r_squared->r2->-1.234474757883921292e+01

所以 cross_val_score 和 gridsearch 最终是相互匹配的,但分数完全偏离,与应有的不同。

你能帮我解决这个难题吗?

【问题讨论】:

cross_val_score 将进行交叉验证并计算每次拆分的分数。 GridSearchCV 将对网格的每个参数执行交叉验证并计算分数。它用于对超参数进行基准测试。此外,基于 15 个观测值的样本构建模型可能还不够。 【参考方案1】:

cross_val_score 和 GridSearchCV 将首先拆分数据,仅在训练数据上训练模型,然后在测试数据上评分。

在这里,您正在对完整数据进行训练,然后对测试数据进行评分。因此,您与cross_val_score 的结果不匹配。

而不是这个:

lm=lr.fit(X,y)

试试这个:

lm=lr.fit(X_train, y_train)

管道也一样:

请执行以下操作,而不是 p=pipe.fit(X,y)

p=pipe.fit(X_train, y_train)

您可以查看我的答案以获得更多描述:-

https://***.com/a/42364900/3374996 https://***.com/a/42230764/3374996

【讨论】:

你好 Vivek,你是对的。使用 lm=lr.fit(X_train, y_train) 在 lm 和管道中也给出 -> r2=-12.44。让我感到困扰的是,据我所知,r2 在设计上总是包含在 0 和 1 之间,因为它是决定系数。你知道为什么 a 得到 -12.44 吗?再次感谢您的帮助。 没有。 r2 可以是负数。请看这些帖子:Post1 和 Post2 @LucaFichera 如果这个答案有帮助,请考虑accepting the answer 大家好,终于可以通过excel交叉验证一切了。实际上,我也发现 scikit-learn it self 中给出的解释很有用。 scikit-learn.org/stable/modules/…

以上是关于cross_val_score 和 gridsearchCV 是如何工作的?的主要内容,如果未能解决你的问题,请参考以下文章

cross_val_score 和 gridsearchCV 是如何工作的?

使用 cross_val_score 和 StackingClassifier 或投票分类器获取“nan”

使用 cross_val_score 评估多项式回归

为啥 xgboost.cv 和 sklearn.cross_val_score 给出不同的结果?

使用 Cross_Val_score 的原因

评分='roc_auc' 的 cross_val_score 和 roc_auc_score 有啥区别?