我正在使用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和Fan's(2005)KDD论文中有一些相关的实验结果。
如果您绝对必须每次都有一棵相同的树,那么我将重复使用相同的Random_State。否则,我希望每次树木或多或少地等效地,并且在没有大量持有的数据的情况下,我不确定如何确定哪种随机树是最好的。
另请参见:分离器的源代码
马特·克劳斯(Matt Krause)提供的答案不能完全正确回答问题。
在github上,在本期中解释了Scikit-Learn的DecisionTreeClassifier
中观察到的行为的原因。
使用默认设置时,在每个拆分时都会考虑所有功能。这是由max_features
参数约束的,该参数指定在每个拆分时应考虑多少个功能。在每个节点上,分类器随机示例max_features
无替换(!)。
因此,当使用max_features=n_features
时,在每个拆分时都会考虑所有功能。但是,实现仍然将从功能列表中随机采样(即使这意味着所有功能都将被采样,在这种情况下)。因此,考虑特征的顺序是伪随机。如果将两个可能的拆分绑在一起,则遇到的第一个将用作最佳分裂。
这正是您的决策树每次调用时都会产生不同结果的原因:所考虑的功能的顺序是在每个节点处随机分配的,然后当绑定两个可能的拆分时,使用的拆分将取决于哪个
被认为是一个。如前所述,可以使用random_state
参数指定用于随机化的种子。
在每次拆分时始终将功能随机置换。因此,即使使用相同的训练数据和max_features = n_features,最佳发现的分裂也可能会有所不同,如果标准的改进在搜索最佳拆分过程中列举了几个拆分。要在拟合期间获得确定性行为,必须固定随机_STATE。
来源:http://scikit-learn.org/stable/modules/generated/sklearn.tree.decisiontreeclassifier.html#sklearn.tree.decisiontreecleecleeclaleclalsififier#notes
我对sklearn
一无所知,但是...
我猜DecisionTreeClassifier
有一些内部状态,由fit
创建,该状态仅更新/扩展。
您应该创建一个新的?