随机森林(Random Forest)是一个非常灵活的机器学习方法,从市场营销到医疗保险有着众多的应用。例如用于市场营销对客户获取和存留建模或预测病人的疾病风险和易感性。随机森林能够用于分类和回归问题,可以处理大量特征,并能够帮助估计用于建模数据变量的重要性。我们先了解随机森林中森林和随机的概念。
集成学习是将多个模型进行组合来解决单一的预测问题。其原理是生成多个分类器模型,各自独立的学习并做出预测,这些预测最后结合起来得到预测结果,因此和单独分类器相比结果会更好。
单个决策树在机器学习中比作普通学习,那么成百上千棵决策树便叫做集成学习,成百上千棵树也便组成了森林。
我们知道随机森林是将其他的模型进行聚合, 但具体是哪种模型呢?从其名称也可以看出,随机森林聚合的是分类(或回归) 树。
那么我们如何生成成百上千棵决策树呢?如果选择样本集N中全部数据生成众多决策树,那么生成的决策树都相同,得到预测结果便没有实际意义。因此我们采用的方法是从样本集N中有放回的随机采样选出n个样本(n
由于这些树是随机生成的,大部分的树对解决分类或回归问题是没有意义的,那么生成上万的树有什么好处呢?
好处便是生成的决策树中有少数非常好的决策树。当你要做预测的时候,新的观察值随着决策树自上而下的预测并被赋予一个预测值或标签。一旦森林中的每棵树都有了预测值或标签,所有的预测结果将被归总到一起,所有树的投票做为最终的预测结果。简单来说,99.9%不相关的树做出的预测结果涵盖所有的情况,这些预测结果将会彼此抵消。少数优秀的树将会脱颖而出,从而得到一个好的预测结果。随机森林算法如下所示
随机森林包含众多决策树,能够用于分类和回归问题。决策树算法一般包括ID3、C4.5、CART算法,这里我们给出CART(分类与回归树)算法的详细推导过程。
CART分类树预测离散型数据,采用基尼指数选择最优特征,同时决定该特征的最优二值切分点。分类过程中,假设有K个类,样本点属于第k个类的概率为Pk,则概率分布的基尼指数定义为
G i n i ( p ) = ∑ k = 1 m p k ( 1 − p k ) = 1 − ∑ k = 1 K p k 2 Gini(p)=\sum_{k=1}^{m}p_k(1-p_k)=1-\sum_{k=1}^{K}p_{k}^{2} Gini(p)=k=1∑mpk(1−pk)=1−k=1∑Kpk2
根据基尼指数定义,可以得到样本集合D的基尼指数,其中Ck表示数据集D中属于第k类的样本子集。
G i n i ( D ) = 1 − ∑ k = 1 K ( ∣ C k ∣ ∣ D ∣ ) 2 Gini(D)=1-\sum_{k=1}^{K}\left(\frac{|C_k|}{|D|} \right)^2 Gini(D)=1−k=1∑K(∣D∣∣Ck∣)2
如果数据集D根据特征A在某一取值a上进行分割,得到D1,D2两部分后,那么在特征A下集合D的基尼系数如下所示。其中基尼系数Gini(D)表示集合D的不确定性,基尼系数Gini(D,A)表示A=a分割后集合D的不确定性。基尼指数越大,样本集合的不确定性越大。
G a i n _ G i n i ( D , A ) = ∣ D 1 ∣ ∣ D ∣ G i n i ( D 1 ) + ∣ D 1 ∣ ∣ D ∣ G i n i ( D 2 ) Gain\_Gini(D,A)=\frac{|D1|}{|D|}Gini(D_1)+\frac{|D1|}{|D|}Gini(D_2) Gain_Gini(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D1∣Gini(D2)
对于属性A,分别计算任意属性值将数据集划分为两部分之后的Gain_Gini,选取其中的最小值,作为属性A得到的最优二分方案。然后对于训练集S,计算所有属性的最优二分方案,选取其中的最小值,作为样本及S的最优二分方案。
min i ϵ A ( G a i n _ G i n i ( D , A ) ) \min_{i\epsilon A}(Gain\_Gini(D,A)) iϵAmin(Gain_Gini(D,A))
min A ϵ A t t r i b u t e ( min i ϵ A ( G a i n _ G i n i ( D , A ) ) ) \min_{A\epsilon Attribute}(\min_{i\epsilon A}(Gain\_Gini(D,A))) AϵAttributemin(iϵAmin(Gain_Gini(D,A)))
名称 | 体温 | 胎生 | 水生 | 类标记 |
---|---|---|---|---|
人 | 恒温 | 是 | 否 | 哺乳类 |
巨蟒 | 冷血 | 否 | 否 | 爬行类 |
鲑鱼 | 冷血 | 否 | 是 | 鱼类 |
鲸 | 恒温 | 是 | 是 | 哺乳类 |
蛙 | 冷血 | 否 | 有时 | 鱼类 |
巨蜥 | 冷血 | 否 | 否 | 爬行类 |
蝙蝠 | 恒温 | 是 | 否 | 哺乳类 |
猫 | 恒温 | 是 | 否 | 哺乳类 |
豹纹鲨 | 冷血 | 是 | 是 | 鱼类 |
海龟 | 冷血 | 否 | 有时 | 爬行类 |
豪猪 | 恒温 | 是 | 否 | 哺乳类 |
鳗 | 冷血 | 否 | 是 | 鱼类 |
蝾螈 | 冷血 | 否 | 有时 | 两栖类 |
针对上述离散型数据,按照体温为恒温和非恒温进行划分。其中恒温时包括哺乳类5个、鸟类2个,非恒温时包括爬行类3个、鱼类3个、两栖类2个,如下所示我们计算D1,D2的基尼指数。
G i n i ( D 1 ) = 1 − [ ( 5 7 ) 2 + ( 2 7 ) 2 ] = 20 49 Gini(D_1)=1-[ (\frac{5}{7})^2+(\frac{2}{7})^2]=\frac{20}{49} Gini(D1)=1−[(75)2+(72)2]=4920
G i n i ( D 2 ) = 1 − [ ( 3 8 ) 2 + ( 3 8 ) 2 + ( 2 8 ) 2 ] = 42 64 Gini(D_2)=1-[ (\frac{3}{8})^2+(\frac{3}{8})^2+(\frac{2}{8})^2]=\frac{42}{64} Gini(D2)=1−[(83)2+(83)2+(82)2]=6442
然后计算得到特征体温下数据集的Gini指数,最后我们选择Gain_Gini最小的特征和相应的划分。
G a i n _ G i n i ( D , 体 温 ) = 7 15 ∗ 20 49 + 8 15 ∗ 42 64 Gain\_Gini(D,体温)=\frac{7}{15}*\frac{20}{49}+\frac{8}{15}*\frac{42}{64} Gain_Gini(D,体温)=157∗4920+158∗6442
CART回归树预测连续型数据,假设X与Y分别是输入和输出变量,并且Y是连续变量。在训练数据集所在的输入空间中,递归的将每个区域划分为两个子区域并决定每个子区域上的输出值,构建二叉决策树。
D = { ( x 1 , y 1 ) , ( x 2 , y 2 ) , ( x 3 , y 3 ) , . . . ( x n , y n ) } D=\{(x_1,y_1),(x_2,y_2),(x_3,y_3),...(x_n,y_n)\} D={(x1,y1),(x2,y2),(x3,y3),...(xn,yn)}
选择最优切分变量j与切分点s:遍历变量j,对规定的切分变量j扫描切分点s,选择使下式得到最小值时的(j,s)对。其中Rm是被划分的输入空间,cm是空间Rm对应的固定输出值。
min j , s [ min c 1 ∑ x i ϵ R i ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ϵ R i ( j , s ) ( y i − c 1 ) 2 ] \min_{j,s}[\min_{c_1}\sum _{x_i\epsilon R_i(j,s)}(y_i-c_1)^2+\min_{c_2}\sum _{x_i\epsilon R_i(j,s)}(y_i-c_1)^2] j,smin[c1minxiϵRi(j,s)∑(yi−c1)2+c2minxiϵRi(j,s)∑(yi−c1)2]
用选定的(j,s)对,划分区域并决定相应的输出值
R 1 ( j , s ) = { x ∣ x ( j ) ≤ s } , R 2 ( j , s ) = { x ∣ x ( j ) > s } R_1(j,s)=\{x|x^{(j)}\le s\},R_2(j,s)=\{x|x^{(j)} > s\} R1(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 \hat{c}_m=\frac{1}{N_m}\sum_{x_i\epsilon R_m(j,s)}y_i c^m=Nm1xiϵRm(j,s)∑yi
x ϵ R m , m = 1 , 2 x\epsilon R_m,m=1,2 xϵRm,m=1,2
继续对两个子区域调用上述步骤,将输入空间划分为M个区域R1,R2,…,Rm,生成决策树。
f ( x ) = ∑ m = 1 M c ^ m I ( x ϵ R m ) f(x)=\sum_{m=1}^{M}\hat{c}_mI(x\epsilon R_m) f(x)=m=1∑Mc^mI(xϵRm)
当输入空间划分确定时,可以用平方误差来表示回归树对于训练数据的预测方法,用平方误差最小的准则求解每个单元上的最优输出值。
∑ x i ϵ R m ( y i − f ( x i ) ) 2 \sum_{x_i\epsilon R_m}(y_i-f(x_i))^2 xiϵRm∑(yi−f(xi))2
x i x_i xi | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
y i y_i yi | 5.56 | 5.70 | 5.91 | 6.40 | 6.80 | 7.05 | 8.90 | 8.70 | 9.00 | 9.05 |
考虑如上所示的连续性变量,根据给定的数据点,考虑1.5,2.5,3.5,4.5,5.5,6.5,7.5,8.5,9.5切分点。对各切分点依次求出R1,R2,c1,c2及m(s),例如当切分点s=1.5时,得到R1={1},R2={2,3,4,5,6,7,8,9,10},其中c1,c2,m(s)如下所示。
c 1 = 1 N m ∑ x i ϵ R m ( j , s ) y i = 1 1 ∑ x i ϵ R 1 ( 1 , 1.5 ) 5.56 = 5.56 c_1=\frac{1}{N_m}\sum_{x_i\epsilon R_m(j,s)}y_i=\frac{1}{1}\sum_{x_i\epsilon R_1(1,1.5)}5.56=5.56 c1=Nm1xiϵRm(j,s)∑yi=11xiϵR1(1,1.5)∑5.56=5.56
c 2 = 1 N m ∑ x i ϵ R m ( j , s ) y i = 1 9 ∑ x i ϵ R 2 ( 1 , 1.5 ) ( 5.70 + 5.91 + . . . + 9.05 ) = 7.50 c_2=\frac{1}{N_m}\sum_{x_i\epsilon R_m(j,s)}y_i=\frac{1}{9}\sum_{x_i\epsilon R_2(1,1.5)}(5.70+5.91+...+9.05)=7.50 c2=Nm1xiϵRm(j,s)∑yi=91xiϵR2(1,1.5)∑(5.70+5.91+...+9.05)=7.50
m ( s ) = min j , s [ min c 1 ∑ x i ϵ R i ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x i ϵ R i ( j , s ) ( y i − c 1 ) 2 ] = 0 + 15.72 = 15.72 m(s)=\min_{j,s}[\min_{c_1}\sum _{x_i\epsilon R_i(j,s)}(y_i-c_1)^2+\min_{c_2}\sum _{x_i\epsilon R_i(j,s)}(y_i-c_1)^2]=0+15.72=15.72 m(s)=j,smin[c1minxiϵRi(j,s)∑(yi−c1)2+c2minxiϵRi(j,s)∑(yi−c1)2]=0+15.72=15.72
依次改变(j,s)对,可以得到s及m(s)的计算结果,如下表所示。
s s s | 1.5 | 2.5 | 3.5 | 4.5 | 5.5 | 6.5 | 7.5 | 8.5 | 9.5 |
---|---|---|---|---|---|---|---|---|---|
m ( s ) m(s) m(s) | 15.72 | 12.07 | 8.36 | 5.78 | 3.91 | 1.93 | 8.01 | 11.73 | 15.74 |
当x=6.5时,此时R1={1,2,3,4,5,6},R2={7,8,9,10},c1=6.24,c2=8.9。**回归树T1(x)**为
T 1 ( x ) = { 6.24 , x < 6.5 8.91 , x ≥ 6.5 T_1(x)=\begin{cases} & 6.24,x<6.5 \\ & 8.91,x\ge 6.5 \end{cases} T1(x)={6.24,x<6.58.91,x≥6.5
f 1 ( x ) = T 1 ( x ) f_1(x)=T_1(x) f1(x)=T1(x)
然后我们利用f1(x)拟合训练数据的残差,如下表所示
x i x_i xi | 1 | 2 | 3 | 4 | 5 | 6 | 7 | 8 | 9 | 10 |
---|---|---|---|---|---|---|---|---|---|---|
y i y_i yi | -0.68 | -0.54 | -0.33 | 0.16 | 0.56 | 0.81 | -0.01 | -0.21 | 0.09 | 0.14 |
用f1(x)拟合训练数据得到平方误差
L ( y , f 1 ( x ) ) = ∑ i = 1 10 ( y i − f 1 ( x i ) ) 2 = 1.93 L(y,f_1(x))=\sum_{i=1}^{10}(y_i-f_1(x_i))^2=1.93 L(y,f1(x))=i=1∑10(yi−f1(xi))2=1.93
第二步求T2(x)与求T1(x)方法相同,只是拟合的数据是上表的残差。可以得到
T 2 ( x ) = { − 0.52 , x < 3.5 0.22 , x ≥ 3.5 T_2(x)=\begin{cases} & -0.52,x<3.5 \\ & 0.22,x\ge 3.5 \end{cases} T2(x)={−0.52,x<3.50.22,x≥3.5
f 2 ( x ) = f 1 ( x ) + T 2 ( x ) = { 5.72 , x < 3.5 6.46 , 3.5 ≤ x ≤ 6.5 9.13 , x ≥ 6.5 f_2(x)=f_1(x)+T_2(x)= \begin{cases} & 5.72,x<3.5 \\ & 6.46,3.5\le x \le 6.5 \\ & 9.13,x\ge 6.5 \end{cases} f2(x)=f1(x)+T2(x)=⎩⎪⎨⎪⎧5.72,x<3.56.46,3.5≤x≤6.59.13,x≥6.5
用f2(x)拟合训练数据的平方误差
L ( y , f 2 ( x ) ) = ∑ i = 1 10 ( y i − f 2 ( x i ) ) 2 = 0.79 L(y,f_2(x))=\sum_{i=1}^{10}(y_i-f_2(x_i))^2=0.79 L(y,f2(x))=i=1∑10(yi−f2(xi))2=0.79
继续求得T3(x)、T4(x)、T5(x)、T6(x),如下所示
T 3 ( x ) = { 0.15 , x < 6.5 − 0.22 , x ≥ 6.5 L ( y , f 3 ( x ) ) = 0.47 T_3(x)=\begin{cases} & 0.15,x<6.5 \\ & -0.22,x\ge 6.5 \end{cases} L(y,f_3(x))=0.47 T3(x)={0.15,x<6.5−0.22,x≥6.5L(y,f3(x))=0.47
T 4 ( x ) = { − 0.16 , x < 4.5 0.11 , x ≥ 4.5 L ( y , f 4 ( x ) ) = 0.30 T_4(x)=\begin{cases} & -0.16,x<4.5 \\ & 0.11,x\ge 4.5 \end{cases} L(y,f_4(x))=0.30 T4(x)={−0.16,x<4.50.11,x≥4.5L(y,f4(x))=0.30
T 5 ( x ) = { 0.07 , x < 6.5 − 0.11 , x ≥ 6.5 L ( y , f 5 ( x ) ) = 0.23 T_5(x)=\begin{cases} & 0.07,x<6.5 \\ & -0.11,x\ge 6.5 \end{cases} L(y,f_5(x))=0.23 T5(x)={0.07,x<6.5−0.11,x≥6.5L(y,f5(x))=0.23
T 6 ( x ) = { − 0.15 , x < 2.5 0.04 , x ≥ 2.5 T_6(x)=\begin{cases} & -0.15,x<2.5 \\ & 0.04,x\ge 2.5 \end{cases} T6(x)={−0.15,x<2.50.04,x≥2.5
f 6 ( x ) = f 5 ( x ) + T 6 ( x ) = T 1 ( x ) + . . . + T 6 ( x ) = { 5.63 , x < 2.5 5.82 , 2.5 ≤ x ≤ 3.5 6.56 , 3.5 ≤ x ≤ 4.5 6.83 , 4.5 ≤ x ≤ 6.5 8.95 , x ≥ 6.5 f_6(x)=f_5(x)+T_6(x)=T_1(x)+...+T_6(x)= \begin{cases} & 5.63,x<2.5 \\ & 5.82,2.5\le x \le 3.5 \\ & 6.56,3.5\le x \le 4.5 \\ & 6.83,4.5\le x \le 6.5 \\ & 8.95,x\ge 6.5 \end{cases} f6(x)=f5(x)+T6(x)=T1(x)+...+T6(x)=⎩⎪⎪⎪⎪⎪⎪⎨⎪⎪⎪⎪⎪⎪⎧5.63,x<2.55.82,2.5≤x≤3.56.56,3.5≤x≤4.56.83,4.5≤x≤6.58.95,x≥6.5
用f6(x)拟合训练数据的平方损失误差如下所示,假设此时已经满足误差要求,那么f(x)=f6(x)便是所求的回归树。
L ( y , f 6 ( x ) ) = ∑ i = 1 10 ( y i − f 6 ( x i ) ) 2 = 0.71 L(y,f_6(x))=\sum_{i=1}^{10}(y_i-f_6(x_i))^2=0.71 L(y,f6(x))=i=1∑10(yi−f6(xi))2=0.71
我们经常需要通过改变参数来让模型达到更好的分类或回归结果,具体参数设置可参考sklearn官方教程。
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import make_classification
X,y=make_classification(n_samples=1000,n_features=4,
n_informative=2,n_redundant=0,
random_state=0,shuffle=0)
print(X[:10],y[:10])
# X
# [[-1.66853167 -1.29901346 0.2746472 -0.60362044]
# [-2.9728827 -1.08878294 0.70885958 0.42281857]
# [-0.59614125 -1.37007001 -3.11685659 0.64445203]
# [-1.06894674 -1.17505738 -1.91374267 0.66356158]
# [-1.30526888 -0.96592566 -0.1540724 1.19361168]
# [-2.18261832 -0.97011387 -0.09816121 -0.88661426]
# [-1.24797892 -1.13094525 -0.14735366 1.05980629]
# [-1.35308792 -1.06633681 0.02624662 -0.11433516]
# [-1.13449871 -1.27403448 0.74355352 0.21035937]
# [-0.38457445 -1.08840346 -0.00592741 1.36606007]]
# y
# [0 0 0 0 0 0 0 0 0 0]
clf=RandomForestClassifier(max_depth=2,random_state=0)
clf.fit(X,y)
print(clf.feature_importances_)
# [ 0.17287856 0.80608704 0.01884792 0.00218648]
print(clf.predict([[0,0,0,0]]))
# [1]