决策树原理与python实现

总述

决策树(decision tree)是一种分类与回归方法。在分类过程中可以理解为基于特征对实例进行分类,也可以认为是if else的集合,也可以认为是定义在特征空间与类空间上的条件概率分布。决策树学习过程通常包括三个步骤:(1)特征选择 (2)决策树的生成 (3)决策树的剪枝。决策树常用算法有ID3(Iterative Dichotomiser 3 迭代二叉树三代)、C4.5、CART(classification and regression tree,分类与回归树)

1.特征选择

这里介绍两种特征选择的方法:信息增益与信息增益比。
特征选择对于机器学习算法来说尤为重要,有句话这么说的“算法作用于特征之上”。特征是用来描述一个实例的,特征选择的好坏直接影响算法的效果,这句话不只适用于决策树算法,好多算法均适用。(以我自己的经验为例,使用随机数作为文本的特征输入RNN里与使用某种方法得到的特征输入到RNN里,其结果是不同的,后者的F1值要优于前者)
在决策树方法中,特征选择是用来决定 用哪个特征来划分空间。

1.1信息增益

信息增益由熵与条件熵计算而来。
熵是表示随机变量不确定性的度量,熵只和分布有关,和变量具体的值无关。熵表示为 H(X)
条件熵 H(Y|X) 表示在已知随机变量 X 的条件下,随机变量 Y 的不确定性。
信息增益表示 知道特征 X 的信息而使得类别 Y 的信息的不确定性减少程度。信息增益大的特征具有更强的分类能力
公式就不敲了,比较麻烦(我太懒了。。。)
来个例子,算一下信息增益,当然还是使用李航大牛的例子。
这里写图片描述

#! /usr/local/bin/python3
#coding:utf-8
# author:liushui
import numpy as np 

#输入数据,A表示特征,D表示类别
A1 =np.array([1,1,1,1,1,2,2,2,2,2,3,3,3,3,3])   # A1表示特征年龄,1表示特征的取值为青年,2中年 3 老年



D = np.array([2,2,1,1,2,2,2,1,1,1,1,1,1,1,2])  #D表示类别,是否会给这个人贷款 1是 2否  

class Information_gain(object):
    def __init__(self,X):   # X表示特征  ,D表示分类
        self.X = X

    def cal_entropy(self,D):   # 计算熵
        set_class = list(set(D))
        # print("set_class",set_class)
        num_class = len(set_class)
        list_p = []

        for i in range(num_class):
            num = 0
            for j in range(len(D)):
                if set_class[i]==D[j]:
                    num = num+1
            list_p.append(num)
        # print(list_p)
        p = np.array(list_p)/len(D)
        p_log_p = p*np.log2(p)
        return np.sum(p_log_p)*-1

    def cal_con_entropy(self,D):
        set_x = list(set(self.X))
        len_x = len(set_x)
        num_x = []  # 记录特征x的取值集合

        entropy_D = []  #记录
        for i in range(len_x):
            sub_list = [] # 记录类别的子集合
            num = 0
            for j in range(len(self.X)):
                if set_x[i] == self.X[j]:
                    num = num+1
                    sub_list.append(D[j])
            # print(sub_list)
            entropy_D.append(self.cal_entropy(np.array(sub_list))) 
            num_x.append(num)
        result =np.sum((np.array(num_x)/len(self.X))*np.array(entropy_D))
        return result

    def last_result(self,D):
        return self.cal_entropy(D)-self.cal_con_entropy(D)





inf_g = Information_gain(A1)
result = inf_g.last_result(D)
print(result)
>>>0.0830074998558

经过计算得到特征A3的信息增益最大,所以选择A3作为最优特征

1.2信息增益比

信息增益的大小是相对于训练集而言的,没有绝对意义,当训练数据集大的熵比较大的时候,信息增益也会比较大。可以使用信息增益比进行校正。
信息增益比是信息增益 g(D,A) 与训练数据集 D 的熵 H(D) 之比

2.决策树的生成

ID3生成算法
ID3算法的核心是在决策树各个节点上应用信息增益准则选择特征,递归地构建决策树。具体方法是:从根节点出发,对节点计算所有可能的特征的信息增益,选择信息增益最大的特征作为节点的特征,由该特征的不同取值建立子节点;再对子节点递归地调用以上方法,构建决策树。

3.决策树的剪枝

决策树生成算法往往是过拟合的,对训练集很准,对测试集不是那么准。过拟合的原因是为了使决策树对训练集正确分类,决策树过于复杂。将决策树进行简化就可以减少过拟合,简化的过程称为“剪枝”,就是去掉一些子树或者叶节点,将父节点作为新的子节点。
剪枝一般是通过极小化决策树整体损失函数来实现的。损失函数的定义涉及到模型的准确度复杂度,是对二者的均衡。若父节点的损失小则回缩至父节点,反之不回缩。

4.CART算法

CART算法既可以用于回归也可以用于分类。具体细节这里不说了。
提一点基尼指数,表示集合的不确定性,和熵类似。
主要展示一下sklearn的使用

#! /usr/local/bin/python3
#coding:utf-8
# anuthor:liushui

import numpy as np 
from sklearn import tree 
X = np.array([[1,2,2,3],[1,2,2,2],[2,1,1,2]])
Y = np.array([2,2,1])

clf = tree.DecisionTreeClassifier(criterion="gini")
clf.fit(X,Y)
print(clf.predict([[1,2,2,1]]))
# >>> [2]

# 这个工具还可以将决策树显示出来,这里不演示了

猜你喜欢

转载自blog.csdn.net/liushui94/article/details/78820861
今日推荐