【发布时间】:2017-12-29 19:59:06
【问题描述】:
我正在使用sklearn.model_selection.GridSearchCV 和sklearn.model_selection.cross_val_score,但在这样做的过程中我遇到了意想不到的结果。
在我的示例中,我使用以下导入:
from sklearn.datasets import make_classification
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.svm import LinearSVC
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer
from sklearn.metrics import recall_score
from sklearn.model_selection import GridSearchCV
import numpy as np
首先,我创建一个随机数据集:
X, y = make_classification(n_samples=1000, n_features=20, random_state=42)
接下来,我定义管道“生成器”:
def my_pipeline(C=None):
if C is None:
return Pipeline(
[
('step1', StandardScaler()),
('clf', LinearSVC(random_state=42))
])
else:
return Pipeline(
[
('step1', StandardScaler()),
('clf', LinearSVC(C=C, random_state=42))
])
接下来,我设置了几个C 进行测试:
Cs = [0.01, 0.1, 1, 2, 5, 10, 50, 100]
最后,我想检查一下可以得到的最大recall_score 是多少。一次,我使用cross_val_score 进行,一次直接使用GridSearchCV。
np.max(
[
np.mean(
cross_val_score(my_pipeline(C=c), X, y,
cv=3,
scoring=make_scorer(recall_score)
)) for c in Cs])
和:
GridSearchCV(
my_pipeline(),
{
'clf__C': Cs
},
scoring=make_scorer(recall_score),
cv=3
).fit(X, y).best_score_)
在我的示例中,前者产生0.85997883750571147,后者产生0.85999999999999999。我期望值是相同的。我错过了什么?
我也把它全部放在gist 中。
编辑:修复cv。我用StratifiedKFold(n_splits=3, random_state=42) 替换了cv=3,结果没有改变。事实上,cv 似乎不会影响结果。
【问题讨论】:
-
这里的一个非常快速的第一个猜测是,它与随机数生成器的状态有关,即数据被分成折叠以进行交叉验证。如果同时修复
GridSearchCV和cross_val_score中的random_state会发生什么? -
猜对了,但是……错了。 @AngusWilliams 查看更新。
标签: python scikit-learn cross-validation grid-search