Python scikit学习使用的CART算法是否确定?

Python scikit学习使用的CART算法是否确定?,python,scikit-learn,decision-tree,Python,Scikit Learn,Decision Tree,我从scikit学习网站获得以下代码: import numpy as np from sklearn.datasets import load_iris from sklearn.model_selection import cross_val_score from sklearn.tree import DecisionTreeClassifier iris = load_iris() for i in range(10): clf = DecisionTreeClassifier(

我从scikit学习网站获得以下代码:

import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
for i in range(10):
    clf = DecisionTreeClassifier()    
    a = cross_val_score(clf, iris.data, iris.target, cv=10)
    clf2 = DecisionTreeClassifier()    
    b = cross_val_score(clf2, iris.data, iris.target, cv=10)
    if not np.array_equal(a,b):
        print 'diff'
        print a
        print b
        break

它有时会打印差异,所以我猜它不是确定性的,这很奇怪。

决策树是确定性的,它们计算相同原始数据集上的叶子/概率。如果你要使用像随机森林这样的东西,那就不是确定性的,因为它是随机选择变量的。问题在于你的平等测试。您正在使用

object1==object2

Python本身不知道如何比较DecisionTreeClassifier的类型。您是否询问是否为其属性指定了相同的值?您想知道内存大小是否相同吗?dt和dt2指针引用同一个对象吗?没有办法从你写的东西中知道。更好的测试是训练模型并对相同的数据使用.predict()方法。每次的结果都一样吗?那么您可能有一个确定性分类器


“pythonic”方法是在类文件中定义一个_u; eq _;方法。如果你看一下,你会发现tree类中没有一个——我没有进一步看,但我怀疑他们是否定义了这个方法。(检查两个分类器模型是否等效不是一件常见的事情)。

好的,我发现如果未指定
random\u state
参数,则
DecisionTreeClassifier
会使用随机种子,如下所述:

随机_状态:int,随机状态实例或无,可选 (默认值=无)如果int,则random_state是随机进程使用的种子 数字发生器;如果为RandomState实例,则random_state为random 数字发生器;如果没有,则随机数生成器为 np.random使用的RandomState实例

固定代码:(我已将
random\u state=0
添加到
DecisionTreeClassifier
构造函数)


这就像预期的那样工作,
np.array_equal(a,b)==True
总是这样。

你是对的,我将根据Jack的情况更改示例,我很高兴你找到了
random_state
参数,但据我所知,如果
max_features==None
splitter!='随机'
。由于这是默认情况,我对随机性来自何处感到困惑,因为默认购物车应该是确定性的。我认为应该在
sklearn
github页面上打开一个问题来解决这个问题。我在这里打开了这个问题:
import numpy as np
from sklearn.datasets import load_iris
from sklearn.model_selection import cross_val_score
from sklearn.tree import DecisionTreeClassifier
iris = load_iris()
for i in range(10):
    clf = DecisionTreeClassifier(random_state=0)    
    a = cross_val_score(clf, iris.data, iris.target, cv=10)
    clf2 = DecisionTreeClassifier(random_state=0)    
    b = cross_val_score(clf2, iris.data, iris.target, cv=10)
    if not np.array_equal(a,b):
        print 'diff'
        print a
        print b
        break