为什么sklearn.grid_search.GridSearchCV会在每次执行时返回随机结果?

时间:2017-03-23 08:09:14

标签: machine-learning scikit-learn cross-validation

我试图使用sklearn.grid_search.GridSearchCV在Iris数据集上获得决策树分类器的最佳功能。我使用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笔记本的摘录,参考了 Randal S Olson的笔记本,可以找到here

修改: 它不是random_state StratifiedKFold参数导致的结果变化,而是random_state DecisionTreeClassifer参数StratifiedKFold随机初始化树并给出不同的结果(参考documentation })。至于shuffle,只要False参数设置为{{1}}(默认),它就会生成相同的训练测试分割(参考文档)。

2 个答案:

答案 0 :(得分:0)

对于每次运行,cv随机拆分列车和验证集,因此各自的结果会有所不同。

答案 1 :(得分:0)

培训结果取决于在交叉验证中拆分列车数据的方式。每次运行时,数据都会随机分割,因此您会发现答案中存在细微差别。 您应该使用random_state parameter of StratifiedKFold确保每次都以完全相同的方式拆分列车数据。

请参阅我的其他答案以了解有关randomstate的更多信息: