【数据分析&数据挖掘】决策树

0.决策树整理

0.0 文章索引
  • 0.建议根据个人需要和实际情况调整各个小节的阅读顺序;
  • 1.Python-sklearn使用:调用sklearn已有工具包实现应用;
    • 1.1过程描述;1.2代码;1.3案例练习;
  • 2.书籍案例介绍:《数据挖掘——你必须知道的32个经典案例(第2版)》;
  • 3.其他。

1.Python-sklearn使用

1.1 过程描述

1.1.1 核心步骤

  • 模型初始化–DecisionTreeClassifier();
  • 模型训练–fit(x_train, y_train);
  • 模型预测评价–score(x, y)、predict(x)、apply(x)。
  • fit()、apply()、predict()、score()四个主要掌握的函数,具体解释在代码中有。

1.1.2 程序流程解释

  • 导入必要的模块:(1)sklearn.tree用于调用决策树类;(2)sklearn.datasets导入自带的测试用数据集;(3)sklearn.model_selection.train_test_split()用于划分训练、测试集;(4)graphviz用于可视化决策树–需要自行官网安装、环境变量配置。
  • 通过load_wine()导入酒数据集:获取特征数据、标签数据、特征列名和标签列名的属性列在代码里。
  • 通过train_test_split()划分数据集:分别传入特征数据、标签数据、训练集(或测试集)所占比例、random_state(限定随机性,即种子不变随机结果固定的知识点)。
  • 初始化决策树对象:clf = tree.DecisionTreeClassifier(),其中传入参数criterion可选gini或entropy;splitter和random_state消除决策树生成的随机性(设置该参数后,其他条件不变的情况下,可以保证每次运行结果不变);其他参数(如剪枝作用的参数)在代码中有介绍。
  • 训练分类器:clf = clf.fit(x_train, y_train)。
  • 评价模型:clf.score(x_test, y_test)评价测试集accuracy效果–若传入x_train和y_train则得到模型在训练集上的表现;其他评价指标如查全率、查准率等也可以通过sklearm.metrics中的函数得到,暂不赘述。
  • 模型预测:predict(x_test)函数得到的是特定特征数据下的预测标签值–尽管不调用这个函数也能实现模型评价,但是预测函数在很多场景下也是必要的。
  • 可视化、特征重要性:graphviz的使用见代码;特征重要性可以通过模型的属性clf.feature_importances_进行调用。
  • 其他:zip()函数可以将两个可迭代对象按照对应位置元素打包成元组,返回元组组成的列表,但是数据类型依然为zip无法直接print()打印,因此可以使用list()函数先将其转化为列表再打印;x_train.shape返回列表数据的行列数。
1.2 代码
  • 主要来自于菜菜的sklearn课堂-看视频跟着敲的;
  • 推荐一下:菜菜TsaiTsai-哔哩哔哩。
# 导入模块
from sklearn import tree
from sklearn.datasets import load_wine
from sklearn.model_selection import train_test_split
import graphviz


