我使用的是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)

对于这个小例子,r1r2是相同的,但是当我在自己更大的数据集上运行时,结果会有所不同。有什么理由会发生这种情况吗?

编辑在研究了一些文档之后,我发现DecisionTreeClassifier具有输入random_state来控制起点。通过将此值设置为常数,我摆脱了以前遇到的问题。但是现在我担心我的模型没有达到最佳状态。建议这样做的方法是什么?随机尝试一些吗?还是所有结果都预期大致相同?

最佳答案

DecisionTreeClassifier通过基于某些功能的值重复分割训练数据来工作。通过Scikit-learn实现,您可以通过为splitter关键字参数提供值来在几种拆分算法之间进行选择。

  • “最佳”将根据某些条件(您也可以选择;请参见方法签名和criterion参数)随机选择一个功能并为其找到“最佳”可能的分割。看起来代码执行了N_feature次,因此实际上就像一个 bootstrap 。
  • 如上所述,
  • “random”随机选择要考虑的特征。但是,它还会在该功能上测试随机生成的阈值(随机性,但要受其最小值和最大值之间的约束)。这可以帮助避免在阈值受训练数据中的精确值强烈影响的树上发生“量化”错误。

  • 这两种随机方法都可以提高树的性能。 Lui, Ting, and Fan's (2005) KDD paper中有一些相关的实验结果。

    如果每次您绝对必须有一棵相同的树,那么我将重用相同的random_state。否则,我希望这些树每次都能或多或少地等效,并且在没有大量保留数据的情况下,我不确定如何确定哪棵随机树是最佳的。

    另请参阅:Source code for the splitter

    关于python - sklearn中的分类树给出不一致的答案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21391429/

    10-12 16:37