欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

机器学习——决策树

程序员文章站 2024-02-03 18:55:16
...

一、决策树

如何从数据集中构造一颗决策树

决策树构造过程:选择不同属性对决策树进行分裂(生长),让叶子节点中更纯
机器学习——决策树

属性分裂-影响
属性类型:
    Norminal(类别型)
    Ordinal(有序型)
    Continiuous(连续型)
分叉数量: 
    二分叉
    多分叉

二、决策树划分依据 –不纯度impurity指标

机器学习——决策树

2.1 信息熵

        1948年香农(Shannon)提出了信息熵(Entropy)的概念。
假如事件A的分类划分是:(A1,A2,...,An),那每部分发生的概率是pi(i=1,2,3...n),
那信息熵Emtropy(A)定义为公式如下:

Entropy(A)=i=1npilog2pi                                                                

=(p1log2p1+p2log2p2+...+pnlog2pn)


2.2.条件熵(Conditional Entropy) 与 信息增益(Information Gain)

        条件熵 H(Y|X)表示在已知随机变量 X 的条件下随机变量 Y 的不确定性。
条件熵 的公式:

H(Y|X)=xXp(x)H(Y|X=x)                              

=xXp(x)xYp(y|x)logp(y|x)

=xXxYp(x,y)logp(y|x)        


       当特征变量X被固定后,给系统带来的增益(或者说为系统减少不确定性)为 :
信息增益(information gain)

=Entroy()Entroy()

Gain=En(D,a)v=1V|Dv||D|Ent(Dv)

          信息增益Gain缺点:值越多,分叉越多


增益率(GainRatio) :增益比率度量是用前面的增益度量Gain(S,A)和所分离信息度量SplitInformation(如下面例题中的性别,活跃度等)的比值来共同定义的

GainRatio(SA,A)=Gain(SA,A)SplitInfo(SA,A)       

SplitInfo(SA,A)=|SAm||SA|log|SAm||SA|

2.3基尼值Gini(D) 与基尼指数Gini_index

        从数据集D中随机抽取两个样本,起类别标记不一致的概率,故,GiniD值越小,数据集 D 的纯度越高。
基尼值Gini(D)

GINI(D)=1i=1np(i)2                                     

基尼指数Gini_index(D)
一般选择使划分后基尼系数最小的属性作为最优化分属性。

Gini_index(D,a)=i=1I|Di||D|GINI(Di)                                     

2.4 例题

示例:

机器学习——决策树

三 算法优化

3.1 决策树算法(ID3,C4.5,CART)对比
对比项           ID3           C4.5          CART
目标变量类型     类别型         类别型        类别型,连续型
输入变量类型     类别型      类别型,连续型    类别型,连续型
分叉数量         多叉树        多叉树         二叉树
缺失值处理       不支持         支持          支持
防止过拟合       不支持         支持          支持
名称 提出时间 分支方式 是否支持剪枝 备注
ID3 1975 信息增益 不支持 ID3只能对离散属性的数据集构造决策树
CART 1984 Gini系数 支持 可以进行分类和回归,可以处理离散属性,也可以处理连续的。
C4.5 1993 信息增益率 支持 优化后解决了ID3分支过程中总喜欢偏向取值较多的属性
3.2 DecisionTreeClassifier和DecisionTreeRegressor重要参数对比
参数 DecisionTreeClassifier DecisionTreeRegressor
特征选择标准criterion “gini”或者”entropy” ,前者代表基尼系 数,后者代表信息增益。一默认”gini” , 即CART算法。 “mse”或者”mae” ,前者是均方差, 后者是和均值之差的绝对值之和。 默认”mse”比”mae”更加精确。
特征划分点选择标准splitter “best”或者”random”。前者在特征的所有划分点中找出最优的划分点。后者 是随机的在部分划分点中找局部最优的划分点。 默认的”best”适合样本量不大的,而如果样本数据量非常大,此时决策树构 建推荐”random”。 同 DecisionTreeClassifier
划分时考虑的最大特征数 max_features 可使用很多种类型的值,默认”None”划分时考虑所有的特征数; “log2”划分 时最多考虑log2N个特征; 如果是”sqrt”或者”auto”意味着划分时最多考虑机器学习——决策树个特征。 如果是整数,代表考虑的特征绝对数。如果是浮点数,代表考虑特 征百分比,即考虑(百分比xN)取整后的特征数。其中N为样本总特征数。 如果样本特征数不多(<50)用默认的”None”。 同 DecisionTreeClassifier
3.3 决策树剪枝(防止过拟合)
  • 为什么要剪枝:
    随着树的增长, 在训练样集上的精度是单调上升的, 然而在独立的测试样例上测出的精度先上升后下降。

    原因1:噪声、样本冲突,即错误的样本数据。
    原因2:特征即属性不能完全作为分类标准。(数据中属性不全)
    原因3:巧合的规律性,数据量不够大。
    
  • 预剪枝(Pre-Pruning)

    设置规则避免过度生长:
        信息增益(率)少于阈值,不再分裂
        节点样本少于阈值(例如1%)不再分裂
        如果分裂后的叶子节点样本数少于阈值(0.5%例如)就不能分裂
        树的深度大于阈值(例如8层)就不再分裂
    
  • 后剪枝(Post-Pruning)

    先让决策树生长成一棵大树(过拟合)
    从下往上依次判断:如果剪掉子树,能否让验证集误差下降,若可以就剪
    
    主要有四种:
        (1)REP-错误率降低剪枝
        (2)PEP-悲观剪枝
        (3)CCP-代价复杂度剪枝
        (4)MEP-最小错误剪枝
    

机器学习——决策树

四 DecisionTree方法 代码演示

sklearn.tree.DecisionTreeClassifier
from sklearn.tree import DecisionTreeClassifier
DecisionTreeClassifier(
                        criterion = 'gini',
                        splitter = 'best',
                        max_depth = None,
                        mix_samples_split = 2,
                        mix_samples_leaf = 1,
                        min_weight_fraction_leaf = 0.0,
                        max_features = None,
                        random_sample_leaf = 1,
                        max_leaf_nodes = None,
                        min_impurity_split = 1e-07,
                        class_weight = None,
                        presort = False
                        )
    一些重要的参数:
    criterion           --gini,'emtropy'    最佳分类标准
    max_depth           --树深
    min_samples_split   --节点继续往下分裂最小样本要求
    min_samples_leaf    --叶子节点的最小样本数要求
    min_impurity_split  --预剪枝时节点不纯度'impurity',低于此阈值就不在分裂

    #决策树可视化
    sklearn.tree.export_graghviz
    把决策树模型导出为DOT格式,然后可以可视化查看
    from IPython,display import Image
    import pydotplus
    dot_data = tree.export_graghviz(
                                    dtree,
                                    out_file = None,
                                    feature_names = iris.feature_names,
                                    class_names = iris.target_names,
                                    filled = True,rounded = True,
                                    special_characters = True
                                    )
    graph = pydotplus.gragh_from_dot_data(dot_data)
    Image(gragh.crate_png())