决策树之graphviz的使用

创建一颗树,使用红酒数据集

from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import pandas as pd
wine = load_wine()
#input(wine.target)
pd.concat([pd.DataFrame(wine.data),pd.DataFrame(wine.target)],axis=1) #将它变成一个表格
#input(wine.feature_names)
Xtrain,Xtest,Ytrain,Ytest=train_test_split(wine.data,wine.target,test_size=0.3) 
#input(Xtrain.shape)
clf=tree.DecisionTreeClassifier(criterion="entropy")
clf=clf.fit(Xtrain,Ytrain)
score=clf.score(Xtest,Ytest)

tree.DecisionTreeClassifier()函数的参数如下:

  • criterion:衡量分割质量的准则,可选参数,默认为"gini"。可选的值有"gini"和"entropy"。如果设置为"gini",则使用基尼不纯度作为分割准则;如果设置为"entropy",则使用信息增益作为分割准则。
  • splitter:选择分割特征的策略,可选参数,默认为"best"。可选的值有"best"和"random"。如果设置为"best",则选择最佳的分割特征;如果设置为"random",则随机选择分割特征。
  • max_depth:决策树的最大深度,可选参数,默认为None。如果设置为None,则决策树将被完全展开。
  • min_samples_split:分割内部节点所需的最小样本数,可选参数,默认为2。如果一个节点的样本数少于min_samples_split,则不会再进行分割。
  • min_samples_leaf:叶节点所需的最小样本数,可选参数,默认为1。如果一个叶节点的样本数少于min_samples_leaf,则该叶节点将被剪枝。
  • min_weight_fraction_leaf:叶节点所需的最小加权样本数的总和的比例,可选参数,默认为0。如果一个叶节点的加权样本数的总和的比例小于min_weight_fraction_leaf,则该叶节点将被剪枝。
  • max_features:寻找最佳分割时要考虑的特征数量,可选参数,默认为None。如果设置为None,则考虑所有特征;如果设置为"sqrt",则考虑\sqrt{n}n​个特征;如果设置为"log2",则考虑\log_2(n)log2​(n)个特征;如果设置为整数值nn,则考虑nn个特征;如果设置为"auto",则与"sqrt"相同;如果设置为"None"或"auto",则将max_features设置为nn。
  • random_state:随机数种子,可选参数,默认为None。如果设置为整数值,则每次运行时都会得到相同的结果。
  • max_leaf_nodes:叶节点的最大数量,可选参数,默认为None。如果设置为None,则不限制叶节点的数量。
  • min_impurity_decrease:分割节点的不纯度减少量的阈值,可选参数,默认为0。如果分割节点后的不纯度减少量小于min_impurity_decrease,则该分割将被丢弃。
  • class_weight:类别权重,可选参数,默认为None。可以使用字典或"balanced"来指定类别的权重。如果设置为None,则所有类别的权重都为1。
  • presort:是否预先排序数据以加速训练,可选参数,默认为False。如果设置为True,则在训练过程中会预先排序数据。   

     clf的四个重要接口

    clf.fit
    clf.score
    clf.apply(XtestP)
    clf.predict(Xtest)

    使用graphviz 画一颗树

    import graphviz
    a=["1","2","3","4","5","6","7","8","9","10","11","12","13"]    #命名特征,数量要与实际一致
    dot_data=tree.export_graphviz(
                                  clf
                                 ,feature_names=None
                                 ,class_names=["a","b","c"]
                                 ,filled=True
                                 ,rounded=True
    )
    graph=graphviz.Source(dot_data)               #创建一个图形对象
    graph.view()                                  #绘制决策树
    data = [*zip(a, clf.feature_importances_)]    #将一列一列输出每一个特征是否使用及其重要程度
    for column in data:
        print(column)

    tree.export_graphviz()函数的参数如下:

    • decision_tree:决策树模型对象,必需参数。
    • out_file:输出文件的路径或文件对象,可选参数,默认为None。如果设置为None,则输出结果将作为字符串返回,而不是写入文件。
    • max_depth:决策树的最大深度,可选参数,默认为None。如果设置为None,则决策树将被完全展开。
    • feature_names:特征的名称列表,可选参数,默认为None。如果设置为None,则特征将以整数形式显示。
    • class_names:类别的名称列表,可选参数,默认为None。如果设置为None,则类别将以整数形式显示。
    • filled:是否给节点着色,可选参数,默认为False。如果设置为True,则节点将根据类别进行着色。
    • rounded:是否给节点添加圆角边框,可选参数,默认为False。如果设置为True,则节点将带有圆角边框。