文章目录
一、决策树
- 特征选择与划分(离散、连续特征)
- 决策树生成(可以看做if-else 或者 概率模型)
- 剪枝(将过于详细的叶节点划分合并到父节点,构成新的更简单的叶节点,对生成的决策树使用损失函数 C α ( T ) = C ( T ) + α ∣ T ∣ C_\alpha(T)=C(T) + \alpha|T| Cα(T)=C(T)+α∣T∣,其中第二项是决策树叶节点数量的惩罚项(正则)
1.0 属性选择评价指标相关概念
- 熵:描述某种状态,自然界中的熵都趋向于自发增大。(热力学中熵表示混乱程度,信息论中表示不确定性)
- 信息熵: H ( X ) = − ∑ i = 1 n 个 取 值 p i log p i H(X) = -\sum_{i=1}^{n个取值}p_i\log p_i H(X)=−∑i=1n个取值pilogpi,描述随机事件的不确定性,当每个取值概率相等时,不确定性(熵)最大。
- 条件熵:已知随机变量X的条件下,随机变量Y的熵。
- 信息熵增益:即互信息, g ( Y , A ) = H ( Y ) − H ( Y ∣ A ) g(Y, A) = H(Y) - H(Y|A) g(Y,A)=H(Y)−H(Y∣A)
- 信息熵增益比: g R ( Y , A ) = g ( Y , A ) H ( A ) ) g_R(Y, A) = \frac{g(Y, A)}{H(A))} gR(Y,A)=H(A))g(Y,A) ,消除特征取值数量的影响。
- 基尼指数:一个节点集合中分类误差率
1.1 ID3算法(多叉树)
- 属性选择:信息增益
- 用途:多分类任务
1.2 C4.5算法(多叉树)
- 属性选择:信息增益比
- 用途:多分类
- 优点:避免优先选择使数据过于分散的属性(一个属性有很多不同的属性值,每个样本对应的属性值都不同,这样的属性不具有泛化性)。
1.3 CART算法(二叉树)
- 属性选择:基尼指数
- 用途:分类及回归
- 属性
j
j
j选择以及切点
s
s
s划分的选择:
min j , s [ min c 1 ∑ x i ∈ R 1 ( j , s ) ( y i − c 1 ) 2 + min c 2 ∑ x 1 ∈ R 2 ( j , s ) ( y i − c 2 ) 2 ] \min _{j, s}\left[\min _{c_{1}} \sum_{x_{i} \in R_{1}(j, s)}\left(y_{i}-c_{1}\right)^{2}+\min _{c_{2}} \sum_{x_{1} \in R_{2}(j, s)}\left(y_{i}-c_{2}\right)^{2}\right] j,smin⎣⎡c1minxi∈R1(j,s)∑(yi−c1)2+c2minx1∈R2(j,s)∑(yi−c2)2⎦⎤
其中 j j j为各个属性下标, s s s为选择的切点,将当前划分单元再次划分为两个新单元 R 1 ( j , s ) R_1(j,s) R1(j,s) 和 R 2 ( j , s ) R_2(j,s) R2(j,s),各个单元的预测值为单元内包含所有样本的均值 c i c_i ci
二、集成学习
集成方法分为bagging, boosting, 特征选择与组合
2.1 Bagging
- 思想:通过对数据集进行独立的随机抽样,训练多个相互独立的学习器(有放回的采样)
2.1.1 随机森林
- 多个弱学习器之间相互独立,最终通过投票/平均的方式结合。
- 为什么叫随机:
-
- 每个子学习器对数据都是右放回的从整个数据集中随机采样(数据选择的随机性)
-
- 每个子学习器,只选择所有属性中的一部分属性作为属性子集(属性选择的随机性)
-
2.2 Boosting
- 弱学习器之间有先后依赖关系,学习第t个模型时要用到前t-1个模型的输出。
2.2.1 xgBoost
2.2.1.1 与GBDT的关系
- xgboost是GBDT的一个实现,他们都是同一个模型
- 这个实现有以下特殊点:
- 优化过程中使用了目标函数的二阶泰勒展开,而不是经典gbdt的一阶展开(直接使用残差作为负梯度)
- 由于使用新的目标函数,可以加入对弱学习器的正则项(叶节点数目)
- 缺失值自动处理策略:尝试将缺失值样本分别划分到左子树和右子树看哪种更优,而无需对缺失值进行预填充。
2.2.1.2 原理
- 添加第t棵树的优化目标:
O b j ( t ) = ∑ i = 1.. n l ( y i , y ^ i ( t ) ) + ∑ k = 1.. K Ω ( f t ) = ∑ i = 1.. n ( y i − ( f ( t ) + y ^ i ( t − 1 ) ) ) 2 + ∑ k = 1.. K Ω ( f t ) = ∑ i = 1.. n l ( y i − y ^ i ( t − 1 ) , f ( t ) ) + ∑ k = 1.. K Ω ( f t ) \begin{aligned}Obj^{(t)} &= \sum_{i=1..n}l(y_i, \hat y_i^{(t)}) + \sum_{k=1..K}\Omega(f_t)\\ &= \sum_{i=1..n}(y_i - (f^{(t)} + \hat y_i^{(t-1)}))^2 + \sum_{k=1..K}\Omega(f_t)\\ &=\sum_{i=1..n}l(y_i - \hat y_i^{(t-1)}, f^{(t)}) + \sum_{k=1..K}\Omega(f_t) \end{aligned} Obj(t)=i=1..n∑l(yi,y^i(t))+k=1..K∑Ω(ft)=i=1..n∑(yi−(f(t)+y^i(t−1)))2+k=1..K∑Ω(ft)=i=1..n∑l(yi−y^i(t−1),f(t))+k=1..K∑Ω(ft) - 训练时,使用二阶泰勒展开对上式做近似变换,这样做的目的:1. 由于正则项有w的平方,使用泰勒二阶展开后两个可以结合成一个漂亮的形式,而且即使其他损失函数也能有统一个一阶+二阶导数的形式
- 使用二阶导数后拟合会更快。(类似Adam?)
2.2.2 adaBoost
- 每一个模型,根据其输出的错误率对样本重新分配权重。