对random_state
参数感到困惑,不确定为什么决策树训练需要一些随机性。我的想法如下:
- 它是否与随机森林有关?
- 它是否与分割训练测试数据集有关?如果是,为什么不直接使用训练测试分割方法(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_irisfrom sklearn.cross_validation import cross_val_scorefrom sklearn.tree import DecisionTreeClassifierclf = 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. ])
回答:
这在文档中有解释
学习最优决策树的问题已知在多种最优性方面是NP完全的,即使对于简单的概念也是如此。因此,实际的决策树学习算法基于启发式算法,如在每个节点上做出局部最优决策的贪婪算法。这些算法无法保证返回全局最优的决策树。这可以通过在集成学习器中训练多个树来缓解,其中特征和样本是随机抽样并替换的。
因此,基本上,一个次优的贪婪算法会使用随机选择的特征和样本重复多次(这与随机森林中使用的技术类似)。random_state
参数允许控制这些随机选择。
接口文档明确指出:
如果是整数,random_state 是随机数生成器使用的种子;如果是 RandomState 实例,random_state 是随机数生成器;如果是 None,随机数生成器是 np.random 使用的 RandomState 实例。
因此,随机算法在任何情况下都会被使用。传递任何值(无论是特定的整数,例如0,还是RandomState
实例),都不会改变这一点。传递整数值(0或其他)的唯一理由是使结果在调用之间保持一致:如果你使用random_state=0
(或任何其他值)调用它,那么每次都会得到相同的结果。