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.否则,我希望树木每次都或多或少相等,并且在没有大量数据的情况下,我不确定你如何决定哪种随机树最好.
另请参阅:拆分器的源代码
Matt Krause提供的答案并没有完全正确地回答这个问题.
在GitHub上的这个问题中DecisionTreeClassifier解释了在scikit-learn中观察到的行为的原因.
使用默认设置时,每次拆分都会考虑所有功能.这由max_features参数控制,该参数指定每次拆分时应考虑的特征数量.在每个节点处,分类器随机地进行采样max_features而不进行替换(!).
因此,在使用时max_features=n_features,在每次拆分时都考虑所有特征.但是,实现仍将从功能列表中随机抽样(即使这意味着将对所有功能进行采样,在本例中).因此,考虑特征的顺序是伪随机的.如果绑定了两个可能的拆分,则遇到的第一个拆分将用作最佳拆分.
这正是您的决策树每次调用时产生不同结果的原因:所考虑的特征的顺序在每个节点处随机化,并且当两个可能的分裂被绑定时,要使用的分割将取决于考虑哪一个第一.
如前所述,可以使用random_state参数指定用于随机化的种子.
| 归档时间: |
|
| 查看次数: |
4787 次 |
| 最近记录: |