决策树

作者: 阿猫阿狗Hakuna | 来源:发表于2020-04-18 22:21 被阅读0次

    整理自《极客时间——数据分析》课程


    image.png

    一.决策树的工作原理

    在做决策树时,需要经历两个阶段:构造和剪枝。

    构造

    构造的过程就是选择什么属性作为节点的过程。注意,叶节点是决策结果。

    剪枝

    剪枝就是给决策树瘦身,这一步想实现的目标就是,不需要太多的判断,同样可以得到不错的结果。之所以这么做,是为了防止“过拟合”(Overfitting)现象的发生。

    造成过拟合的原因之一就是因为训练集中样本量较小。若选择的属性太多,会完美的把训练集中的样本分类,但是其在真实场景中不一定能够正常工作,泛化能力较差。

    剪枝分为预剪枝和后剪枝。
    预剪枝是在决策树构造时就进行剪枝。方法是在构造的过程中对节点进行评估,如果对某个节点进行划分,在验证集中不能带来准确性的提升,那么对这个节点进行划分就没有意义,这时就会把当前节点作为叶节点,不对其进行划分。

    后剪枝就是在生成决策树之后再进行剪枝,通常会从决策树的叶节点开始,逐层向上对每个节点进行评估。如果剪掉这个节点子树,与保留该节点子树在分类准确性上差别不大,或者剪掉该节点子树,能在验证集中带来准确性的提升,那么就可以把该节点子树进行剪枝。

    纯度与信息熵

    纯度

    可以把决策树的构造过程理解成为寻找纯净划分的过程。数学上,我们可以用纯度来表示,纯度换一种方式来解释就是让目标变量的分歧最小。

    比如有3个集合:
    集合一:6天都去玩
    集合二:4天去玩,2天不玩
    集合三:3天玩,3天不玩
    则纯度排序:集合一 > 集合二 > 集合三

    信息熵

    信息熵表示信息的不确定度。
    信息熵的公式如下:


    image.png

    信息熵越大,纯度越低。

    决策树的构造

    在构造决策树的时候,会基于纯度来构建。而经典的 “不纯度”的指标有三种,分别是信息增益(ID3 算法)、信息增益率(C4.5 算法)以及基尼指数(Cart 算法)。

    ID3算法

    ID3 算法计算的是信息增益,信息增益指的就是划分可以带来纯度
    的提高,信息熵的下降。它的计算公式,是父亲节点的信息熵减去所有子节点的信息熵。在计算的过程中,我们会计算每个子节点的归一化信息熵,即按照每个子节点在父节点中出现的概率,来计算这些子节点的信息熵。

    以下为信息增益的计算公式:


    image.png

    我们需要计算不同属性的信息增益,并选择其中最大的作为父节点,这样可以得到纯度高的决策树。
    一层一层的往下进行计算和分裂。

    ID3 有一个缺陷就是,有些属性可能对分类任务没有太大作用,但是他们仍然可能会被选为最优属性。这种缺陷不是每次都会发生,只是存在一定的概率。在大部分情况下,ID3 都能生成不错的决策树分类。针对可能发生的缺陷,后人提出了新的算法进行改进。

    C4.5算法(ID3改进)
    采用信息增益率

    因为 ID3 在计算的时候,倾向于选择取值多的属性。为了避免这个问题,C4.5 采用信息增益率的方式来选择属性。信息增益率 = 信息增益 / 属性熵。
    当属性有很多值的时候,相当于被划分成了许多份,虽然信息增益变大了,但是对于 C4.5来说,属性熵也会变大,所以整体的信息增益率并不大。

    采用悲观剪枝

    ID3 构造决策树的时候,容易产生过拟合的情况。在 C4.5 中,会在决策树构造之后采用悲观剪枝(PEP),这样可以提升决策树的泛化能力。

    离散化处理连续属性

    C4.5 可以处理连续属性的情况,对连续的属性进行离散化的处理。
    C4.5 选择具有最高信息增益的划分所对应的阈值。

    处理缺失值
    总结

    ID3 算法的优点是方法简单,缺点是对噪声敏感。训练数据如果有少量错
    误,可能会产生决策树分类错误。C4.5 在 ID3 的基础上,用信息增益率代替了信息增益,解决了噪声敏感的问题,并且可以对构造树进行剪枝、处理连续数值以及数值缺失等情况,但是由于 C4.5 需要对数据集进行多次扫描,算法效率相对较低。

    二.CART算法

    Classification And Regression Tree,中文叫做分类回归树。
    CART 只支持二叉树。同时 CART 决策树比较特殊,既可以作分类
    树,又可以作回归树。

    什么是分类树?什么是回归树呢?
    一棵决策树,想要基于数据判断这个人的职业身份,这个就属于分类
    树,因为是从几个分类中来做选择。如果是给定了数据,想要预测这个人的年龄,那就属于回归树。

    CART分类树工作流程

    决策树的核心是寻找纯净的划分,因此引入了纯度的概念。实际上 CART 分类树与 C4.5 算法类似,只是属性选择的指标采用的是基尼系数。
    基尼系数本身反应了样本的不确定度。当基尼系数越小的时候,说明样本之间的差异性小,不确定程度低。分类的过程本身是一个不确定度降低的过程,即纯度的提升过程。所以 CART 算法在构造分类树的时候,会选择基尼系数最小的属性作为属性的划分。


    image.png
    image.png

    如何使用CART算法创建分类树

    from sklearn.model_selection import train_test_split
    from sklearn.metrics import accuracy_score
    from sklearn.tree import DecisionTreeClassifier
    from sklearn.datasets import load_iris
    
    #准备数据
    iris = load_iris()
    #获取特征集和分类标识
    features = iris.data
    labels = iris.target
    #随机抽取33%的数据作为测试集,其余为训练集
    train_features, test_features, train_labels, test_labels = train_test_split(features, labels, test_size=0.33, random_state=0)
    #创建CART分类树
    clf = DecisionTreeClassifier(criterion='gini')
    #拟合构造CART分类树
    clf.fit(train_features, train_labels)
    #用CART分类树做预测
    test_predict = clf.predict(test_features)
    #预测结果与测试集结果做比对
    score = accuracy_score(test_labels, test_predict)
    print("cart分类树准确率 %.4lf" % score)
    

    CART回归树的构造流程

    CART回归树划分数据集的过程和分类树的过程是一样的,只是回归树得到的预测结果是连续值,而且评判“不纯度”的指标不同。在CART分类树中采用的是基尼系数作为标准,那么在CART回归树中,根据样本的混乱程度,也就是样本的离散程度来评价“不纯度”。

    样本的离散程度具体的计算方式是,先计算所有样本的均值,然后计算每个样本值到均值的差值。我们假设x为样本的个体,均值为u。为了统计样本的离散程度,我们可以取差值的绝对值,或者方差。


    image.png

    所以这两种节点划分的标准,分别对应着两种目标函数最优化的标准,即用最小绝对偏差(LAD),或者使用最小二乘偏差(LSD)。

    from sklearn.model_selection import train_test_split
    from sklearn.metrics import mean_squared_error
    from sklearn.metrics import r2_score, mean_absolute_error, mean_squared_error
    from sklearn.tree import DecisionTreeRegressor
    from sklearn.datasets import load_boston
    
    #准备数据
    boston = load_boston()
    #获取特征集和分类标识
    features = boston.data
    prices = boston.target
    #随机抽取33%的数据作为测试集,其余为训练集
    train_features, test_features, train_price, test_price = train_test_split(features, prices, test_size=0.33)
    #创建CART回归树
    clf = DecisionTreeRegressor()
    #拟合构造CART回归树
    clf.fit(train_features, train_price)
    #用CART分类树做预测房价
    predict_price = clf.predict(test_features)
    #预测结果与测试集结果做比对
    print('回归树二乘偏差均值:', mean_squared_error(test_price, predict_price))
    print('回归树绝对值偏差均值:', mean_absolute_error(test_price, predict_price))
    

    三.决策树的应用

    在金融行业可以用决策树做贷款风险评估,医疗行业可以用决策树生成辅助诊断,电商行业可以用决策树对销售额进行预测等。

    四.K折交叉验证

    这里可以使用 K 折交叉验证的方式,交叉验证是一种常用的验证分类准确率的方法,原理是拿出大部分样本进行训练,少量的用于分类器的验证。K 折交叉验证,就是做 K 次交叉验证,每次选取 K 分之一的数据作为验证,其余作为训练。轮流 K 次,取平均值。

    K 折交叉验证的原理是这样的:

    1. 将数据集平均分割成 K 个等份;
    2. 使用 1 份数据作为测试数据,其余作为训练数据;
    3. 计算测试准确率;
    4. 使用不同的测试集,重复 2、3 步骤。

    相关文章

      网友评论

          本文标题:决策树

          本文链接:https://www.haomeiwen.com/subject/thnbvhtx.html