决策树与随机森林
决策树简介:
决策树,顾名思义,以建树的形式来做决策
决策树策略:自上而下,分而治之
基本结构:
根节点、父节点、子节点和叶子节点。子节点有父节点根据某一规则分裂而来,然后子节点作为新的的父节点继续分裂,直到不能分裂为止。
种类:
- 分类树:对离散变量做决策树
- 回归树:对连续变量做决策树
算法:(贪心算法)
- 有监督学习
- 非参数学习算法
- 自顶而下递归方式构造决策树
- 在每一部选择中都采取当前状态下最优解
决策树学习的算法通常是一个递归地选择最优特征, 并根据该特征对训练数据进行分割, 使得各个子数据集有一个最好的分类的过程.
在决策树算法中,ID3基于信息增益作为属性选择的度量, C4.5基于信息增益作为属性选择的度量, CART基于基尼指数作为属性选择的度量
学习过程:
- 特征选择
- 决策树生成:递归结构,对应模型的局部最优
- 决策树简直:缩小树的规模,缓解过拟合,对应模型的全局最优
优缺点:
优点:
- 速度快:计算量较小,容易转化为分类规则,从根节点到叶子节点有唯一的分类规则
- 准确性高:挖掘出来的分类规则便于裂解,可以显示特征的重要性
- 可以处理连续字段
- 不需要专业知识及参数假设
- 适用于高维数据
缺点:
- 对于样本数量不一致的数据,信息增益偏向于更多数值的特征
- 极易过拟合
- 忽略了属性间的相关性(重要!!!!!)
数学知识:
1. 信息论:
若一个事件A有K种结果,每个结果的概率为 P i P_i Pi,则使劲按发生后的信息量I为:
I
=
−
∑
i
=
1
k
p
i
l
o
g
2
p
i
I=-\sum_{i=1}^{k}{p_ilog_2p_i}
I=−i=1∑kpilog2pi
这个是根据全概率公式 P = ∑ i = 1 k P ( A i ) P ( B ∣ A i ) P=\sum_{i=1}^{k}{P(A_i)P(B|A_i)} P=∑i=1kP(Ai)P(B∣Ai)以及信息量的定义 I = l o g 2 m I=log_2m I=log2m(其中m为事件的可能结果数)所给出的
2. 熵:
给定包含关于某个目标概念的正反例样集S,那么S相对布尔型分类的熵为:
E
n
t
r
o
p
y
(
S
)
=
−
(
p
⊕
∗
l
o
g
2
p
⊕
)
−
(
p
⊖
∗
l
o
g
2
p
⊖
)
Entropy(S)=-(p_\oplus*log_2p_\oplus)-(p_\ominus*log_2p_\ominus)
Entropy(S)=−(p⊕∗log2p⊕)−(p⊖∗log2p⊖)
其中
p
⊕
p_\oplus
p⊕代表正例,
p
⊖
p_\ominus
p⊖代表反例。
熵可以度量不确定性,假设S是一个有限值的离散随机变量,概率分布为:
P
(
X
=
x
i
)
=
p
i
,
i
=
1
,
2
,
.
.
.
,
n
P(X=x_i)=p_i,i=1,2,...,n
P(X=xi)=pi,i=1,2,...,n
则X的熵定义为:
H
(
X
)
=
−
∑
i
=
1
n
p
i
l
o
g
p
i
H(X)=-\sum^{n}_{i=1}{p_ilogp_i}
H(X)=−i=1∑npilogpi
上边的布尔型分类只有两个结果所以是两个。
3. 条件熵:
假设随机变量
(
X
,
Y
)
(X,Y)
(X,Y),其联合分布概率为
P
(
X
=
x
i
,
Y
=
y
i
)
=
P
i
j
,
i
=
1
,
2
,
.
.
.
,
n
;
j
=
1
,
2
,
.
.
.
,
m
P(X=x_i,Y=y_i)=P_{ij},i=1,2,...,n;j=1,2,...,m
P(X=xi,Y=yi)=Pij,i=1,2,...,n;j=1,2,...,m则条件熵
H
(
X
∣
Y
)
H(X|Y)
H(X∣Y)表示在一直随机变量X的条件下随机变量Y的不确定性,其定义为X在给定条件下Y的条件概率分布的熵对X的数学期望。????????
H
(
X
∣
Y
)
=
∑
i
−
1
n
p
i
H
(
Y
∣
X
=
X
i
)
H(X|Y)=\sum_{i-1}^{n}{p_iH(Y|X=X_i)}
H(X∣Y)=i−1∑npiH(Y∣X=Xi)
4.信息增益:
信息增益表示得知特征X的信息二十的特征Y的信息的不确定性减少的程度。
假设特征A对训练集的信息增益为
g
(
D
,
A
)
g(D,A)
g(D,A),其定义为集合D的熵与特征A给定条件下的D的条件熵
H
(
D
∣
A
)
H(D|A)
H(D∣A)之差:
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
5.信息增益比:
特征A对训练集D的信息增益比
g
R
(
D
,
A
)
g_R(D,A)
gR(D,A)定义为其信息增益
g
(
D
,
A
)
g(D,A)
g(D,A)与训练集D关于特征A的值的熵
H
A
(
D
)
H_A(D)
HA(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)
其中
H
A
(
D
)
=
−
∑
i
=
1
n
∣
D
i
∣
∣
D
∣
l
o
g
2
∣
D
i
∣
∣
D
∣
,
n
H_A(D)=-\sum_{i=1}^{n}{\frac{|D_i|}{|D|}log_2{\frac{|D_i|}{|D|}}},n
HA(D)=−∑i=1n∣D∣∣Di∣log2∣D∣∣Di∣,n是特征A取值的个数
决策树算法——CART
分类树:
分类树采用基尼指数来选择最优的切分特征,而且每次都是二分。
基尼指数是一个类似与熵的概念,对于一个有
K
K
K 种状态对应的概率为 $p_1,p_2,…,p_K
的
随
机
变
量
X
,
其
的随机变量 X ,其
的随机变量X,其Gini$定义如下:
G
i
n
i
(
X
)
=
∑
i
=
1
k
(
1
−
p
i
)
=
1
−
∑
p
i
2
Gini(X)=\sum_{i=1}^{k}{(1-p_i)}=1-\sum p_i^2
Gini(X)=i=1∑k(1−pi)=1−∑pi2
根据公式可得到伯努利分布
X
∼
B
e
r
n
o
u
l
l
i
(
p
)
X∼Bernoulli(p)
X∼Bernoulli(p)的基尼系数为:
G
i
n
i
(
X
)
=
∑
i
=
1
k
p
i
(
1
−
p
i
)
=
2
p
(
1
−
p
)
Gini(X)=\sum_{i=1}^{k}{p_i(1-p_i)}=2p(1-p)
Gini(X)=i=1∑kpi(1−pi)=2p(1−p)
对于训练数据集合 D ,假设共有 K 个类别,
C
k
C_k
Ck 代表第 k 类的样本子集,
∣
C
k
∣
|C_k|
∣Ck∣ 为$ C_k$ 的大小,
∣
D
∣
|D|
∣D∣ 为$ D$ 的大小,则集合 D的基尼系数为:
G
i
n
i
(
D
)
=
∑
∣
C
i
∣
∣
D
∣
(
1
−
∣
C
i
∣
∣
D
∣
)
=
1
−
∑
(
∣
C
i
∣
∣
D
∣
)
2
Gini(D)=\sum{\frac{|C_i|}{|D|}(1-\frac{|C_i|}{|D|})}=1-\sum{(\frac{|C_i|}{|D|})^2}
Gini(D)=∑∣D∣∣Ci∣(1−∣D∣∣Ci∣)=1−∑(∣D∣∣Ci∣)2
类似于信息增益,假设现在用特征 A 对数据进行分割,若特征 A 为离散特征,则根据 A 的某一可能取值 a 将 D 分为 D1 与 D2:
D
1
=
{
D
∣
A
=
a
}
D
2
=
{
D
∣
A
≠
a
}
D_1=\{D|A=a\} D_2=\{D|A≠a\}
D1={D∣A=a}D2={D∣A̸=a}
得到类似于条件熵的一个量$ Gini(D,A) $,即在已知特征 A 的条件下集合 D 的基尼指数:
G
i
n
i
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
Gini(D,A)=\frac{|D_1|}{|D|}Gini(D)+\frac{|D_2|}{|D|}Gini(D_2)
Gini(D,A)=∣D∣∣D1∣Gini(D)+∣D∣∣D2∣Gini(D2)
G
i
n
i
(
D
,
A
)
Gini(D,A)
Gini(D,A) 取值越大,样本的不确定性也越大,这一点与熵类似,所以选择特征 A 的标准是
G
i
n
i
(
D
,
A
)
Gini(D,A)
Gini(D,A) 的取值越小越好。接下来以离散特征为例,给出分类树算法:
输入:训练集D
输出分类树T
- 1.利用特征 A 的取值 a 将数据分为两部分,计算 A=a 时的基尼系数
- 2.对整个数据集中所有的可能特征 A 以及其可能取值 a 选取基尼系数最小的特征 $A^∗ 与 特 征 下 的 取 值 与特征下的取值 与特征下的取值 a^∗$,来将数据集切分,将数据 D1、D2 分到两个子节点中去。
- 3.对子节点递归的调用1,2步骤,直至满足停止条件
- 4.返回分类树T
算法的停止条件可以是节点中的样本数不能小于给定阈值,或者样本集的基尼系数小于给定阈值,或者没有更多的特征。
回归树:
根据《统计学习方法》中的介绍。
回归树使用平方误差最小化准则来构建回归树。
回归树的生成:
给定一个数据集
D
=
{
(
X
i
,
y
i
)
}
D=\{(X_i,y_i)\}
D={(Xi,yi)}
首先知道一棵回归树对应输入空间的一个划分以及在划分单元上的输出值。假设将数据集划分为N个子集
D
1
,
D
2
,
.
.
.
,
D
n
D_1,D_2,...,D_n
D1,D2,...,Dn,并且在每个单元上都有一个固定输出值
c
i
c_i
ci,于是回归树的模型可表示为
f
(
x
)
=
∑
i
=
1
N
c
i
I
(
x
∈
D
i
)
f(x)=\sum_{i=1}^{N}{c_iI(x\in D_i)}
f(x)=i=1∑NciI(x∈Di)
当输入空间的划分确定时,可以用平方误差
∑
X
i
∈
R
m
(
y
i
−
f
(
x
i
)
)
2
\sum_{X_i\in R_m}{(y_i-f(x_i))^2}
∑Xi∈Rm(yi−f(xi))2来表示回归树对于训练数据的预测误差,用平方最小的准则求解每个单元上的最优输出值。易得,单元
R
m
R_m
Rm上的
c
m
c_m
cm的最优值
c
m
^
\hat{c_m}
cm^是
R
m
R_m
Rm上的所有输入实例对应的输出的均值,即
c
m
^
=
a
v
e
(
y
i
∣
x
i
∈
R
m
)
\hat{c_m}=ave(y_i|x_i \in R_m)
cm^=ave(yi∣xi∈Rm)
问题是怎样对输入空间进行划分,这里使用启发式的方法,选择第
j
j
j个变量
x
(
i
)
x^{(i)}
x(i)和它取得值是,作为切分变量和切分点,并定义两个区域:
R
1
(
j
,
s
)
=
{
x
∣
x
(
j
)
≤
s
}
R_1(j,s)=\{x|x^(j) \leq s\}
R1(j,s)={x∣x(j)≤s}和
R
2
(
j
,
s
)
=
{
x
∣
x
(
j
)
>
s
}
R_2(j,s)=\{x|x^(j)>s\}
R2(j,s)={x∣x(j)>s}
然后寻找最优切分变量j和最优切分点s.求解
m
i
n
j
,
s
[
m
i
n
c
1
∑
x
1
∈
R
1
(
j
,
s
)
(
y
i
−
c
1
)
2
+
m
i
n
c
2
∑
x
i
∈
R
2
(
j
,
s
)
(
y
i
−
c
2
)
2
]
min_{j,s}[min_{c_1}\sum_{x_1 \in R_1(j,s)}{(y_i-c_1)^2}+min_{c_2}\sum_{x_i \in R_2(j,s){(y_i-c_2)^2}}]
minj,s[minc1x1∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)(yi−c2)2∑]
对固定输入变量j可以找到最优切分点s.
c
1
^
=
a
v
e
(
y
1
∣
x
i
∈
R
1
(
j
,
s
)
)
\hat{c_1}=ave(y_1|x_i \in R_1(j,s))
c1^=ave(y1∣xi∈R1(j,s))和
c
2
^
=
a
v
e
(
y
i
∣
x
i
∈
R
2
(
j
,
s
)
)
\hat{c_2}=ave(y_i|x_i \in R_2(j,s))
c2^=ave(yi∣xi∈R2(j,s))
遍历所有输入变量,找到最优的切分变量j,构成一个对
(
j
,
s
)
(j,s)
(j,s)。依次将输入空间划分为两个区域。接着,对每个区域重复上述划分过程,知道满足停止条件位置。这样就生成一颗回归树。这样的回归树通常称为最小二乘回归树。
先给出生成算法:
输入:训练集D
输出:回归树
在训练数据集所在的输入空间中,递归的将每个区域划分为两个字区域并决定每个子区域的输出值,构建二叉决策树
- 1.选择最优切分变量j与切分点s,求解: m i n j , s [ m i n c 1 ∑ x 1 ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + m i n c 2 ∑ x i ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] min_{j,s}[min_{c_1}\sum_{x_1 \in R_1(j,s)}{(y_i-c_1)^2}+min_{c_2}\sum_{x_i \in R_2(j,s){(y_i-c_2)^2}}] minj,s[minc1x1∈R1(j,s)∑(yi−c1)2+minc2xi∈R2(j,s)(yi−c2)2∑]
- 2.用选定的对
(
j
,
s
)
(j,s)
(j,s)划分区域并决定相应的输出值:
R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } R_1(j,s)=\{x|x^(j) \leq s\} R1(j,s)={x∣x(j)≤s}和
R 2 ( j , s ) = { x ∣ x ( j ) > s } R_2(j,s)=\{x|x^(j)>s\} R2(j,s)={x∣x(j)>s}
c m ^ = 1 N m ∑ x i ∈ R m ( j , s ) y i , x ∈ R m , m = 1 , 2 \hat{c_m}=\frac{1}{N_m}\sum_{x_i \in R_m(j,s)}y_i,x\in R_m,m=1,2 cm^=Nm1xi∈Rm(j,s)∑yi,x∈Rm,m=1,2 - 3.继续对两个子区域调用步骤1,2,直到满足停止条件。
- 4.将输入空间划分为M个区域 R 1 , R 2 , . . . , R m , R_1,R_2,...,R_m, R1,R2,...,Rm,生成决策树: f ( x ) = ∑ m = 1 M c m ^ I ( x ∈ R m ) f(x)=\sum_{m=1}^{M}\hat{c_m}I(x\in R_m) f(x)=m=1∑Mcm^I(x∈Rm)
随机森林简介:
随机森林就是通过集成学习的思想将多颗决策树集成的一种算法,它的基本单元是决策树,而它的本质属于机器学习中的集成学习。
从直观的角度来看,随机森林就是将每个基分类器的结果汇总起来,按照一定的选取规则,例如:投票次数最多的,指定为最终的输出结果。
特点:
- 在当前的所有机器学习算法中,有极好的准确性。
- 能够有效的在大型数据集上运行。
- 能够处理具有高维特征的输入样本,并且不需要降维。
- 能够评估各个特征在分类问题上的重要性
- 在生成中可以获取内部产生的误差无偏估计
- 对于缺失值问题也可以获得很好的结果。
随机森林的构建:
- 1.如果训练集的大小为N,对于每棵树而言,随机且有放回地从训练集中抽取N个训练样本(boostrap sample)作为该树的训练集。有此可以知道每棵树的训练集是不同的并且里面包含着重复的训练样本。
- 2.如果每个样本的特征维度为M,指定一个常数m < < << <<M,随机地从M个特征中选取m个特征子集,每次树进行分裂时,从这m个特征中选取最优的。
- 3.每棵树都尽最大程度的生长,并且没有剪枝过程。
两个随机性:boostrap sample和随机选取特征子集
两个随机性的引入对随机森林的分类性能至关重要。由于它们的引入,使得随机森林不容易陷入过拟合,并且具有很好得抗噪能力(比如:对缺省值不敏感)。
FAQ:
- 为何要随机抽样?
如果不随机抽样,每棵树的训练集都是一样的,那么最终的分类结果也是完全一样的。 - 为何要有放回的抽样?
如果不是有放回的抽样,所有的数据集都是没有交集的,所以每棵树都是有偏差的。随机森林最后的决定是投票表决,如果每棵树都给出了互不相同的结果,随机森林就无法得出有效的结果。
随机森林的错误率与两个因素有关:
- 森林中任意两棵树的相关性:相关性越大,错误率越大。
- 每棵树的分类能力:分类能力越强,错误率越低。
减小特征选择个数m,树的相关性和分类能力会相应降低,增大m,二者会相应增大。所以选取m的大小是随机森林里唯一要考虑的。
袋外错误率:
为了解决最优的特征选择个数问题,通过袋外错误率来作为主要依据。
随机森林有个重要的优点就是它能在生成的过程中对误差建立一个无偏估计。
在构建每棵树时使用了boostrap sample的方式。所以对于第k棵树来说,大约有1/3的训练集没有参与该树的生成,它们被称为该树的oob样本。
oob的计算方式如下:
- 对每个样本,计算它作为oob样本的树对他的分类情况。
- 然后以简单多数投票方式作为该样本的分类结果
- 最后用误分类个数占样本总数的比率作为随机森林的oob误分类率。
oob误分率是误差的无偏估计。