统计学习方法——4.决策树(Decision Tree)

一、介绍

  • 决策树用于分类和回归,此处主要学习决策树的分类模型。通过对大量样本的学习去建立一个决策树,依次判断每个属性,从而判断该样本的标记。
  • 特征选择: 选择对训练数据具有分类能力的特征,选择的准则是信息增益或信息增益比。
  • 决策树的生成: ID3, C4.5。ID3采用信息增益准则选择特征。C4.5采用信息增益比准则选择特征。
  • 决策树的剪枝:构建的决策树一般会过拟合,需要对其进行简化,即剪枝(pruning),通过极小化决策树的整体损失函数来实现。
  • CART算法:

二、细节

1. 决策树学习3个步骤:特征选择、决策树的生成、决策树的修剪。

2. 特征选择:

  • 信息增益:得知特征X的信息而使得类Y的信息的不确定性减少的程度。
    特征A对训练数据集D的信息增益记为 g ( D , A ) g(D, A) g(D,A)
    g ( D , A ) = H ( D ) − H ( D ∣ A ) g(D, A) = H(D)-H(D|A) g(D,A)=H(D)H(DA)
    经验熵 H ( D ) H(D) H(D)表示对数据集 D D D进行类的不确定性,而经验条件熵 H ( D ∣ A ) H(D|A) H(DA)表示在给定的条件下对数据集 D D D进行分类的不确定性。信息增益越大的特征具有更强的分类能力。
    计算每个特征与训练数据集 D D D计算信息增益,比较大小,选出信息增益最大的特征。

  • 信息增益比:用于特征选择值较多的问题。
    g R ( D , A ) = g ( D , A ) H A ( D ) g_R(D, A) = \frac{g(D,A)}{H_A(D)} gR(D,A)=HA(D)g(D,A)

3. ID3算法:
在这里插入图片描述

4. C4.5算法:使用信息增益比进行特征选择。

5. 决策树的剪枝:

  • 有预剪枝和后剪枝。
  • 预剪枝:边构造边剪枝。在构造决策树的过程中,先对每个结点在划分前进行估计,如果当前结点的划分不能带来决策树模型泛化性能的提升,则不对当前结点进行划分并且将当前结点标记为叶结点。限制高度、定义阈值等限制。
  • 后剪枝:Reduced-Error Pruning(REP,错误率降低剪枝)、Pesimistic-Error Pruning(PEP,悲观错误剪枝)、Cost-Complexity Pruning(CCP,代价复杂度剪枝)。剪掉使用了较多节点却使错误率下降最低的子树,即使用代价复杂度损失函数。

6. 决策树总结:
ps:from https://zhuanlan.zhihu.com/p/85731206?from=singlemessage
在这里插入图片描述


三、代码实现

库实现

sklearn.tree.DecisionTreeClassifier

# coding=utf-8
import time
import numpy as np
from sklearn.tree import DecisionTreeClassifier


def loadData(fileName):
    '''
    加载文件
    :param fileName:要加载的文件路径
    :return: 数据集和标签集
    '''
    # 存放数据及标记
    dataArr = [];
    labelArr = []
    # 读取文件
    fr = open(fileName)
    # 遍历文件中的每一行
    for line in fr.readlines():
        # 获取当前行,并按“,”切割成字段放入列表中
        # strip:去掉每行字符串首尾指定的字符(默认空格或换行符)
        # split:按照指定的字符将字符串切割成每个字段,返回列表形式
        curLine = line.strip().split(',')
        # 将每行中除标记外的数据放入数据集中(curLine[0]为标记信息)
        # 在放入的同时将原先字符串形式的数据转换为整型

        # 此外将数据进行了二值化处理,大于128的转换成1,小于的转换成0,方便后续计算
        # dataArr.append([int(int(num) > 128) for num in curLine[1:]])
        dataArr.append([int(num) for num in curLine[1:]])

        # 将标记信息放入标记集中
        # 放入的同时将标记转换为整型
        labelArr.append(int(curLine[0]))
    # 返回数据集和标记
    return np.mat(dataArr), np.ravel(labelArr)



def train_decision_tree_model(X_train, Y_train):

    DT_model = DecisionTreeClassifier(criterion='entropy')
    DT_model.fit(X_train, Y_train)

    return DT_model


def model_test(DT_model, X_test, Y_test):

    accuracy = DT_model.score(X_test, Y_test)

    return accuracy



if __name__ == '__main__':
    # 开始时间
    start = time.time()

    # 获取训练集
    trainDataList, trainLabelList = loadData('../Mnist/mnist_train.csv')
    # 获取测试集
    testDataList, testLabelList = loadData('../Mnist/mnist_test.csv')

    DT_model = train_decision_tree_model(trainDataList, trainLabelList)



    # 测试准确率
    print('start test')
    accur = model_test(DT_model, testDataList, testLabelList)
    print('the accur is:', accur)

    # 结束时间
    end = time.time()
    print('time span:', end - start)


ps:本博客仅供自己复习理解,不具其他人可参考,本博客参考了大量的优质资源,侵删。

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值