我对结果感到困惑,可能是我没有正确理解交叉验证和GridSearch的概念。我遵循了这篇文章中的逻辑:https://randomforests.wordpress.com/2014/02/02/basics-of-k-fold-cross-validation-and-gridsearchcv-in-scikit-learn/
argd = CommandLineParser(argv)folder,fname=argd['dir'],argd['fname']df = pd.read_csv('../../'+folder+'/Results/'+fname, sep=";")explanatory_variable_columns = set(df.columns.values)response_variable_column = df['A']explanatory_variable_columns.remove('A')y = np.array([1 if e else 0 for e in response_variable_column])X =df[list(explanatory_variable_columns)].as_matrix()kf_total = KFold(len(X), n_folds=5, indices=True, shuffle=True, random_state=4)dt=DecisionTreeClassifier(criterion='entropy')min_samples_split_range=[x for x in range(1,20)]dtgs=GridSearchCV(estimator=dt, param_grid=dict(min_samples_split=min_samples_split_range), n_jobs=1)scores=[dtgs.fit(X[train],y[train]).score(X[test],y[test]) for train, test in kf_total]# SAME AS DOING: cross_validation.cross_val_score(dtgs, X, y, cv=kf_total, n_jobs = 1)print scoresprint np.mean(scores)print dtgs.best_score_
获得的结果:
# score [0.81818181818181823, 0.78181818181818186, 0.7592592592592593, 0.7592592592592593, 0.72222222222222221]# 平均分数 0.768# .best_score_ 0.683486238532
额外说明:
我使用了另一种解释变量的组合(只使用其中的一些),结果出现了相反的问题。现在.best_score_的值高于交叉验证数组中的所有值。
# score [0.74545454545454548, 0.70909090909090911, 0.79629629629629628, 0.7407407407407407, 0.64814814814814814]# 平均分数 0.728# .best_score_ 0.802752293578
回答:
这段代码混淆了几件事。dtgs.fit(X[train_],y[train_])
对param_grid
中的每个参数组合进行内部3折交叉验证,生成一个包含20个结果的网格,你可以通过调用dtgs.grid_scores_
来查看这些结果。
[dtgs.fit(X[train_],y[train_]).score(X[test],y[test]) for train_, test in kf_total]
因此,这行代码执行了五次网格搜索,然后使用5折交叉验证来评分。结果是5折验证的分数数组。
当你调用dtgs.best_score_
时,你会得到最后一次(共5次)拟合的超参数3折验证结果网格中的最佳分数。