使用 dtreeviz 可视化决策树

Ran*_*ger 4 python visualization scikit-learn dtreeviz

我喜欢Dtreeviz 库 - GitHub 中提供的决策树可视化,并且可以使用

# Install libraries
!pip install dtreeviz
!apt-get install graphviz

# Sample code
from sklearn.datasets import *
from sklearn import tree
from dtreeviz.trees import *
from IPython.core.display import display, HTML

classifier = tree.DecisionTreeClassifier(max_depth=4)
cancer = load_breast_cancer()

classifier.fit(cancer.data, cancer.target)
viz = dtreeviz(classifier,
               cancer.data,
               cancer.target,
               target_name='cancer',
               feature_names=cancer.feature_names, 
               class_names=["malignant", "benign"],
               fancy=False) 

display(HTML(viz.svg()))
Run Code Online (Sandbox Code Playgroud)

但是,当我将上述内容应用于我自己制作的 dtree 时,代码会爆炸,因为我的数据位于 pandas DF(或 np 数组)中,而不是 scikit-learn 对象中。

现在,在Sci-kit 学习 - 如何创建一个 Bunch 对象,他们非常严厉地告诉我不要尝试创建一个 Bunch对象;但我也没有技能将我的 DF 或 NP 数组转换为上面的 viz 函数可以接受的东西。

我们可以假设我的 DF 有九个特征和一个目标,称为“Feature01”、“Feature02”等和“Target01”。

这我通常会这样拆分

FeatDF  = FullDF.drop( columns = ["Target01"])
LabelDF = FullDF["Target01"]
Run Code Online (Sandbox Code Playgroud)

然后以我的快乐方式来分配分类器,或者如果是 ML,则创建一个测试/训练拆分。

在调用时这些都没有帮助dtreeviz- 期待诸如“feature_names”之类的东西(我认为它包含在“bunch”对象中)。而且由于我无法将我的 DF 转换为一堆,所以我很困惑。哦,请带上你的智慧。

更新:我想任何简单的 DF 都会说明我的难题。我们可以摇摆不定

import pandas as pd

Things = {'Feature01': [3,4,5,0], 
          'Feature02': [4,5,6,0], 
          'Feature03': [1,2,3,8], 
          'Target01': ['Red','Blue','Teal','Red']}
DF = pd.DataFrame(Things,
                  columns= ['Feature01', 'Feature02', 
                            'Feature02', 'Target01']) 
Run Code Online (Sandbox Code Playgroud)

以DF为例。现在,我会不会去

DataNP = DF.to_numpy()
classifier.fit(DF.data, DF.target)
feature_names = ['Feature01', 'Feature02', 'Feature03'] 
#..and what if I have 50 features...

viz = dtreeviz(classifier,
               DF.data,
               DF.target,
               target_name='Target01',
               feature_names=feature_names, 
               class_names=["Red", "Blue", "Teal"],
               fancy=False) 
Run Code Online (Sandbox Code Playgroud)

或者这是愚蠢的?感谢您到目前为止的指导!

Max*_*ers 6

  • sklearn 的决策树需要数值目标值
  • 您可以使用 sklearnLabelEncoder将字符串转换为整数

    from sklearn import preprocessing
    
    label_encoder = preprocessing.LabelEncoder()
    label_encoder.fit(df.Target01)
    
    df['target'] = label_encoder.transform(df.Target01)
    
    Run Code Online (Sandbox Code Playgroud)
  • dtreeviz期望class_names是一个listor dict,所以让我们从我们的label_encoder

    class_names = list(label_encoder.classes_)        
    
    Run Code Online (Sandbox Code Playgroud)

完整代码

import pandas as pd
from sklearn import preprocessing, tree
from dtreeviz.trees import dtreeviz

Things = {'Feature01': [3,4,5,0], 
          'Feature02': [4,5,6,0], 
          'Feature03': [1,2,3,8], 
          'Target01': ['Red','Blue','Teal','Red']}
df = pd.DataFrame(Things,
                  columns= ['Feature01', 'Feature02', 
                            'Feature02', 'Target01']) 

label_encoder = preprocessing.LabelEncoder()
label_encoder.fit(df.Target01)
df['target'] = label_encoder.transform(df.Target01)

classifier = tree.DecisionTreeClassifier()
classifier.fit(df.iloc[:,:3], df.target)

dtreeviz(classifier,
         df.iloc[:,:3],
         df.target,
         target_name='toy',
         feature_names=df.columns[0:3],
         class_names=list(label_encoder.classes_)
         )
Run Code Online (Sandbox Code Playgroud)

在此处输入图片说明


旧答案

让我们使用癌症数据集来创建 Pandas 数据框

df = pd.DataFrame(cancer.data, columns=cancer.feature_names)
df['target'] = cancer.target
Run Code Online (Sandbox Code Playgroud)

这为我们提供了以下数据框。

mean radius mean texture    mean perimeter  mean area   mean smoothness mean compactness    mean concavity  mean concave points mean symmetry   mean fractal dimension  radius error    texture error   perimeter error area error  smoothness error    compactness error   concavity error concave points error    symmetry error  fractal dimension error worst radius    worst texture   worst perimeter worst area  worst smoothness    worst compactness   worst concavity worst concave points    worst symmetry  worst fractal dimension target
0   17.99   10.38   122.8   1001.0  0.1184  0.2776  0.3001  0.1471  0.2419  0.07871 1.095   0.9053  8.589   153.4   0.006399    0.04904 0.05373 0.01587 0.03003 0.006193    25.38   17.33   184.6   2019.0  0.1622  0.6656  0.7119  0.2654  0.4601  0.1189  0
1   20.57   17.77   132.9   1326.0  0.08474 0.07864 0.0869  0.07017 0.1812  0.05667 0.5435  0.7339  3.398   74.08   0.005225    0.01308 0.0186  0.0134  0.01389 0.003532    24.99   23.41   158.8   1956.0  0.1238  0.1866  0.2416  0.186   0.275   0.08902 0
2   19.69   21.25   130.0   1203.0  0.1096  0.1599  0.1974  0.1279  0.2069  0.05999 0.7456  0.7869  4.585   94.03   0.00615 0.04006 0.03832 0.02058 0.0225  0.004571    23.57   25.53   152.5   1709.0  0.1444  0.4245  0.4504  0.243   0.3613  0.08758 0
[...]
568 7.76    24.54   47.92   181.0   0.05263 0.04362 0.0 0.0 0.1587  0.05884 0.3857  1.428   2.548   19.15   0.007189    0.00466 0.0 0.0 0.02676 0.002783    9.456   30.37   59.16   268.6   0.08996 0.06444 0.0 0.0 0.2871  0.07039 1
Run Code Online (Sandbox Code Playgroud)

对于您的分类器,它可以按以下方式使用。

classifier.fit(df.iloc[:,:-1], df.target)
Run Code Online (Sandbox Code Playgroud)

即只取最后一列作为训练/输入,将target列作为输出/目标。

可视化也一样:

viz = dtreeviz(classifier,
               df.iloc[:,:-1],
               df.target,
               target_name='cancer',
               feature_names=df.columns[0:-1],
               class_names=["malignant", "benign"]) 
Run Code Online (Sandbox Code Playgroud)