决策树原理与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信息增益
信息增益由熵与条件熵计算而来。
熵是表示随机变量不确定性的度量,熵只和分布有关,和变量具体的值无关。熵表示为
条件熵
信息增益表示 知道特征
公式就不敲了,比较麻烦(我太懒了。。。)
来个例子,算一下信息增益,当然还是使用李航大牛的例子。
#! /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信息增益比
信息增益的大小是相对于训练集而言的,没有绝对意义,当训练数据集大的熵比较大的时候,信息增益也会比较大。可以使用信息增益比进行校正。
信息增益比是信息增益
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]
# 这个工具还可以将决策树显示出来,这里不演示了
推荐阅读
-
【机器学习入门一】决策树及ID3决策树的python实现
-
决策树原理与python实现
-
python基础教程:决策树剪枝算法的python实现方法详解本文实例讲述了决策树剪枝算法的python实现方法。分享给大家供大家参考,具体如下: 决策树是一种依托决策而建立起来的一种树。在机器学习中
-
python实现决策树分类(二)
-
python机器学习 | 决策树算法介绍及实现
-
基于信息增益的决策树特征选择算法(ID3算法)及python实现
-
Python机器学习 - 决策树 - (ID3算法、C4.5算法) - 代码实现
-
ThinkPHP无限级分类原理实现留言与回复功能实例,thinkphp实例_PHP教程
-
【机器学习】西瓜书_周志华,python实现基于信息熵进行划分选择的决策树算法
-
使用ID3算法实现决策树(Python)