决策树中特定类的 Sklearn 决策规则

Posted

技术标签:

【中文标题】决策树中特定类的 Sklearn 决策规则【英文标题】:Sklearn Decision Rules for Specific Class in Decision tree 【发布时间】:2019-03-04 09:57:19 【问题描述】:

我正在创建决策树。我的数据属于以下类型

X1 |X2 |X3|.....X50|Y
_____________________________________
1  |5  |7 |.....0  |1
1.5|34 |81|.....0  |1
4  |21 |21|.... 1  |0
65 |34 |23|.....1  |1

我正在尝试执行以下代码:

X_train = data.iloc[:,0:51]
Y_train = data.iloc[:,51]
clf = DecisionTreeClassifier(criterion = "entropy", random_state = 100,
                           max_depth=8, min_samples_leaf=15)
clf.fit(X_train, y_train)

我想要预测特定类的决策规则(在本例中为“0”)。例如,

when X1 > 4 && X5> 78 && X50 =100 Then Y = 0 ( Probability =84%)
When X4 = 56 && X39 < 100 Then Y = 0 ( Probability = 93%)
...

所以基本上我想要所有的叶节点,附加到它们的决策规则和 Y=0 的概率,那些预测 Y 类 =“0”。我还想以上述指定格式打印这些决策规则。

我对预测 (Y=1) 的决策规则不感兴趣

谢谢,任何帮助将不胜感激

【问题讨论】:

How to extract the decision rules from scikit-learn decision-tree?的可能重复 【参考方案1】:

基于http://scikit-learn.org/stable/auto_examples/tree/plot_unveil_tree_structure.html

假设概率等于每个节点中类的比例,例如 如果叶子包含 68 个 0 类实例和 15 个 1 类实例(即 tree_ 中的 value 为 [68,15]),则概率为 [0.81927711, 0.18072289]

生成一棵简单的树,4 个特征,2 个类:

import numpy as np
from sklearn.tree import DecisionTreeClassifier
from sklearn.datasets import make_classification
from sklearn.cross_validation import train_test_split
from sklearn.tree import _tree

X, y = make_classification(n_informative=3, n_features=4, n_samples=200, n_redundant=1, random_state=42, n_classes=2)
feature_names = ['X0','X1','X2','X3']
Xtrain, Xtest, ytrain, ytest = train_test_split(X,y, random_state=42)
clf = DecisionTreeClassifier(max_depth=2)
clf.fit(Xtrain, ytrain)

可视化它:

from sklearn.externals.six import StringIO  
from sklearn import tree
import pydot 
dot_data = StringIO() 
tree.export_graphviz(clf, out_file=dot_data) 
graph = pydot.graph_from_dot_data(dot_data.getvalue()) [0]
graph.write_jpeg('1.jpeg')

为一个实例创建一个打印条件的函数:

node_indicator = clf.decision_path(Xtrain)
n_nodes = clf.tree_.node_count
feature = clf.tree_.feature
threshold = clf.tree_.threshold
leave_id = clf.apply(Xtrain)


def value2prob(value):
    return value / value.sum(axis=1).reshape(-1, 1)


def print_condition(sample_id):
    print("WHEN", end=' ')
    node_index = node_indicator.indices[node_indicator.indptr[sample_id]:
                                        node_indicator.indptr[sample_id + 1]]
    for n, node_id in enumerate(node_index):
        if leave_id[sample_id] == node_id:
            values = clf.tree_.value[node_id]
            probs = value2prob(values)
            print('THEN Y= (probability=) (values=)'.format(
                probs.argmax(), probs.max(), values))
            continue
        if n > 0:
            print('&& ', end='')
        if (Xtrain[sample_id, feature[node_id]] <= threshold[node_id]):
            threshold_sign = "<="
        else:
            threshold_sign = ">"
        if feature[node_id] != _tree.TREE_UNDEFINED:
            print(
                "%s %s %s" % (
                    feature_names[feature[node_id]],
                    #Xtrain[sample_id,feature[node_id]] # actual value
                    threshold_sign,
                    threshold[node_id]),
                end=' ')

在第一行调用它:

>>> print_condition(0)
WHEN X1 > -0.2662498950958252 && X0 > -1.1966443061828613 THEN Y=1 (probability=0.9672131147540983) (values=[[ 2. 59.]])

在预测值为零的所有行上调用它:

[print_condition(i) for i in (clf.predict(Xtrain) == 0).nonzero()[0]]

【讨论】:

以上是关于决策树中特定类的 Sklearn 决策规则的主要内容,如果未能解决你的问题,请参考以下文章

sklearn实践:决策树

从 SKlearn 决策树中检索决策边界线(x,y 坐标格式)

如何在 sklearn 决策树中显示特征名称?

确定 sklearn 决策树中的拆分数量

如何返回在 sklearn 中由 DecisionTreeClassifier 创建的决策树中使用的特征

如何从 scikit-learn 决策树中提取决策规则?