我使用的是sklearn.model_selection.GridSearchCV
和sklearn.model_selection.cross_val_score
,同时这样做时我遇到了意想不到的结果。交叉验证与Scikit中的网格搜索学习
在我的例子中,我使用下面的进口:
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检查更新。 – Dror