我使用的是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
是相同的,但是当我在自己更大的数据集上运行时,结果会有所不同。有什么理由会发生这种情况吗?编辑在研究了一些文档之后,我发现
DecisionTreeClassifier
具有输入random_state
来控制起点。通过将此值设置为常数,我摆脱了以前遇到的问题。但是现在我担心我的模型没有达到最佳状态。建议这样做的方法是什么?随机尝试一些吗?还是所有结果都预期大致相同? 最佳答案
DecisionTreeClassifier
通过基于某些功能的值重复分割训练数据来工作。通过Scikit-learn实现,您可以通过为splitter
关键字参数提供值来在几种拆分算法之间进行选择。
criterion
参数)随机选择一个功能并为其找到“最佳”可能的分割。看起来代码执行了N_feature次,因此实际上就像一个 bootstrap 。 这两种随机方法都可以提高树的性能。 Lui, Ting, and Fan's (2005) KDD paper中有一些相关的实验结果。
如果每次您绝对必须有一棵相同的树,那么我将重用相同的random_state。否则,我希望这些树每次都能或多或少地等效,并且在没有大量保留数据的情况下,我不确定如何确定哪棵随机树是最佳的。
另请参阅:Source code for the splitter
关于python - sklearn中的分类树给出不一致的答案,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21391429/