决策树
- 决策树简介
- 决策树分割原理
I D 3 ID_3 ID3算法
C 4.5 C4.5 C4.5算法
C A R T CART CART决策树
三种算法总结 - 剪枝处理
- 数据值缺失处理
- 泰坦尼克生存预测实例
决策树简介
决策树:通俗的来讲就是一种树形结构,由根节点,中间节点,和leaf节点构成。其中根节点包含了整体样本,而中间节点
就相当于多个if-else的组合。而leaf节点则相当于我们判定的类别。决策时就像一个不断递归的过程,直到无法再分为止,一种贪婪形式的算法。
决策树分割原理
I D 3 ID_3 ID3算法
I
D
3
ID_3
ID3算法即信息增益算法,需要我们具备的先验知识主要是信息论中熵的一系列概念,若有忘记的可以看熵的概念。
下面以西瓜书西瓜的例子进行描述信息增益算法如何进行决策
首先我们应当明确我们的决策目标是区分好坏瓜,而<色泽、根蒂、敲声...均为样本特征>
共17个样本,8个(1-8)好瓜,9个(9-17)坏瓜
因此根据其信息增益的公式可知:
E
n
t
(
D
)
=
−
8
17
l
o
g
(
8
17
)
−
9
17
l
o
g
(
9
17
)
=
0.998
Ent(D) = -{8 \above{1px} 17}log({8 \above{1px} 17}) -{9\above{1px}17}log({9\above{1px}17}) = 0.998
Ent(D)=−178log(178)−179log(179)=0.998
G
a
i
n
(
D
,
色
泽
)
=
0.998
−
[
6
17
(
−
3
6
l
o
g
(
3
6
)
−
3
6
l
o
g
(
3
6
)
)
]
−
[
6
17
(
−
4
6
l
o
g
(
4
6
)
−
2
6
l
o
g
(
2
6
)
)
]
−
[
5
17
(
−
1
5
l
o
g
(
1
5
)
−
4
5
l
o
g
(
4
5
)
)
]
=
0.109
Gain(D,色泽) = 0.998 - [{6\above{1px}17}(-{3\above{1px}6}log({3\above{1px}6})-{3\above{1px}6}log({3\above{1px}6}))] -[{6\above{1px}17}(-{4\above{1px}6}log({4\above{1px}6})-{2\above{1px}6}log({2\above{1px}6}))] -[{5\above{1px}17}(-{1\above{1px}5}log({1\above{1px}5})-{4\above{1px}5}log({4\above{1px}5}))]=0.109
Gain(D,色泽)=0.998−[176(−63log(63)−63log(63))]−[176(−64log(64)−62log(62))]−[175(−51log(51)−54log(54))]=0.109
对上式解释一下:D为样本总数。根据色泽进行决策中,可得到3个子集D1(色泽=青绿),D2=(色泽=乌黑),D3=(色泽=浅白)
其中D1中3好3坏,D2中4好2坏,D3中1好4坏。
G a i n ( D , 根 蒂 ) = 0.998 − [ 8 17 ( − 5 8 l o g ( 5 8 ) − 3 8 l o g ( 3 8 ) ) ] − [ 7 17 ( − 3 7 l o g ( 3 7 ) − 4 7 l o g ( 4 7 ) ) ] − [ 2 17 ( − 0 2 l o g ( 0 2 ) − 2 2 l o g ( 2 2 ) ) ] = 0.143 Gain(D,根蒂) = 0.998-[{8\above{1px}17}(-{5\above{1px}8}log({5\above{1px}8})-{3\above{1px}8}log({3\above{1px}8}))]-[{7\above{1px}17}(-{3\above{1px}7}log({3\above{1px}7})-{4\above{1px}7}log({4\above{1px}7}))]-[{2\above{1px}17}(-{0\above{1px}2}log({0\above{1px}2})-{2\above{1px}2}log({2\above{1px}2}))]=0.143 Gain(D,根蒂)=0.998−[178(−85log(85)−83log(83))]−[177(−73log(73)−74log(74))]−[172(−20log(20)−22log(22))]=0.143
其他特征值计算也是如此,(密度、含糖率)两个连续值的信息增益计算更加复杂一些。面对这样的连续值,我们所能做的就是
找到一个阈值,根据这个阈值来进行好坏瓜的区别,但是如何来确定这个阈值呢?
1:我们需要先将这些连续值进行从小到大排序
2:选取两个相邻数据的中间值(a1+a2)/2作为阈值,分别计算其信息增益
3:选取最大的信息增益的阈值作为总体样本连续数据的阈值
如上图密度数据所示,我们分别取上面数据二着中间值middle={0.259,0.3225,0.366,...},然后根据中间值计算信息增益
G
a
i
n
(
D
,
密
度
1
(
0.259
)
)
=
0.998
−
[
16
17
(
−
8
16
l
o
g
(
8
16
)
−
8
16
l
o
g
(
8
16
)
)
]
−
[
1
17
(
−
0
1
l
o
g
(
0
1
)
−
1
1
l
o
g
(
1
1
)
)
]
Gain(D,密度1(0.259)) =0.998-[{16\above{1px}17}(-{8\above{1px}16}log({8\above{1px}16})-{8\above{1px}16}log({8\above{1px}16}))]-[{1\above{1px}17}(-{0\above{1px}1}log({0\above{1px}1})-{1\above{1px}1}log({1\above{1px}1}))]
Gain(D,密度1(0.259))=0.998−[1716(−168log(168)−168log(168))]−[171(−10log(10)−11log(11))]
G
a
i
n
(
D
,
密
度
2
(
0.3225
)
)
=
0.998
−
[
15
17
(
−
8
15
l
o
g
(
8
15
)
−
7
15
l
o
g
(
7
15
)
)
]
−
[
2
17
(
−
0
2
l
o
g
(
0
2
)
−
2
2
l
o
g
(
2
2
)
)
]
Gain(D,密度2(0.3225))=0.998-[{15\above{1px}17}(-{8\above{1px}15}log({8\above{1px}15})-{7\above{1px}15}log({7\above{1px}15}))]-[{2\above{1px}17}(-{0\above{1px}2}log({0\above{1px}2})-{2\above{1px}2}log({2\above{1px}2}))]
Gain(D,密度2(0.3225))=0.998−[1715(−158log(158)−157log(157))]−[172(−20log(20)−22log(22))]
…
计算其信息增益可得:
选取信息增益最大的属性(纹理)进行决策分割
然后在根据划分出的子集在进行上述的操作,以纹理清晰为例
此时
E
n
t
(
D
1
)
=
−
7
9
l
o
g
(
7
9
)
−
2
9
l
o
g
(
2
9
)
Ent(D_1) = -{7 \above{1px} 9}log({7 \above{1px} 9}) -{2\above{1px}9}log({2\above{1px}9})
Ent(D1)=−97log(97)−92log(92)
然后在分别计算该子集上其他特征的信息增益,直到后续的子集无法再分
C 4.5 算 法 C4.5算法 C4.5算法
C
4.5
算
法
C4.5算法
C4.5算法又称信息增益比算法
信息增益比算法就是在信息增益算法的基础上加以改进,除以一个IV,其中IV中种类越多,值越大
I
V
(
色
泽
)
=
−
6
17
l
o
g
(
6
17
)
−
6
17
l
o
g
(
6
17
)
−
5
17
l
o
g
(
5
17
)
=
1.580
IV(色泽)=-{6\above{1px}17}log({6\above{1px}17})-{6\above{1px}17}log({6\above{1px}17})-{5\above{1px}17}log({5\above{1px}17})=1.580
IV(色泽)=−176log(176)−176log(176)−175log(175)=1.580
I V ( 触 感 ) = − 12 17 l o g ( 12 17 ) − 5 17 l o g ( 5 17 ) = 0.874 IV(触感)=-{12\above{1px}17}log({12\above{1px}17})-{5\above{1px}17}log({5\above{1px}17})=0.874 IV(触感)=−1712log(1712)−175log(175)=0.874
I
V
(
触
感
)
=
−
17
∗
(
1
17
l
o
g
(
1
17
)
)
=
4.088
IV(触感)=-17*({1\above{1px}17}log({1\above{1px}17}))=4.088
IV(触感)=−17∗(171log(171))=4.088
…依次类推
C A R T ( 基 尼 指 数 ) CART(基尼指数) CART(基尼指数)
基尼指数反映了数据集D的纯度,也就是说假设从样本D中随机抽取多个样本,其类别不一样的概率。Gini越小
说明样本越纯。
我们倾向于基尼指数小的属性作为最优的划分属性,相当于选择基尼增益最大的作为最优划分属性
基尼增益:
G
i
n
i
(
D
)
−
G
i
n
i
_
i
n
d
e
x
(
D
,
a
)
Gini(D)-Gini\_index(D,a)
Gini(D)−Gini_index(D,a)
目标属性基尼值:
G
i
n
i
(
好
坏
瓜
)
=
1
−
(
8
17
)
2
−
(
9
17
)
2
=
0.498
Gini(好坏瓜)=1-({8\above{1px}17})^2-({9\above{1px}17})^2 =0.498
Gini(好坏瓜)=1−(178)2−(179)2=0.498
CART算法采用one-rest分割方式,那么最终呈现的决策树一定是二叉树的形式
如色泽属性中共有(青绿,乌黑,浅白)三种情况,那么我们分割方法就会有三种
1:{青绿}{乌黑、浅白}===>{3好3坏}{5好6坏}
2:{乌黑}{青绿、浅白}===>{4好2坏}{4好7坏}
3:{浅白}{青绿、乌黑}===>{1好4坏}{7好5坏}
分组1 = 0.498 − 6 17 [ 1 − ( 3 6 ) 2 − ( 3 6 ) 2 ] − 11 17 [ 1 − ( 5 11 ) 2 − ( 6 11 ) 2 ] 0.498-{6\above{1px}17}[1-({3\above{1px}6})^2-({3\above{1px}6})^2]-{11\above{1px}17}[1-({5\above{1px}11})^2-({6\above{1px}11})^2] 0.498−176[1−(63)2−(63)2]−1711[1−(115)2−(116)2]
分组2 = 0.498 − 6 17 [ 1 − ( 4 6 ) 2 − ( 2 6 ) 2 ] − 11 17 [ 1 − ( 4 11 ) 2 − ( 7 11 ) 2 ] 0.498-{6\above{1px}17}[1-({4\above{1px}6})^2-({2\above{1px}6})^2]-{11\above{1px}17}[1-({4\above{1px}11})^2-({7\above{1px}11})^2] 0.498−176[1−(64)2−(62)2]−1711[1−(114)2−(117)2]
分组3 = 0.498 − 5 17 [ 1 − ( 1 5 ) 2 − ( 4 5 ) 2 ] − 12 17 [ 1 − ( 7 12 ) 2 − ( 5 12 ) 2 ] 0.498-{5\above{1px}17}[1-({1\above{1px}5})^2-({4\above{1px}5})^2]-{12\above{1px}17}[1-({7\above{1px}12})^2-({5\above{1px}12})^2] 0.498−175[1−(51)2−(54)2]−1712[1−(127)2−(125)2]
我们选取三个分组中基尼增益最大的作为该属性的基尼增益,然后依次计算其他属性的基尼增益,
选取所有基尼增益中最大的属性作为划分属性,选则划分属性中基尼增益最大得到划分方式作为决策划分的划分方式。
连续值的划分方式与ID3算法中介绍的一致
继续决策的过程就是在划分出来的子集上再进行上述过程(去除已划分属性的计算)
三种算法总结
ID3:
1:采用信息增益作为决策依据
2:倾向于选择类别较多的属性作为划分属性
3:易造成过拟合现象
C4.5:
1:针对ID3倾向于选择类别较多的属性进行改进
2:采用信息增益率作为决策依据
3:采取后剪枝的处理
4:一般占用内存较大,计算更加繁琐,但准确率较高
CART:
1:采用基尼值作为决策依据
2:一定为二叉树模型,简化了树结构
3:可以采用预/后剪枝处理
ID3、C4.5、CART都为单变量决策算法,贪婪性质算法。
剪枝处理
预剪枝:用于应对过拟合的方法,人为的设定一些决策门槛,比如小于多少基尼增益,信息增益,样本数时或者树的最大深度等将不再进行划分,
有效的阻止了决策算法的“贪婪”,但同时可能由于门槛设置的不合理性造成欠拟合的结果。
后剪枝:放任算法的“贪婪性”,任由算法进行决策,再完成最终的决策划分后,再自下而上进行裁剪。后剪枝欠拟合风险极低,
但是需要生成完整的决策树,且自下而上对叶子节点进行遍历,对内存和计算都产生了较大的负担。
数据值的缺失处理
日常中对待缺失值我们一般可以采取以下方法进行处理
1:当缺失值少,且数据集较为庞大时,可以删去含有缺失值样本
2:使用平均值,众数等合力数值进行填充
3:决策树中我们还可以以以下方式进行缺失值处理,ρ为无缺失样本占总样本比例,D~为无缺失值样本
rv~为在D~上属性a各个取值所占的比例(he前面一样,无非总体样本发生变化,比例跟着变化而已)
假设样本中(以色泽为例){1,5,13}号样本色泽数据缺失,那么我们可以使用剩下的{2,3,4,6,7,8,9,10,11,12...}
号数据进行计算信息增益等等
!!!注意方框内的变化
Titanic案例
数据集来源:https://www.kaggle.com/c/titanic/data
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction import DictVectorizer
from sklearn.tree import DecisionTreeClassifier,export_graphviz
import pandas as pd
import numpy as np
# 获取数据集
data = pd.read_csv(r"E:\Jupyter\Pytorch\ML_Algorithm\Decision_tree\titanic\train.csv")
# 2 数据基本处理
feature_data = data[[ 'Pclass','Sex','Age' ]]
target = data.iloc[:,1:2]
# 缺失值处理
for line in feature_data.columns:
if np.any(pd.isnull(feature_data[line]))==True:
feature_data[line].fillna(value=float(round(feature_data[line].mean(),3)),inplace=True)
# 数据集划分
train_set,test_set,train_target,test_target = train_test_split(feature_data,target,random_state=24,test_size=0.2)
# 3.特征工程(字典特征抽取)
transfer = DictVectorizer(sparse=False)
train_set = transfer.fit_transform(train_set.to_dict(orient="records"))
test_set = transfer.fit_transform(test_set.to_dict(orient="records"))
# 4.机器学习(决策树)
estimator = DecisionTreeClassifier(criterion='gini',max_depth=5)
# estimator = DecisionTreeClassifier(criterion="entropy",max_depth=5)
# 训练
estimator.fit(train_set,train_target)
# 预测
pre = estimator.predict(test_set)
# 模型评估
print("预测准确率为:%3.2f%%" % (estimator.score(test_set,test_target)*100))
# 保存决策树,export_graphviz()可以将生成的tree转化成dot文件
export_graphviz(estimator,out_file="./titanic/decision_tree.dot",feature_names=['age', 'pclass','女性', '男性'])
决策树展示
生成的.dot文件可以复制到这里查看生成的决策树