一、决策树基本术语
二、使用决策树进行预测
决策树可以进行分类和预测。
具体过程如下。当构建好决策树后,当有新的信息发送时,利用已有的决策树逻辑对新的信息结构进行判断。当信息的内容与决策树一致时,就进入下一分支进行判断,并通过叶子节点获得分类的结果。
三、决策树常用算法
1、ID3算法
ID3是基本的决策树构建算法,作为决策树经典的构建算法,其具有结构简单、清晰易懂的特点。
虽然ID3比较灵活方便,但是有以下几个缺点:
(1)采用信息增益进行分裂,分裂的精确度可能没有采用信息增益率进行分裂高
(2)不能处理连续型数据,只能通过离散化将连续性数据转化为离散型数据
(3)不能处理缺省值
(4)没有对决策树进行剪枝处理,很可能会出现过拟合的问题
2、C4.5和CART算法(1)
1. 连续值属性处理
将属性取值进行排序,按大于t和小于t分为两个子集,划分点t由最大化信息增益来确定,需要注意的是,对于连续属性,该属性可在决策树中多次使用。
2. 缺省值属性处理
(1)如果缺省的属性是连续的数值,使用平均数、中位数等进行填充
(2)对于缺测的数据,分别用该属性的其他数值进行填充,并且给予每一个填充出来的样本不同的权重,权重根据每一个种类的样本数量进行计算(例如:样本颜色未知,已知的颜色分类有红、黄、蓝,三种分类样本数量分别为2、3、5,则填充出来的样本一共有三个,权重分别为2/10,3/10,5/10)
四、三种划分属性选择指标
(1) 信息增益Gain(D,a):
信息增益越大,纯度提升越高,可以用最高信息增益选择属性。
缺点:属性可取值越多,得到的信息熵越大,用其划分后信息增益越高,故此方法对属性可取值更多的属性有所偏好
(2) 增益率Gain_ratio(D,a):
信息增益除以属性的固有值(以属性a做随机变量,由集合中a属性各个取值所占的比例计算的信息熵),a可取数值越多,固定值越大,在一定程度上抑制了上述偏好
缺点:对可取数值较小的属性有偏好。故实际上,采用先找信息增益高于平均水平的属性,再从中找增益率高的
(3) 基尼指数Gini(D):
从集合中随机抽取两个样本,其类别不一致的概率。概率越小,基尼指数越大,数据集纯度越高。
五、决策树优化问题
1、预防过拟合的方法:
剪枝
(1) 预剪枝:
结点划分前,若划分不能带来泛化性能提高,就停止划分标为叶结点。性能提高的判断由划分前后验证集的精度决定。
优点:分支较少,减小过拟合风险,也减少了训练时间开销和测试时间开销
缺点:带来了欠拟合的风险(当前划分虽不能提升泛化能力,但继续划分呢?)
(2) 后剪枝:
生成完整的决策树后自底向上对非叶结点考察,若替换为叶结点能带来泛化性能提升,则替换。
优点:比预剪枝分支多,欠拟合风险小,泛化性能往往优于预剪枝
缺点:训练时间开销大得多
2、提高准确率
提高准确率最好的方法是构建随机森林(Random Forest)
所谓随机森林就是通过随机抽样的方式从历史数据表中生成多张抽样的历史表,对每个抽样的历史表生成一棵决策树。由于每次生成抽样表后数据都会放回到总表中,因此每一棵决策树之间都是独立的没有关联。将多颗决策树组成一个随机森林。当有一条新的数据产生时,让森林里的每一颗决策树分别进行判断,以投票最多的结果作为最终的判断结果。以此来提高正确的概率。
六、决策树优缺点!!
决策树算法的优点:
1)简单直观,生成的决策树很直观。
2)既可以处理离散值也可以处理连续值。很多算法只是专注于离散值或者连续值。
3)可以处理多维度输出的分类问题。
4)相比于神经网络之类的黑盒分类模型,决策树在逻辑上可以得到很好的解释
5)可以交叉验证的剪枝来选择模型,从而提高泛化能力。
6)对于异常点的容错能力好,健壮性高。
决策树算法的缺点:
1)决策树算法容易过拟合:通过设置节点最少样本数量、不纯度/熵阈值、限制决策树深度来改进。
2)决策树会因为样本发生一点点的改动,就会导致树结构的剧烈改变:通过随机森林等算法。
3)寻找最优的决策树是一个NP难题,通过启发式方法,容易陷入局部最优:通过随机森林算法等方法改善。
4)有些比较复杂的关系,决策树很难学习,一般通过神经网络等方法解决。
5)如果某些特征的样本比例过大,生成决策树容易偏向于这些特征:可通过调节样本权重来改善。
七、决策树调库实现
1、回归树
import numpy as np
import matplotlib.pyplot as plt
from sklearn.tree import DecisionTreeRegressor #调用回归树模型
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#在(0,5)产生400个数的数据集X,并排序
X = np.linspace(0,5,400).reshape(400,1)
y = np.sin(X) #映射成sin函数 回归树
#创建模型
r_tree5 = DecisionTreeRegressor(max_depth=5)
r_tree2 = DecisionTreeRegressor(max_depth=2)
#训练模型
r_tree5.fit(X,y)
r_tree2.fit(X,y)
#求预测值
h5 = r_tree5.predict(X)
h2 = r_tree2.predict(X)
print('max_depths=5准确率:',r_tree5.score(X,y))
print('max_depths=2准确率:',r_tree2.score(X,y))
plt.scatter(X,y,label='真实值')
plt.plot(X,h5,c='r',label='预测值')
plt.legend()
plt.show()
结果展示
max_depths=5准确率: 0.9958688508877047
max_depths=2准确率: 0.903675997937628
2、分类树
import matplotlib.pyplot as plt
#分类树
from sklearn.tree import DecisionTreeClassifier
#sklearn自带数据集
from sklearn.datasets import load_breast_cancer
plt.rcParams['font.sans-serif'] = ['SimHei']
plt.rcParams['axes.unicode_minus'] = False
#读取数据集
data = load_breast_cancer()
X = data.data
y = data.target
#创建模型
c_tree2 = DecisionTreeClassifier(max_depth=2)
c_tree5 = DecisionTreeClassifier(max_depth=5)
#训练模型
c_tree2.fit(X,y)
c_tree5.fit(X,y)
#打印准确率
print('max_depth=2准确率:',c_tree2.score(X,y))
print('max_depth=5准确率:',c_tree5.score(X,y))
#散点图
plt.scatter(X[y==0,0],X[y==0,1],label='0')
plt.scatter(X[y==1,0],X[y==1,1],label='1')
plt.legend()
plt.show()
结果展示
max_depth=2准确率: 0.9420035149384886
max_depth=5准确率: 0.9947275922671354
3、决策树可视化(鸢尾花数据集)
# 加载sklearn中iris数据集,用CART算法去分类,并绘出决策树图。
# 要求:
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.tree import DecisionTreeClassifier,export_graphviz
import pydotplus
# 1.加载数据并做预处理(切分训练集、测试集)。(30分)
data = load_iris()
x = data.data
y = data.target
train_x,test_x,train_y,test_y = train_test_split(x,y,test_size=3)
# 2.正确建立决策树模型并对数据进行训练,并对预测集进行预测(50分)
model = DecisionTreeClassifier(max_depth=3)
model.fit(train_x,train_y)
# 3.用graphviz和pydotplus画出决策树图。(20分)
d_data = export_graphviz(model,out_file=None)
graph = pydotplus.graph_from_dot_data(d_data).create_png()
a = open('a.png',mode='wb')
a.write(graph)
结果展示