cross_val_score 和 gridsearchCV 是如何工作的?
How does cross_val_score and gridsearchCV works?
我是 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/test 数据集。我检查了两个数据集是否相同:
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
线性回归和管道完美匹配
现在我尝试使用 cross_val_score 和预定义的拆分 kf
来做同样的事情
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 将首先拆分数据,仅在训练数据上训练模型,然后在测试数据上评分。
这里是对完整数据进行训练,然后对测试数据进行评分。因此,您不匹配 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)
您可以查看我的回答以获得更多说明:-
我是 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/test 数据集。我检查了两个数据集是否相同:
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
线性回归和管道完美匹配
现在我尝试使用 cross_val_score 和预定义的拆分 kf
来做同样的事情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 将首先拆分数据,仅在训练数据上训练模型,然后在测试数据上评分。
这里是对完整数据进行训练,然后对测试数据进行评分。因此,您不匹配 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)
您可以查看我的回答以获得更多说明:-