【发布时间】:2017-08-15 16:10:48
【问题描述】:
我试图使用sklearn.grid_search.GridSearchCV 在鸢尾花数据集上为决策树分类器获取最佳特征。我使用 StratifiedKFold (sklearn.cross_validation.StratifiedKFold) 进行交叉验证,因为我的数据有偏差。但是在每次执行 GridSearchCV 时,它都会返回一组不同的参数。
鉴于数据和交叉验证每次都相同,它不应该返回相同的一组最佳参数吗?
源码如下:
from sklearn.tree import DecisionTreeClassifier
from sklearn.grid_search import GridSearchCV
decision_tree_classifier = DecisionTreeClassifier()
parameter_grid = {'max_depth': [1, 2, 3, 4, 5],
'max_features': [1, 2, 3, 4]}
cross_validation = StratifiedKFold(all_classes, n_folds=10)
grid_search = GridSearchCV(decision_tree_classifier, param_grid = parameter_grid,
cv = cross_validation)
grid_search.fit(all_inputs, all_classes)
print "Best Score: {}".format(grid_search.best_score_)
print "Best params: {}".format(grid_search.best_params_)
输出:
Best Score: 0.959731543624
Best params: {'max_features': 2, 'max_depth': 2}
Best Score: 0.973154362416
Best params: {'max_features': 3, 'max_depth': 5}
Best Score: 0.973154362416
Best params: {'max_features': 2, 'max_depth': 5}
Best Score: 0.959731543624
Best params: {'max_features': 3, 'max_depth': 3}
这是我最近做的一个Ipython notebook的摘录,参考了Randal S Olson的 notebook,可以在here找到。
编辑:
它不是StratifiedKFold 的random_state 参数导致不同的结果,而是DecisionTreeClassifer 的random_state 参数随机初始化树并给出不同的结果(参考documentation)。至于StratifiedKFold,只要将shuffle 参数设置为False(默认),它就会生成相同的训练-测试拆分(参考文档)。
【问题讨论】:
标签: machine-learning scikit-learn cross-validation