如何使用随机森林分类器确定用于预测类别的特征值范围
Posted
技术标签:
【中文标题】如何使用随机森林分类器确定用于预测类别的特征值范围【英文标题】:How to determine the range of the feature values used to predict a class using Random Forest Classifier 【发布时间】:2019-08-29 12:55:11 【问题描述】:我试图找出随机森林分类器用来预测某个类别的特征值的范围。
例如,我们有 IRIS 数据集;
我使用随机森林分类器根据花的特征来预测一朵花属于哪一类花种,有 4 个特征(萼片长度、萼片宽度、花瓣长度、花瓣宽度)。
我可以找出特征的重要性,并且可以使用 Graphviz 可视化分类器所采取的步骤。现在我想知道范围是多少,例如萼片长度,这将导致预测为 Setosa,即 0.2 到 0.4 之间的花瓣长度表明该物种是 Setosa。我可以使用 Graphviz 直观地查看这些数据,但我想要一种方法来存储它并使用 200 个估计器为我的整个数据集分析它。有没有办法在决策树的下图中以文本方式收集和存储数据;如果花瓣长度
https://images.app.goo.gl/pPK1KsXAMY3z27JW8
我想要一个类似这样的数据框:
node | feature | Samples | Value | Class
--------------------------------------------------------------
1. 1 | sepal-length | 23 | <= 0.2 | Setosa
2. 3 | petal-width | 45 | <= 0.3 | Versicolor
3. ... ... ... ... ...
n. 178 | sepal-width | 3 | <= 0.4 | Setosa
一旦我有了一个数据框,我就可以分析并看到它,例如;一朵 setosa 花的花瓣长度在 0.1 - 0.3 之间,萼片长度在 0.4-0.7 之间,等等
这可能吗?如果是这样,任何想法将不胜感激。
编辑:我查看了每棵树的决策路径,虽然有帮助,但它们不包含预测的类,因此对我想做的事情没有帮助。
我认为我唯一的选择是仅解析从 Graphviz 函数获得的点文件并将信息手动存储到数据框中。
【问题讨论】:
您使用的是什么机器学习库? scikit-learn? 【参考方案1】:scikit-learn 的 RandomForestClassifier
有一个名为 estimators_
的属性,在训练后是一个 DecisionTreeClassifier
实例列表,它们共同构成了森林。
现在我们可以访问各个树,我们来仔细看看DecisionTreeClassifier
实例。每个实例都有一个tree_
属性,其中包含实际的决策树和您感兴趣的所有属性。
scikit-learn 的牛人甚至写了documentation on how to access the tree's properties。
我知道您需要每个节点的多数类,就像在 graphviz 可视化中一样,这不是节点上的标准属性。你提到你可能会解析graphviz的输出,但也许你可以看看graphviz的代码!
如您所见at this line in the node_to_str
function,它们将 argmax 置于定义 here 的 value 变量之上。我认为如果你将它与上面链接的文档结合起来,你应该能够获得每个节点的类!
【讨论】:
感谢您的回复。我已经查看了单个树的决策路径,它们非常有帮助,但是它们缺少有价值的信息,即预测类。基本上我想要 Graphviz 图表上显示的信息 - 只是以文本形式。我想我会尝试通过解析使用 Graphviz 时创建的点文件来做到这一点。 @codiearcher 我已经更新了我的答案,希望对您有所帮助! 谢谢!这是个好主意!实际上,前几天我决定只解析点文件,效果很好,但下次我尝试做某事时,我一定会记得查看实际代码。再次感谢以上是关于如何使用随机森林分类器确定用于预测类别的特征值范围的主要内容,如果未能解决你的问题,请参考以下文章
如何在 Sklearn 的随机森林分类器中将训练模型用于另一个数据集?