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_特性时间内完成了这项工作,所以它实际上非常像一个引导程序标准
另请参见:马特·克劳斯提供的答案并不完全正确 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功能,并选择最佳可能的分割。