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

Posted

技术标签:

【中文标题】为啥 sklearn.grid_search.GridSearchCV 在每次执行时都会返回随机结果?【英文标题】:Why does sklearn.grid_search.GridSearchCV return random results on every execution?为什么 sklearn.grid_search.GridSearchCV 在每次执行时都会返回随机结果? 【发布时间】: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找到。

编辑: 它不是StratifiedKFoldrandom_state 参数导致不同的结果,而是DecisionTreeClassiferrandom_state 参数随机初始化树并给出不同的结果(参考documentation)。至于StratifiedKFold,只要将shuffle 参数设置为False(默认),它就会生成相同的训练-测试拆分(参考文档)。

【问题讨论】:

【参考方案1】:

对于每次运行,cv 随机拆分训练集和验证集,因此每个结果都会不同。

【讨论】:

【参考方案2】:

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

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

Classification results depend on random_state?

【讨论】:

不是StratifiedKFoldrandom_state 参数导致不同的结果,而是'DecisionTreeClassifer` 的random_state 参数随机初始化树并给出不同的结果。至于StratifiedKFold,只要将shuffle 参数设置为False(默认),它就会生成相同的训练-测试拆分。我在一个单独的 Ipython 笔记本中检查了这个结果,可以找到 here。 使用特定的随机状态解决了每次执行 gridserachcv 时返回不同结果的问题。我将它用于随机森林分类器。

以上是关于为啥 sklearn.grid_search.GridSearchCV 在每次执行时都会返回随机结果?的主要内容,如果未能解决你的问题,请参考以下文章

为啥 DataGridView 上的 DoubleBuffered 属性默认为 false,为啥它受到保护?

为啥需要softmax函数?为啥不简单归一化?

为啥 g++ 需要 libstdc++.a?为啥不是默认值?

为啥或为啥不在 C++ 中使用 memset? [关闭]

为啥临时变量需要更改数组元素以及为啥需要在最后取消设置?

为啥 CAP 定理中的 RDBMS 分区不能容忍,为啥它可用?