混淆了关于scikit学习决策树中的random_state

时间:2016-08-26 03:48:43

标签: python python-2.7 machine-learning scikit-learn decision-tree

random_state参数感到困惑,不确定为什么决策树培训需要一些随机性。我的想法,(1)它与随机森林有关吗? (2)是否与分裂训练测试数据集有关?如果是这样,为什么不直接使用训练测试分割方法(http://scikit-learn.org/stable/modules/generated/sklearn.cross_validation.train_test_split.html)?

http://scikit-learn.org/stable/modules/generated/sklearn.tree.DecisionTreeClassifier.html

>>> from sklearn.datasets import load_iris
>>> from sklearn.cross_validation import cross_val_score
>>> from sklearn.tree import DecisionTreeClassifier
>>> clf = DecisionTreeClassifier(random_state=0)
>>> iris = load_iris()
>>> cross_val_score(clf, iris.data, iris.target, cv=10)
...                             
...
array([ 1.     ,  0.93...,  0.86...,  0.93...,  0.93...,
        0.93...,  0.93...,  1.     ,  0.93...,  1.      ])

的问候, 林

3 个答案:

答案 0 :(得分:15)

the documentation

中对此进行了解释
  

在最优性的几个方面甚至对于简单的概念,已知学习最优决策树的问题是NP完全的。因此,实际的决策树学习算法基于启发式算法,例如贪婪算法,其中在每个节点处进行局部最优决策。这种算法不能保证返回全局最优决策树。这可以通过在集合学习器中训练多个树来减轻,其中特征和样本随机取样替换。

因此,基本上,使用随机选择的特征和样本(随机森林中使用的类似技术)重复次优贪心算法多次。 random_state参数允许控制这些随机选择。

interface documentation具体说明:

  

如果是int,则random_state是随机数生成器使用的种子;如果是RandomState实例,则random_state是随机数生成器;如果为None,则随机数生成器是np.random使用的RandomState实例。

因此,随机算法将在任何情况下使用。传递任何值(无论是特定的int,例如0,还是RandomState实例)都不会改变它。传递int值(0或其他)的唯一理由是使调用之间的结果保持一致:如果用random_state=0(或任何其他值)调用它,那么每次都会得到同样的结果。

答案 1 :(得分:0)

决策树使用启发式过程。决策树不保证全局相同的解决方案。每次构建模型时,树结构都会发生变化。将特定种子传递给 random_state 可确保每次构建模型时生成相同的结果。

答案 2 :(得分:-1)

许多机器学习模型允许模型训练具有一定的随机性。为 random_state 指定一个数字可确保您在每次运行中获得相同的结果。这被认为是一种很好的做法。您使用任何数字,模型质量不会真正取决于您选择的值。