def main():
    wine = load_wine()
    # wine.data  特征数据
    # wine.target  标签数据
    # wine.feature_names  特征列名
    # wine.target_names  标签列名
    """将数据转为pandas中的dataframe类型
        import pandas as pd
        pd.concat([pd.DataFrame(wine.data), pd.DataFrame(wine.target)], axis=1)
    """
    x_train, x_test, y_train, y_test = train_test_split(wine.data, wine.target, test_size=0.3, random_state=1)
    print(y_train.dtype)
    # x_train.shape  训练集的行列大小
    """
        sklearn调用三部曲:1.初始化模型;2.训练模型;3.获取结果;
        需要注意的是:
        1.决策树的生成具有一定的随机性,因此可以通过random_state以及splitter调整随机性;
        2.剪枝:通过设置max_depth(限定决策树最深层数), 
                        min_samples_leaf(限定属于叶子节点的样本量)
                        以及min_samples_split(限定分出分支的样本量条件)
                        等参数进行;
    """
    clf = tree.DecisionTreeClassifier(criterion="entropy",
                                      random_state=30,
                                      splitter="random",
                                      max_depth=3)  # 初始化分类器 clf=classifier
    clf = clf.fit(x_train, y_train)  # 训练分类器
    score = clf.score(x_test, y_test)  # 导出结果,返回accuracy(测试集上的表现)
    # 也可以输出在训练集上的表现:score_train = clf.score(x_train, y_train)
    print(score)
    # 除了fit,score函数以外,apply以及predit也是重要的接口函数
    # 其中,apply(x_test)函数返回每个测试样本所在叶子节点的索引,predict(x_test)返回每个测试样本的分类预测结果
    """
        画决策树:
        通过graphviz配合tree.export_graphviz()函数使用
        函数的参数分别为clf训练好的模型,feature_nmes特征名称和class_names标签名称;
        以及rounded(节点形状是否圆角)和filled(节点颜色,颜色越浅不纯度越高)参数设置为True或False
    """
    dot_data = tree.export_graphviz(clf,
                                    feature_names=wine.feature_names,
                                    class_names=wine.target_names,
                                    filled=True,
                                    rounded=True)
    graph = graphviz.Source(dot_data)
    graph.view()
    """
        输出特征的重要性:
        feature_importances_属性返回特征的重要性(数值越大越重要),对于决策树来说有可能有些特征没有被用到;
        list()函数使得其可以直接print输出
        zip() 函数用于将可迭代的对象作为参数,将对象中对应的元素打包成一个个元组,然后返回由这些元组组成的列表;
    """
    # clf.feature_importances_
    print(list(zip(wine.feature_names, clf.feature_importances_)))
    pass


if __name__ == '__main__':
    main()
1.3案例练习
  • 在其他数据集中测试决策树的效果。
  • 来自于课程菜菜课程的课件:菜菜TsaiTsai-哔哩哔哩。
  • 导入需要的模块:
 import numpy as np
 import matplotlib.pyplot as plt
 from matplotlib.colors import ListedColormap
 from sklearn.model_selection import train_test_split
 from sklearn.preprocessing import StandardScaler
 from sklearn.datasets import make_moons, make_circles, make_classification
 from sklearn.tree import DecisionTreeClassifier
  • 生成三种数据集(月亮型数据、环形数据和二分型数据):

2.《数据挖掘——你必须知道的32个经典案例(第2版)》

  • 书中第4章:经典的模式识别案例中-4.4决策树分析——“沸腾时刻”准确判断用户健康水平。
2.1 原文整理
  • 决策树是一种典型的分类方法,是最著名的模式识别算法之一。
  • 沸腾时刻APP利用决策树方法,将“用户体能测试数据”和“健身课程难易系数”挂钩。
    其做法是,将体能测试数据离散化,然后输入决策树算法,从而对用户进行分类。
    决策树能够针对用户体能数据的不同方面赋予不同的重要性。
  • 决策树的最终结果和决策树判断条件的顺序有关。
    决策树模型引入“熵”和“信息增益”概念,是为了找到能够获得最佳结果的条件顺序。
    备注:正例的概念含义指的是,使得结果为正的记录。
  • 一个决策树只能输出一个结果,需要输出多个结果时,构建多个决策树即可。
  • 当前流行(该书出版时间是2018年10月)的决策树算法包括:ID3算法、C4.5算法、CART算法。
    其中ID3算法善于构造低深度、高精度的决策树;C4.5能给处理连续型数据,在剪枝规则和派生规则方面有提高;CART算法是一种简洁的二叉树模型。
  • 决策树能够解决的问题主要有:分类问题、预测问题和回归问题。常用于预测贷款人是否按期归还银行贷款,移动电话用户是否会流失,房价的上涨曲线等。
  • 决策树的优点:适合处理多类变量、对异常值不敏感、准确度高。
  • 决策树的缺点:(1)作为典型的监督学习算法,决策树在训练时需要大量数据和计算空间。决策树需要反复计算变量的熵和信息增益,以此获得最佳决策变量排序,耗费时间。(2)作为贪心算法,追求局部最优可能会达不到全局最优。(3)剪枝减少了决策节点,同时也降低了准确性;同时剪枝本身也需要大量计算。(4)决策树不算很擅长连续型变量,连续型变量增多会使其犯错概率增大。

你可能感兴趣的:(数据挖掘)