Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/python/360.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Python sklearn中的分类树给出不一致的答案_Python_Classification_Scikit Learn_Decision Tree - Fatal编程技术网

Python sklearn中的分类树给出不一致的答案

Python sklearn中的分类树给出不一致的答案,python,classification,scikit-learn,decision-tree,Python,Classification,Scikit Learn,Decision Tree,我正在使用sklearn中的分类树,当我使用相同的数据对模型进行两次训练,并使用相同的测试数据进行预测时,我会得到不同的结果。我试着在一个更小的虹膜数据集上进行复制,结果正如预期的那样。这里有一些代码 from sklearn import tree from sklearn.datasets import iris clf = tree.DecisionTreeClassifier() clf.fit(iris.data, iris.target) r1 = clf.predict_prob

我正在使用
sklearn
中的分类树,当我使用相同的数据对模型进行两次训练,并使用相同的测试数据进行预测时,我会得到不同的结果。我试着在一个更小的虹膜数据集上进行复制,结果正如预期的那样。这里有一些代码

from sklearn import tree
from sklearn.datasets import iris

clf = tree.DecisionTreeClassifier()
clf.fit(iris.data, iris.target)
r1 = clf.predict_proba(iris.data)

clf.fit(iris.data, iris.target)
r2 = clf.predict_proba(iris.data)
r1
r2
对于这个小示例是相同的,但是当我在自己的大得多的数据集上运行时,会得到不同的结果。发生这种情况的原因是什么


EDIT查看一些文档后,我发现
DecisionTreeClassifier
有一个控制起点的输入
random\u state
。通过将该值设置为常量,我消除了以前遇到的问题。然而,现在我担心我的模型并没有达到最佳状态。推荐的方法是什么?随便尝尝?或者所有的结果都是一样的吗?

我对sklearn一无所知,但是

我猜
DecisionTreeClassifier
有一些内部状态,由
fit
创建,它只会得到更新/扩展


您应该创建一个新的吗?

DecisionTreeClassifier根据某些功能的值重复分割训练数据。Scikit学习实现允许您通过为
splitter
关键字参数提供一个值,在几种分割算法之间进行选择

  • “最佳”随机选择一个功能,并根据某些标准(您也可以选择;请参阅方法签名和
    标准
    参数)为其找到“最佳”可能的分割。看起来代码在N_特性时间内完成了这项工作,所以它实际上非常像一个引导程序

  • P>随机选取特征,如上所述。然而,它也会在该特性上测试随机生成的阈值(随机,受其最小值和最大值之间的约束)。这可能有助于避免树上的“量化”错误,其中阈值受到训练数据中精确值的强烈影响

这两种随机化方法都可以提高树的性能。文中给出了一些相关的实验结果

如果每次都必须有一个相同的树,那么我会重复使用相同的随机状态。否则,我希望每一次树的结果都或多或少是相等的,并且,在没有大量数据的情况下,我不确定如何确定哪一个随机树是最好的


另请参见:

马特·克劳斯提供的答案并不完全正确

scikit learn的决策树分类程序中观察到的行为的原因在中进行了解释

使用默认设置时,在每次拆分时都会考虑所有要素。这由
max_features
参数控制,该参数指定在每次拆分时应考虑多少个特征。在每个节点上,分类器随机采样
max_特征
,无需替换(!)

因此,当使用
max_features=n_features
时,在每次拆分时都会考虑所有特征。但是,实现仍然会从特性列表中随机抽样(即使这意味着在这种情况下,所有特性都将被抽样)因此,考虑特征的顺序是伪随机的。如果两个可能的拆分并列,则遇到的第一个拆分将用作最佳拆分。

这正是决策树每次调用时产生不同结果的原因:在每个节点上考虑的特征顺序是随机的,当两个可能的拆分被绑定时,要使用的拆分将取决于首先考虑的是哪一个

如前所述,可使用
random_state
参数指定用于随机化的种子

每次分割时,特征总是随机排列。因此,即使使用相同的训练数据和max_features=n_features,如果在搜索最佳分割期间枚举的多个分割的标准改进是相同的,则最佳分割可能会有所不同。为了在拟合过程中获得确定性行为,必须固定随机_状态


资料来源:

我认为我的回答中的“随机选择一项功能”和“随机选择一项功能”涵盖了这一点。有点,但不完全。作为用户,您希望在使用
splitter=random
进行拆分时会出现随机行为,但在使用
splitter=best
时可能不会有太多。这是需要回答的主要问题。这里的随机性来自这样一个事实,即即使当
max_features=n_features
时,它们也是随机抽样的(不需要替换)。在您的回答中,您声明“最佳”随机选择一个功能,并为其找到“最佳”可能的分割,即使情况并非如此:它考虑了
max\u功能
random功能,并选择最佳可能的分割。