利用Scikit-learn中的决策树分类+结果可视化(graphviz)展示


1. 决策树(Decision Tree)简介

1.1 决策树的原理(参考

决策树是属于机器学习监督学习算法中比较简单的一种,决策树是一个预测模型;其代表的是对象属性与对象值之间的一种映射关系。树中每个节点表示某个对象,而每个分叉路径则代表的某个可能的属性值,而每个叶结点则对应从根节点到该叶节点所经历的路径所表示的对象的值。决策树仅有单一输出,若欲有复数输出,可以建立独立的决策树以处理不同输出。

1.2决策树算法:ID3,C4.5,C5.0,CART

ID3是由Ross Quinlan在1985年建立的。这个方法建立多路决策树,并找到最大的信息增益。当树长到最大的尺寸,经常应用剪枝来提高决策树对未知数据的一般化。

C4.5是ID3的进一步延伸,通过将连续属性离散化,去除了特征的限制。C4.5将训练树转换为一系列if-then的语法规则。可确定这些规则的准确性,从而决定哪些应该被采用。如果去掉某项规则,准确性能提高,则应该实行修剪。

C5.0较C4.5使用更小的内存,建立更小的决策规则,更加准确。

CART和C4.5很相似,但是它支持数值的目标变量(回归)且不产生决策规则。CART使用特征和阈值在每个节点获得最大的信息增益来构建决策树。

scikit-learn使用一个最佳的CART算法。

1.3决策树:优势和劣势

优势:

  • 简单易懂,原理清晰,决策树可以实现可视化。
  • 数据准备简单。其他的方法需要实现数据归一化,创建虚拟变量,删除空白变量。(注意:这个模块不支持缺失值)
  • 使用决策树的代价是数据点的对数级别。
  • 能够处理数值和分类数据。
  • 能够处理多路输出问题。
  • 使用白盒子模型(内部结构可以直接观测的模型)。一个给定的情况是可以观测的,那么就可以用布尔逻辑解释这个结果。相反,如果在一个黑盒模型(ANN),结果可能很难解释。
  • 可以通过统计学检验验证模型。这也使得模型的可靠性计算变得可能。
  • 即使模型假设违反产生数据的真实模型,表现性能依旧很好。

劣势:

  • 可能会建立过于复杂的规则,即过拟合。为避免这个问题,剪枝、设置叶节点的最小样本数量、设置决策树的最大深度有时候是必要的。
  • 决策树有时候是不稳定的,因为数据微小的变动,可能生成完全不同的决策树。 可以通过总体平均(ensemble)减缓这个问题。应该指的是多次实验。
  • 学习最优决策树是一个NP完全问题。所以,实际决策树学习算法是基于试探性算法,例如在每个节点实现局部最优值的贪心算法。这样的算法是无法保证返回一个全局最优的决策树。可以通过随机选择特征和样本训练多个决策树来缓解这个问题。
  • 有些问题学习起来非常难,因为决策树很难表达。如:异或问题、奇偶校验或多路复用器问题
  • 如果有些因素占据支配地位,决策树是有偏的。因此建议在拟合决策树之前先平衡数据的影响因子。

2. 基于Scikit-learn中决策树的分类(完整源程序下载!

2.1 需求模块

为了决策树结果的可视化,需安装安装graphviz模块:
pip install graphviz
需要注意的是,直接安装后模块并没有加入系统路径,运行中抛出错误:

graphviz.backend.ExecutableNotFound: failed to execute ['dot', '-Tpdf', '-O', '/Users/10321/Desktop/iris'], make sure the Graphviz executables are on your systems' PATH

解决方法参考:

  • python安装Graphviz及其应用
  • 使用Graphviz快速绘制流程图
  • graphviz pip安装成功后,调用时报错的解决办法
  • 2.2 决策树分类:iris数据集

    Scikit-learn中的决策树能够实现二进制分类和多分类。我们以iris数据集为例。
    (1)导入必须模块

    1
    2
    3
    4
    5
    6
    7
    8
    9
    import numpy as np
    import graphviz
    from sklearn import datasets
    from sklearn import tree
    from sklearn.metrics import confusion_matrix, accuracy_score
    from sklearn.cross_validation import train_test_split

    #Set random seed / 设定种子,保证结果复现性
    np.random.seed(1)

    (2)数据准备

    1
    2
    3
    4
    5
    6
    7
    8
    #Load the data / 导入数据
    #iris.data = [(Sepal Length, Sepal Width, Petal Length, Petal Width)]
    iris_dataset = datasets.load_iris()
    x = iris_dataset.data
    y = iris_dataset.target

    #Split data into train/test sets / 分割数据为训练集和测试集
    x_train, x_test, y_train, y_test = train_test_split(x, y, test_size=0.2)

    (3)模型训练与测试

    1
    2
    3
    4
    5
    6
    7
    #创建决策树模型,并训练拟合
    model_clf = tree.DecisionTreeClassifier()
    model_clf.fit(x_train, y_train)

    #测试集分类预测与分类概率预测
    pred = model_clf.predict(x_test)
    prob = model_clf.predict_proba(x_test)

    (4)结果输出与可视化分析

    1
    2
    3
    4
    #结果打印
    print('################ Validation/模型验证 ################')
    print('Confusion Matrix/混淆矩阵:\n', confusion_matrix(y_test, pred))
    print('Accuracy/准确率:\n', round(accuracy_score(y_test, pred),3))

    打印出测试结果,可以看到准确率达到96.7%,效果不错!

    ################ Validation/模型验证 ################
    Confusion Matrix/混淆矩阵:
    [[11 0 0]
    [ 0 12 1]
    [ 0 0 6]]
    Accuracy/准确率:
    0.967

    接着,将训练决策树模型结果可视化。

    1
    2
    3
    4
    5
    6
    7
    8
    #决策树模型数据保存与可视化
    dot_data = tree.export_graphviz(model_clf, out_file=None,
                             feature_names=iris_dataset.feature_names,<br />
                             class_names=iris_dataset.target_names,<br />
                             filled=True, rounded=True,<br />
                             special_characters=True)
    graph = graphviz.Source(dot_data)
    graph.render("/Users/10321/Desktop/iris") # 保存决策树训练结果图

    决策树图如下:

    决策树分类

    完整源程序下载!

    参考文献

    1. http://scikit-learn.org/stable/modules/tree.html
    2. Scikit-learn中的决策树
    3. 三种决策树算法(ID3, CART, C4.5)及Python实现

    进化学习团队将会根据大家意见和建议持续修改、维护与更新。转载请注明出处!

    赞赏

    微信赞赏支付宝赞赏

    Have any Question or Comment?

    发表评论

    电子邮件地址不会被公开。 必填项已用*标注

    分类目录

    博客统计

    • 14,394 点击次数