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

sed*_*idw 7 python classification decision-tree scikit-learn

我正在使用分类树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)
Run Code Online (Sandbox Code Playgroud)

r1并且r2对于这个小例子是相同的,但是当我运行我自己的更大的数据集时,我会得到不同的结果.是否会出现这种情况?

编辑在查看一些文档后,我看到它DecisionTreeClassifier有一个random_state控制起点的输入.通过将此值设置为常量,我摆脱了以前遇到的问题.但是现在我担心我的模型不尽如人意.这样做的推荐方法是什么?随便尝试一下?或者预计所有结果大致相同?

Mat*_*use 10

DecisionTreeClassifier工作通过反复拆分训练数据,基于某些特征的值.Scikit-learn实现允许您通过为splitter关键字参数提供值来在几种拆分算法之间进行选择.

  • "最佳"随机选择一个特征,并根据某些标准(您也可以选择;参见方法签名和criterion参数)找到它的"最佳"可能分割.看起来代码执行N_feature次,所以它实际上就像一个引导程序.

  • "随机"选择要随机考虑的特征,如上所述.然而,它还会测试该特征上随机生成的阈值(随机,受限于它在最小值和最大值之间的约束).这可以帮助避免树上的"量化"错误,其中阈值受到训练数据中的确切值的强烈影响.

这两种随机化方法都可以提高树木的性能.Lui,Ting和Fan(2005)KDD论文中有一些相关的实验结果.

如果你每次绝对必须有一个相同的树,那么我将重新使用相同的random_state.否则,我希望树木每次都或多或少相等,并且在没有大量数据的情况下,我不确定你如何决定哪种随机树最好.

另请参阅:拆分器的源代码


eng*_*len 9

Matt Krause提供的答案并没有完全正确地回答这个问题.

在GitHub上的这个问题中DecisionTreeClassifier解释了在scikit-learn中观察到的行为的原因.

使用默认设置时,每次拆分都会考虑所有功能.这由max_features参数控制,该参数指定每次拆分时应考虑的特征数量.在每个节点处,分类器随机地进行采样max_features而不进行替换(!).

因此,在使用时max_features=n_features,在每次拆分时都考虑所有特征.但是,实现仍将从功能列表中随机抽样(即使这意味着将对所有功能进行采样,在本例中).因此,考虑特征的顺序是伪随机的.如果绑定了两个可能的拆分,则遇到的第一个拆分将用作最佳拆分.

这正是您的决策树每次调用时产生不同结果的原因:所考虑的特征的顺序在每个节点处随机化,并且当两个可能的分裂被绑定时,要使用的分割将取决于考虑哪一个第一.

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

  • 有点,但不完全是。作为用户,您“期望”使用“splitter=random”进行分割时会出现随机行为,但在使用“splitter=best”时可能不会有那么多随机行为。这是要回答的主要问题。这里的随机化来自这样一个事实:即使当 max_features=n_features 时,它们也是随机采样的(没有替换)。在您的答案中,您声明“最佳”随机选择一个特征并为其找到“最佳”可能的分割”,即使事实并非如此:它考虑“max_features”随机特征,并选择最佳可能的分割。 (2认同)