一、决策树
可以认为是 if-then 规则的集合。优点是模型具有可读性,分类速度快。
包括三个步骤:特征选择、生成和剪枝。
决策树常用的算法有 ID3,C4.5和CART
1. 特征选择:
根据哪个特征划分特征空间(分类),引出熵和特征增益的概念
假设X是一个取有限个值的离散随机变量,其概率分布为:
P
(
X
=
x
i
)
=
p
i
P(X=x_i)=p_i
P(X=xi)=pi
随机变量X的熵定义为:
H
(
p
)
=
−
∑
p
i
l
o
g
p
i
H(p)=-\sum p_ilogp_i
H(p)=−∑pilogpi
熵越大,随机变量的不确定性就越大。
当随机变量只取两个值 [0, 1] 时,
H
(
p
)
H(p)
H(p)随p变化如下:
经验条件熵
H
(
Y
∣
X
)
H(Y|X)
H(Y∣X):
H
(
Y
∣
X
)
=
∑
p
i
H
(
Y
∣
X
=
x
i
)
H(Y|X)=\sum p_iH(Y|X=x_i)
H(Y∣X)=∑piH(Y∣X=xi)
信息增益:
g
(
D
,
A
)
=
H
(
D
)
−
H
(
D
∣
A
)
g(D,A)=H(D)-H(D|A)
g(D,A)=H(D)−H(D∣A)
训练集 D,特征 A。决策树运用信息增益准则选择特征。
信息增益的计算方法:
(|X|表示样本 X 的个数,加下标表示 当前样本分类的各类个数):
- 输入:训练集 D 和特征 A
- 输出:特征 A 对训练集 D 的信息增益 g(D,A)
- a. 计算数据集D 的经验熵 H(D)
H ( D ) = − ∑ ∣ C k ∣ D l o g 2 ∣ C k ∣ D H(D)=-\sum \frac{|C_k|}{D}log_2\frac{|C_k|}{D} H(D)=−∑D∣Ck∣log2D∣Ck∣ - b. 计算特征A对数据集D 的经验条件熵 H(D|A)
H ( D ∣ A ) = ∑ ∣ D i ∣ ∣ D ∣ H ( D ) H(D|A)=\sum \frac{|D_i|}{|D|}H(D) H(D∣A)=∑∣D∣∣Di∣H(D) - c. 计算信息增益 g(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)
类似的,定义信息增益比:
- 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 ) = − ∑ ∣ D i ∣ ∣ D ∣ l o g 2 ∣ D i ∣ ∣ D ∣ H_A(D)=-\sum \frac{|D_i|}{|D|}log_2\frac{|D_i|}{|D|} HA(D)=−∑∣D∣∣Di∣log2∣D∣∣Di∣
根据信息增益准则的特征选择方法时:对训练数据集(或子集)D,计算其每个特征的信息增益,并比较他们的大小,选择信息增益最大的特征。
基尼系数选择划分特征
G
i
n
i
(
D
)
=
∑
k
=
1
c
∑
k
′
≠
k
p
k
p
k
′
=
1
−
∑
k
=
1
c
p
k
2
=
1
−
∑
k
=
1
c
(
D
k
D
)
2
Gini(D)=\sum_{k=1}^c\sum_{k' \not =k}p_k p_{k'}=1-\sum_{k=1}^cp_k^2=1-\sum_{k=1}^c(\frac{D^k}{D})^2
Gini(D)=∑k=1c∑k′=kpkpk′=1−∑k=1cpk2=1−∑k=1c(DDk)2
直观来看, G i n i ( D ) Gini(D) Gini(D) 反映了从数据集 D D D 中随机抽取两个样本,其类别标记不一致的概率,因此 G i n i ( D ) Gini(D) Gini(D) 越小,则数据集 D D D 的纯度越高。
对于样本D,个数为|D|,根据特征A的某个值a,把D分成|D1|和|D2|,则在特征A的条件下,样本D的基尼系数表达式为:
G
i
n
i
_
i
n
d
e
x
(
D
,
A
)
=
∣
D
1
∣
∣
D
∣
G
i
n
i
(
D
1
)
+
∣
D
2
∣
∣
D
∣
G
i
n
i
(
D
2
)
Gini\_index(D,A) = \frac{|D^1|}{|D|}Gini(D^1)+ \frac{|D^2|}{|D|}Gini(D^2)
Gini_index(D,A)=∣D∣∣D1∣Gini(D1)+∣D∣∣D2∣Gini(D2)
在划分特征时,找到基尼系数最小的属性作为最优划分属性即可。
2. 决策树生成算法:以ID3为例
具体方法:从根节点(root)开始,对结点计算所有可能的特征的信息增益,选择信息增益最大的特征作为结点特征,由该特征的不同取值建立子结点;再对子结点递归调用方法构造决策树,直到所有特征的增益很小或者没有特征停止。相当于极大似然法进行概率模型的选择。
算法主要步骤:
输入:训练集 D ,特征 A ,阈值
σ
\sigma
σ
输出:树 T
- 若D中所有实例同属于 C k C_k Ck,则 T 为单结点数,并将类 C k C_k Ck作为结点类标记,返回T。
- 若 A 非空,则T 为单节点树,并将 D 中实例数最大的类 Ck 作为该节点的类标记,返回T。
- 计算 A 中各特征对 D 的信息增益 g,选择信息增益最大的特征 Ag
- 若 g < 阈值 σ \sigma σ,则置 T 为单结点树,并将 D 中实例树最大的类 C k C_k Ck作为该节点的类标记,返回T。
- 否则,对 Ag 中每个可能的取值 ai,依照 Ag=ai 将 D 划分为 若干非空子集 Di,将Di 中实例数最大的类作为标记,构建子结点,由结点和子结点构成树,返回T。
- 对第 i 个子结点,以 Di为训练集,以 A-{Ag}为特征集,递归调用 1-5得到子树 Ti,返回T
最核心的部分:
单独信息增益–>选择最大特征–>条件信息增益–>分类
条件信息增益(赋成 单独信息增益)–>选择最大特征–>条件信息增益–>分类
主要构建决策树的算法:
- ID3 用信息增益选择特征
- C4.5 算法用信息增益比选择特征
- CART 用基尼系数选择特征
3. 决策树的剪枝
决策树生成算法对训练数据的分类很准确,单对于未知的测试数据分类确并不那么准确,即出现过拟合现象。过拟合的原因在于学习时过多的考虑如何提高队训练数据的正确分类,以至于模型树过于复杂。
将树简化的过程称为剪枝。剪枝从已生成的树上裁剪一些子树和叶结点,并将其根节点或父节点作为新的叶节点,从而简化分类树模型。
决策树的剪枝往往通过极小化决策树整体的损失函数或代价函数来实现。设树T的叶节点个数为 |T|,t 是树 T 的叶节点,该叶节点有 Nt个样本点,其中 k 类的样本点有 Ntk个, Ht(T)为叶节点 t 的经验熵,则决策树学习的损失函数可以定义为
C α ( T ) = ∑ N t H t ( T ) + α ∣ T ∣ = C T + α ∣ T ∣ C_\alpha(T)=\sum N_tH_t(T)+\alpha|T|=C_T+\alpha|T| Cα(T)=∑NtHt(T)+α∣T∣=CT+α∣T∣。
C T C_T CT 相当于模型对训练集的预测误差,即模型与数据集的拟合程度。 α ∣ T ∣ \alpha|T| α∣T∣为正则项, α \alpha α大则促使模型复杂度降低, 小则促使模型复杂度上升。
剪枝,就是当
α
\alpha
α确定时,选择损失函数较小的模型,即损失函数最小的子树。
当
α
∣
T
∣
\alpha|T|
α∣T∣确定时,子树越大,往往与训练数据的拟合越好,但是模型的复杂度就越高;相反,子树越小,模型的复杂度越低,但是往往与训练数据的拟合不好。
损失函数就是为了平衡两者。
可以看出,决策树的生成只考虑了它通过提高信息增益(或信息增益比)对训练数据进行更好的拟合,而决策树剪枝则通过优化损失函数还考虑减小了模型复杂度。
决策树生成学习局部的模型,剪枝则学习整体的模型。
树的剪枝算法:
输入:生成树 T,参数
α
\alpha
α
输出:剪枝后的子树
T
α
T_\alpha
Tα
- 计算每个结点的经验熵
- 递归的从树的叶节点向上回缩,损失函数判断回缩前后的整体树的损失函数,若回缩前的损失函数更大,则剪枝
- 重复2,直到得到损失函数最小的子树 T α T_\alpha Tα
4. 三种决策树算法的对比总结
ID3 | C4.5 | CART | |
---|---|---|---|
特征选择方法 | 信息增益 | 信息增益比 | 基尼系数 |
分支数 | 可多分支 | 可多分支 | 二叉树 |
能否处理连续特征 | 否 | 能,排序选均值得到候选划分点,选择信息增益比大的做划分点 | 能,回归时通过最小化均方差能找到最靠谱的分支依据 |
优缺点 | 偏好可取值数目多的特征 | 偏好可选值数目少的特征。先从候选划分属性中找出信息增益高于平均水平的属性,再从中选择信息增益比高的 | 之前处理的特征可以多次使用 |
二、Random Forest 是什么?
随机森林是一种 Bagging 方法。生成步骤如下:
- 一个样本容量为N的样本,有放回的抽取N次,每次抽取1个,最终形成了N个样本。用这选择好了的N个样本用来训练一个决策树,作为决策树根节点处的样本。
- 当每个样本有M个属性时,在决策树的每个节点需要分裂时,随机从这M个属性中选取出m个属性,满足条件m << M。然后从这m个属性中采用某种策略(比如说信息增益)来选择1个属性作为该节点的分裂属性。
- 决策树形成过程中每个节点都要按照步骤2来分裂(很容易理解,如果下一次该节点选出来的那一个属性是刚刚其父节点分裂时用过的属性,则该节点已经达到了叶子节点,无须继续分裂了)。一直到不能够再分裂为止。注意整个决策树形成过程中没有进行剪枝。
- 按照步骤1~3建立大量的决策树,这样就构成了随机森林了。
总结一下:构建出 k 个含有 N 个样本的决策树(子学习器),再把这些学习器集合成一个学习器。通常对分类任务采用投票法,对回归任务采用平均法,可以降低均值。
随机森林的优点:
- 它可以出来很高维度(特征很多)的数据,并且不用降维,无需做特征选择
- 它可以判断特征的重要程度
- 可以判断出不同特征之间的相互影响
- 训练速度比较快,可以并行计算
- 对于不平衡的数据集来说,它可以平衡误差。
- 如果有很大一部分的特征遗失,仍可以维持准确度。
缺点:
- 随机森林已经被证明在某些噪音较大的分类或回归问题上会过拟合。
- 对于有不同取值的属性的数据,取值划分较多的属性会对随机森林产生更大的影响,所以随机森林在这种数据上产出的属性权值是不可信的
sklearn RF参数:
随机森林的分类学习器为RandomForestClassifier,回归学习器为RandomForestRegressor.
使用方法:
from sklearn.datasets import make_classification
from sklearn.ensamble import RandomForestClassifier
X, y = make_classification(n_samples=1000, n_features=20,
n_informative=2, n_redundant=0,
random_state=0, shuffle=False)
rfc = RandomForestClassifier(max_depth=2, random_state=0)
rfc.fit(X, y)
主要参数
make_classification(n_samples=1000, n_features=20,
n_informative=2, n_redundant=2)
n_samples:样本数
n_features:特征数
信息功能的数量。 每个类由许多高斯簇组成,每个簇位于超立方体的顶点周围,位于n_informative:维度为' n_informative ' 的子空间。 对于每个聚类,信息特征独立于N(0,1),然后在每个聚类内随机线性组合,以增加协方差。 然后将这些簇放置在超立方体的顶点上。
n_redundant:冗余特性的数量。 这些特征是由信息特征的随机线性组合产生的。
RandomForestClassifier(
n_estimators=10, criterion=’gini’,
max_depth=None,min_samples_split=2,
min_samples_leaf=1, min_weight_fraction_leaf=0.0,
n_estimators:决策树个数
criterion:哪种指标构建决策树,gini 和 entropy
max_depth:树的最大深度。 如果为None,则节点将展开,直到所有叶子都是纯的,或者直到所有叶子包含小于min_samples_split的样本。
min_samples_split:分裂一个内部节点所需的最小样本数。默认为2
三、 介绍一下各种Boost方法,Grandient Boost, AdaBoost,XGBoost、 LightBoost,CatBoost 的区别
对于分类问题,给定一个训练样本集,求比较粗糙的分类规则(弱分类器)要比求精确的分类规则(强分类器)容易得多。Boosting 方法就是从弱学习算法出发,反复学习得到一系列弱分类器,然后组合这些弱分类器,构成一个强分类器。大多数的提升方法都是改变训练数据集的概率分布(权值分布),针对不同的训练数据分布调用弱分类算法学习一系列弱分类器。
先来看一下 Boosting 方法的基本公式
F
n
(
x
)
=
F
m
−
1
(
x
)
+
arg min
h
∑
i
=
1
n
(
y
i
,
F
m
−
1
(
x
i
)
+
h
(
x
i
)
)
F_n(x)=F_{m-1}(x)+ \argmin_h\sum_{i=1}^n(y_i,F_{m-1}(x_i)+h(x_i))
Fn(x)=Fm−1(x)+argminh∑i=1n(yi,Fm−1(xi)+h(xi))
通俗解释就是把
F
m
−
1
(
x
)
F_{m-1}(x)
Fm−1(x) 当作前一轮的结果,前一轮可能已经包含了若干个树模型,在往前一轮的结果中添加新的子树的时候,要满足条件——新加入的子树构成的模型,结果要比之前的更好。
1. AdaBoost
对提升方法来说,有两个问题:
- 在每一轮如何改变训练数据的权值分布或概率分布;
思想:提高前一轮被弱分类器错误分类的样本的权值,降低被正确分类的样本的权值,这样一来,那些没有得到正确分类的数据,由于其权值的加大而受到后一轮的弱分类器的更大关注。于是,分类问题被一系列弱分类器“分而治之”。 - 如何将弱分类其组合成一个强分类器。
思想:弱分类器的组合,采取加权多数表决的方法。具体的,加大分类误差小的弱分类器的权值,使之在表决中作用更大;减小分类误差大的弱分类器的权值,使之在表决中作用较小。
2. Gradient Boost (Decision Tree)
提升树利用加法模型于前向分布算法实现学习的优化过程。当损失函数是平方损失和指数损失时,每一步优化都是很简单的。但对于一般损失函数而言,往往每一步的优化并不那么容易。针对这一问题,提出梯度提升算法,利用最速下降的近似方法,关键是利用损失函数的负梯度在当前模型的值作为回归问题提升树算法中的残差的近似值,拟合一个回归树。
3. XGBoost
是GBDT的一个具体的实现算法。
XGBoost的目标函数是一个串联的加法模型,并增加了正则项及常数项。然后基于泰勒公式做二阶展开:
XGBoost的子模型树和决策树模型一样,要依赖节点递归分裂的贪心准则来实现树的生成。除此外,XGBoost还支持近似算法,解决数据量过大超过内存、或有并行计算需求的情况。
在节点分裂上,基本思路和CART一样,对特征值排序后遍历划分点,将其中最优的分裂收益作为该特征的分裂收益,选取具有最优分裂收益的特征作为当前节点的划分特征,按其最优划分点进行二叉划分,得到左右子树。
核心算法:
- 不断地添加树,不断地进行特征分裂来生长一棵树,每次添加一个树,其实是学习一个新函数f(x),去拟合上次预测的残差。
- 当我们训练完成得到k棵树,我们要预测一个样本的分数,其实就是根据这个样本的特征,在每棵树中会落到对应的一个叶子节点,每个叶子节点就对应一个分数
- 最后只需要将每棵树对应的分数加起来就是该样本的预测值。
分裂后的目标函数值比单子叶子节点的目标函数的增益,同时为了限制树生长过深,还加了个阈值,只有当增益大于该阈值才进行分裂。从而继续分裂,形成一棵树,再形成一棵树,每次在上一次的预测基础上取最优进一步分裂/建树。
XGBoost与GBDT有什么不同
- GBDT是机器学习算法,XGBoost是该算法的工程实现。
- 在使用CART作为基分类器时,XGBoost显式地加入了正则项来控制模型的复杂度,有利于防止过拟合,从而提高模型的泛化能力。
- GBDT 只使用了代价函数的一阶导数信息,XGBoost 对代价函数进行二阶泰勒展开,可以同时使用一阶和二阶导数。
- 传统的GBDT在每轮迭代时使用全部的数据,XGBoost则采用了与随机森林相似的策略,支持对数据进行采样。
- 传统的GBDT没有设计对缺失值进行处理,XGBoost能够自动学习出缺失值的处理策略。
4. LightBoost
LightGBM提出的主要原因就是为了解决GBDT在海量数据遇到的问题,让GBDT可以更好更快地用于工业实践。
相较于XGBoost,做出了如下优化。
- 基于Histogram的决策树算法。
- 单边梯度采样 Gradient-based One-Side Sampling(GOSS):使用GOSS可以减少大量只具有小梯度的数据实例,这样在计算信息增益的时候只利用剩下的具有高梯度的数据就可以了,相比XGBoost遍历所有特征值节省了不少时间和空间上的开销。
- 互斥特征捆绑 Exclusive Feature Bundling(EFB):使用EFB可以将许多互斥的特征绑定为一个特征,这样达到了降维的目的。
- 带深度限制的Leaf-wise的叶子生长策略:大多数GBDT工具使用低效的按层生长 (level-wise) 的决策树生长策略,因为它不加区分的对待同一层的叶子,带来了很多没必要的开销。实际上很多叶子的分裂增益较低,没必要进行搜索和分裂。LightGBM使用了带有深度限制的按叶子生长 (leaf-wise) 算法。
- 直接支持类别特征(Categorical Feature)
- 支持高效并行
- Cache命中率优化
5. CatBoost
CatBoost 由 Yandex 于 2017 年开发。 由于它使用 One-Hot-Encoding 将所有分类特征转换为数值,因此名称来自 Categorical Boosting。将字符串自动转化成索引值输入的同属他还处理了缺失的数值。而且它也比 XGBoost 快得多。与其他 boosting 方法不同,Catboost 与对称树进行区分,对称树在每个级别的节点中使用相同的拆分。
XGBoost 和 LGBM 计算每个数据点的残差并训练模型以获得残差目标值。它针对迭代次数重复此操作,从而训练并降低残差,从而达到目标。由于这种方法适用于每个数据点,因此在泛化方面可能会很弱并导致过度拟合。
Catboost 还计算每个数据点的残差,并使用其他数据训练的模型进行计算。这样,每个数据点就得到了不同的残差数据。这些数据被评估为目标,并且通用模型的训练次数与迭代次数一样多。由于许多模型将根据定义实现,因此这种计算复杂性看起来非常昂贵并且需要太多时间。但是catboost通过有序提升但可以在更短的时间内完成。例如,catboost不是从每个数据点 (n+1)th 计算的残差的开头开始,俄日是计算(n+2)个数据点,应用(n+1)个数据点,依此类推
4. RF和 GBDT 的区别
1)样本选择上:
-
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
-
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
-
Bagging:使用均匀取样,每个样例的权重相等
-
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
-
Bagging:所有预测函数的权重相等。
-
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
-
Bagging:各个预测函数可以并行生成
-
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
5)预处理
-
Bagging 对异常值不敏感,而 Boosting 对异常值比较敏感
-
Bagging 不需要进行特征归一化。而 Boosting 则需要进行特征归一化
6) 结果
- Bagging 是减少模型的方差,而 Boosting 是减少模型的偏差
5. 如何从偏差和方差解释 Bagging 和 Boosting
偏差指预测值与真实值的偏离程度,反映了模型本身的拟合能力。
方差反应的是预测值与真实值之间的距离。描述模型的泛化能力。
Boosting 每个新的分类器都在前一个分类器的预测结果上再训练,呈现累加的效果,目的是降低偏差。
bagging 通过各个子模型投票选择最终结果,有一个平均的过程,所以可以降低方差
参考文献
李航——《统计学习方法》
机器学习分类算法之XGBoost(集成学习算法)
Kaggle神器LightGBM最全解读!
CatBoost