特征工程(Feature Engineering)特征工程是将原始数据转化成更好的表达问题本质的特征的过程,使得将这些特征运用到预测模型中能提高对不可见数据的模型预测精度。
特征工程简单讲就是发现对因变量y有明显影响作用的特征,通常称自变量x为特征,特征工程的目的是发现重要特征。
如何能够分解和聚合原始数据,以更好的表达问题的本质?这是做特征工程的目的。
特征工程是数据挖掘模型开发中最耗时、最重要的一步。
深度了解特征工程 - 知乎 (zhihu.com)
类别特征的编码方式有:LabelEncoder、OneHotEncoder、二值化编码、基于统计的类别编码、直方图编码与计数编码(count)、target encoding 目标编码、meaning code,catboost encode
直方图编码与计数编码(count)
假设类别特征f1=【A,A,B,B,B,C,C】,对应的二分类标签为【0,1,0,1,1,0,0】,则我们是这样来计算类别特征f1中对应的类别的编码值的:
以A为例,类别特征f1的值为A的样本有两个,这两个样本的标签分别为【0,1】,则A被直方图编码为【1/2,1/2】=【0.5,0.5】(A的样本一共有2个所以分母为2,其中一个样本标签为1,一个样本标签为0),实际上就是计算取值为A的样本中,不同类别样本的比例,然后用这个比例来替换原始的类别标签,这里需要强调的是,无论是直方图编码还是我们后面要介绍的target encoding,本质上都是用类别特征的统计量来代替原来的类别值的,没什么神秘的地方,很好理解。
如法炮制,我们来对B进行类别编码,f1值为B的一共3个样本,其中一个样本标签为0,两个样本标签为1,所以B被编码为【1/3,2/3】,很好理解了。同样对于C,一共两个样本,并且两个样本标签均为0,则编码为【2/2,0】。
直方图编码存在以下问题:
1、没有考虑到类别特征中不同类别的数量的影响,举个例子,假设样本的某个类别特征为【A,A,A,A,A,A,B】,对应的标签为【0,0,0,1,1,1,0】,则根据直方图编码的公式得到的结果为A:【1/2,1/2】,B:【1,0】,然而这实际上对于A来说是很不公平的,因为B的样本数量太少,计算出来的结果根本不能算是明显的统计特征,而很可能是一种噪音,这实际上是一种非常“过拟合”的计算方式,因为一旦测试集中的样本有多个B之后,B的直方图编码的结果很可能发生非常大的变化;
2、假设没有1中出现的情况,所有的类别A,B的数量都比较均匀,直方图编码还是存在着一个潜在的隐患,直方图编码的计算非常依赖于训练集中的样本标签的分布情况,以f1特征的那个例子为例,实际上直方图这么计算的隐含的假设是潜在的所有的数据的在类别f1上的每一个类别计算出来的结果可以用训练集的结果来近似代替,简单说比如我在训练集中算出来A的直方图编码为【1/2,1/2】,即类别为A的样本中有一半标签0的样本,一半标签1的样本,那么一旦测试集的分布情况发生改变,或者是训练集本身的采样过程就是有偏的,则直方图编码的结果就是完全错误的,(比如全样本中,类别为A的样本其实只有10%是标签为0的,90%标签为1的,则这个时候A的直方图编码为【1/10,9/10】,训练集的产生可能是有偏的);
计数编码:就是根据每一个类别特征的类别对二分类标签进行sum求和得到每个类别中样本标签为1的总数。
target encode: 对于C分类问题,目标编码(target encode)后只需要增加C−1个属性列,如果C远远小于N,则相对one-hot-encoding可以节省很多内存. 其出发点是用概率P(y=yi|x=xi)代替属性值x, 其中x表示属性值,y表示类别值. 但实际问题中,经常会遇到x=xi对应的样本数目比较少,导致对P(y=yi|x=xi)的计算不准确. 所以后来的改进结果是引入先验概率P(y=yi),公式转换成 :
细心一点就可以发现,如果上述不引入先验概率P以及 λ \lambda λ 项,其实就是我们前面提到的直方图编码。直方图编码是target encode和mean encode的前辈了。
其中j∈[0,C),ni是训练集中xi的样本个数,λ(ni)∈[0,1]负责计算两个概率值的可靠性,针对应用有不同的定义方法,如下是一个例子 :
(我们的category_encoders库使用的就是上面这个例子的计算方式,其中参数k和f分别是我们的 min_sample_leaf和smoothing参数), 二者都是一个可调参数,当x在训练集中出现次数n=k时,λ(n)=0.5,两个概率的可靠性相等,随者n的增大,先验概率P(y=yi)的可靠性逐渐降低。
对于回归问题:回归问题同样可以使用均值编码,只需要把概率换成均值
target encode是针对高基数类别特征进行处理手段的最好的选择之一。但它也有缺点,就是容易过拟合,因为所有的统计计算都是基于训练集来的,所以一旦新数据集的分布发生变化,就会产生类似于过拟合所产生的不良的训练效果。
mean code: 为了解决target encode的过拟合问题,引入了交叉验证的方法
count encoding 有个缺点:测试集和训练集分布不同,导致特征频率不一样怎么办? 可以取 log 减少过拟合程度
特征交叉本质上是一个笛卡尔积,两个特征列进行笛卡尔积。笛卡尔积中,如果同时满足两者的条件,则结果为1;否则为0,因此这种方式更加适合离散型的数据特征。一般来说,先把数据进行分档处理,再把分档的结果进行特征交叉,此时可以获得更好的数据特征,分档处理可以对数据降维,从而极大地简化计算量。
特征选择是特征工程里的一个重要问题,其目标是 寻找最优特征子集 。特征选择能剔除不相关(irrelevant)或冗余(redundant)的特征,从而达到减少特征个数, 提高模型精确度,减少运行时间的目的 。
特征选择的一般过程:
- 生成子集:搜索特征子集,为评价函数提供特征子集
- 评价函数:评价特征子集的好坏
- 停止准则:与评价函数相关,一般是阈值,评价函数达到一定标准后就可停止搜索
- 验证过程:在验证数据集上验证选出来的特征子集的有效性
但是, 当特征数量很大的时候, 这个搜索空间会很大,如何找最优特征还是需要一些经验结论。
https://zhuanlan.zhihu.com/p/74198735
常用的有:
发散性
或相关性
对各个特征进行评分,设定阈值或者待选择特征的个数进行筛选过滤法
基本想法是:分别对每个特征 x i x_i xi ,计算 x i x_i xi 相对于类别标签 y y y 的信息量 S ( i ) S(i) S(i) ,得到 n n n 个结果。然后将 n n n 个 S ( i ) S(i) S(i) 按照从大到小排序,输出前 k k k 个特征。显然,这样复杂度大大降低。那么关键的问题就是使用什么样的方法来度量 S ( i ) S(i) S(i) ,我们的目标是选取与 y y y 关联最密切的一些 特征 x i x_i xi 。
- Pearson 相关系数:公式为: C O R ( X , Y ) = ∑ i = 1 n ( X i − X ‾ ) ( Y i − Y ‾ ) ∑ i = 1 n ( X i − X ‾ ) 2 ∑ i = 1 n ( Y i − Y ‾ ) 2 COR(X, Y)=\frac{\sum_{i=1}^{n}(X_i-\overline{X})(Y_i-\overline{Y})}{\sqrt{\sum_{i=1}^{n}(X_i-\overline{X})^2\sum_{i=1}^{n}(Y_i-\overline{Y})^2}} COR(X,Y)=∑i=1n(Xi−X)2∑i=1n(Yi−Y)2∑i=1n(Xi−X)(Yi−Y) , 由公式可知,Pearson 相关系数是用协方差除以两个变量的标准差得到的,虽然协方差能反映两个随机变量的相关程度(协方差大于0的时候表示两者正相关,小于0的时候表示两者负相关),但其数值上受量纲的影响很大,不能简单地从协方差的数值大小给出变量相关程度的判断。为了消除这种量纲的影响,于是就有了相关系数的概念。当两个变量的方差都不为零时,相关系数才有意义,相关系数的取值范围为[-1,1]。Scipy的pearsonr方法能够同时计算相关系数和p-value
- 卡方验证:经典的卡方检验是检验类别型变量对类别型变量的相关性。假设自变量有N种取值,因变量有M种取值,考虑自变量等于i且因变量等于j的样本频数的观察值与期望的差距,构建统计量: χ 2 = ∑ ( A − E ) 2 E \chi^2=\sum\frac{(A-E)^2}{E} χ2=∑E(A−E)2 不难发现,这个统计量的含义简而言之就是自变量对因变量的相关性。
包装法
基本思想:基于hold-out方法,对于每一个待选的特征子集,都在训练集上训练一遍模型,然后在测试集上根据误差大小选择出特征子集。需要先选定特定算法,通常选用普遍效果较好的算法, 例如Random Forest, SVM, kNN等等。
特征重要性评分是一种为输入特征评分的手段,其依据是输入特征在预测目标变量过程中的有用程度。
特征重要性有许多类型和来源,尽管有许多比较常见,比如说统计相关性得分,线性模型的部分系数,基于决策树的特征重要性和经过随机排序得到重要性得分。可以
有三种方法获得特征重要性排序:
1、从模型系数得知的特征重要性。
如用线性模型去拟合线性数据集中,拟合得到的函数为 y = f ( x ) = w 1 x 1 + w 2 x 2 + w 3 x 3 + ⋯ y=f(x)=w_1x_1+w_2x_2+w_3x_3+\cdots y=f(x)=w1x1+w2x2+w3x3+⋯ 其中 w 1 , w 2 , w 3 ⋯ w_1,w_2,w_3\cdots w1,w2,w3⋯ 就为各个特征的重要性。
2、决策树中的特征重要性。
决策树算法,比如说classification and regression trees(CART)根据Gini系数或熵的减少来提供重要性得分。这个方法也可用于随机森林和梯度提升算法。
对于在scikit-learn中实现的特征重要性,我们可以将CART算法用于DecisionTreeRegressor和DecisionTreeClassifier类
拟合后,模型提供feature_importances_属性,可以访问该属性以检索每个输入特征的相对重要性得分。
3、随机排序检验中的特征重要性。
随机排序特征重要性(Permutation feature importance)可以计算相对重要性,与所使用的模型无关。
首先,在数据集中拟合出一个模型,比如说一个不支持本地特征重要性评分的模型。然后,尽管对数据集中的特征值进行了干扰,但仍可以使用该模型进行预测。对数据集中的每个特征进行此操作。然后,再将整个流程重新操作3、5、10或更多次。我们得到每个输入特征的平均重要性得分(以及在重复的情况下得分的分布)。
此方法可以用于回归或分类,要求选择性能指标作为重要性得分的基础,例如回归中的均方误差和分类中的准确性。
可以通过permutation_importance()函数(以模型和数据集为参数)和评分函数进行随机排序特性选择。我的理解为若将一个特征置为随机数,模型效果下降很多,说明该特征比较重要;反之则不是。
答案来源文章
数据分箱:数据分箱(也称为离散分箱或分段)是一种数据预处理技术,用于减少次要观察误差的影响,是一种将多个连续值分组为较少数量的“分箱”的方法。
一般在建立分类模型时,需要对连续变量离散化,特征离散化后,模型会更稳定,降低了模型过拟合的风险。比如在建立申请评分卡模型时用logsitic作为基模型就需要对连续变量进行离散化,离散化通常采用分箱法。分箱的有以下重要性及其优势:
- 离散特征的增加和减少都很容易,易于模型的快速迭代;
- 稀疏向量内积乘法运算速度快,计算结果方便存储,容易扩展;
- 离散化后的特征对异常数据有很强的鲁棒性:比如一个特征是年龄>30是1,否则0。4. 如果特征没有离散化,一个异常数据“年龄300岁”会给模型造成很大的干扰;
- 逻辑回归属于广义线性模型,表达能力受限;单变量离散化为N个后,每个变量有单6. 独的权重,相当于为模型引入了非线性,能够提升模型表达能力,加大拟合;
- 离散化后可以进行特征交叉,由M+N个变量变为M*N个变量,进一步引入非线性,提升表达能力;
- 特征离散化后,模型会更稳定,比如如果对用户年龄离散化,20-30作为一个区间,不会因为一个用户年龄长了一岁就变成一个完全不同的人。当然处于区间相邻处的样本会刚好相反,所以怎么划分区间是门学问;
- 特征离散化以后,起到了简化了逻辑回归模型的作用,降低了模型过拟合的风险。
- 可以将缺失作为独立的一类带入模型。
- 将所有变量变换到相似的尺度上。
分箱方法介绍
https://www.jianshu.com/p/0805f185ecdf
重点:决策树分箱
图像处理中取各种滤波,取log、指数平滑等 平滑求平均(时间序列数据的操作)
长尾问题:在实际的视觉相关问题中,数据都存在长尾分布:少量类别占据绝大多数样本,大量的类别仅有少量的样本,比如open-images,ImageNet等。
解决长尾问题嘚方案一般分为4种:
1,Re-sampling:主要是在训练集上实现样本平衡,如对tail中的类别样本进行过采样,或者对head类别样本进行欠采样;
2,Re-weighting:主要在训练loss中,给不同的类别的loss设置不同的权重,对tail类别loss设置更大的权重;
3,Learning strategy(阶段训练):有专门为解决少样本问题涉及的学习方法可以借鉴,如:meta-learning、metric learning、transfer learing。另外,还可以调整训练策略,将训练过程分为两步:第一步不区分head样本和tail样本,对模型正常训练;第二步,设置小的学习率,对第一步的模型使用各种样本平衡的策略进行finetune。
4,综合使用以上策略
(Long-Tail(长尾)问题的解决方案_龙海L的博客-CSDN博客_long tail)
通俗了解神经网络如何避免陷入局部最优_weixin_43167121的博客-CSDN博客_神经网络陷入局部最优
动量法、自适应梯度下降法
1.增加样本数据量
2.数据增强,人为扩展数据量
3.正则化
4.Dropout
5.early stopping
6.batch normalization
Dropout可以认为是一种极端的Bagging,每一个模型都在单独的数据上训练,同时,通过和其他模型对应参数的共享,从而实现模型参数的高度正则化。
dropout 在测试的时候网络权重需要乘以dropout的比率 p p p,或者在训练的时候对输入向量缩放——乘以 1 1 − p \frac{1}{1-p} 1−p1
Dropout 的步骤:
1)随机删除网络中的一些隐藏神经元,保持输入输出神经元不变;
2)将输入通过修改后的网络进行前向传播,然后将误差通过修改后的网络进行反向传播;
3)对于另外一批的训练样本,重复上述操作。
- Bagging:独立的集成多个模型,每个模型有一定的差异,最终综合有差异的模型的结果,获得学习的最终的结果;
- Boosting(增强集成学习):集成多个模型,每个模型都在尝试增强(Boosting)整体的效果;
- Stacking(堆叠):集成 k 个模型,得到 k 个预测结果,将 k 个预测结果再传给一个新的算法,得到的结果为集成系统最终的预测结果;
Bagging和Boosting的区别:
1)样本选择上:
Bagging:训练集是在原始集中有放回选取的,从原始集中选出的各轮训练集之间是独立的。
Boosting:每一轮的训练集不变,只是训练集中每个样例在分类器中的权重发生变化。而权值是根据上一轮的分类结果进行调整。
2)样例权重:
Bagging:使用均匀取样,每个样例的权重相等
Boosting:根据错误率不断调整样例的权值,错误率越大则权重越大。
3)预测函数:
Bagging:所有预测函数的权重相等。
Boosting:每个弱分类器都有相应的权重,对于分类误差小的分类器会有更大的权重。
4)并行计算:
Bagging:各个预测函数可以并行生成
Boosting:各个预测函数只能顺序生成,因为后一个模型参数需要前一轮模型的结果。
5)bagging是减少variance,而boosting是减少bias
batch normalization是对一批样本的同一纬度特征做归一化,一般放在全连接层和激活函数中间
BN特点:强行将数据转为均值为0,方差为1的正态分布,使得数据分布一致,并且避免梯度消失。而 梯度变大意味着学习收敛速度快,能够提高训练速度 。
设batch_size为m,网络在向前传播时,网络 中每个神经元都有m个输出,BN就是将每个神经元的m个输出进行归一化处理,看到BN原论文中的伪代码:
即有两个步骤:
特别的,令 γ \gamma γ = 1, β \beta β = 0 等价于只有标准化过程;令 γ \gamma γ = σ \sigma σ , β \beta β = μ \mu μ 等价于没有添加BN层
Batch Normalization 超详细解读(训练、测试、优点、缺点)(算法面试几乎必考)_苏学算法的博客-CSDN博客_batch normalization训练和测试
深度学习之解密Batch Normalization - 箐茗 - 博客园 (cnblogs.com)
由于Batch Normalization使用mini-batch的均值和标准差对深度神经网络的隐藏层输入进行标准化 ,可有效地提升训练速度。对于前向神经网络应用Batch Norm,使用简单SGD优化器,训练速度也能有较大提升。
BN的效果受制于batch的大小,小batch未必能取得预期效果;
对于前向神经网络可以很直接地应用BN,因为其每一层具有固定的神经元数量,可直接地存储每层网络各神经元的均值、方差统计信息以应用于模型预测,但在RNNs网络中,不同的mini-batch可能具有不同的输入序列长度(深度),计算统计信息比较困难,而且测试序列长度不能大于最大训练序列长度;
Batch Normalization也很难应用于在线学习模型,以及小mini-batch的分布式模型;
层标准化详解(Layer Normalization)_十里清风的博客-CSDN博客_layer normalization
1、SGD
2、momentum
SGD下降方法的缺点是参数更新方向只依赖于当前batch计算出的梯度,因此十分的不稳定。为了抑制SGD的震荡,动量认为梯度下降的过程中可以加入惯性。动量梯度下降法运行速度总是快于标准的梯度下降法,其基本思想是在SGD的基础上引入了一阶动量:
g ^ ← + 1 m ▽ θ ∑ i L ( f ( x i ; θ ) , y i ) v ← α v − ϵ g ^ θ ← θ + v \hat{g} \leftarrow +\frac{1}{m}\bigtriangledown_\theta \sum_{i}L(f(x_i;\theta), y_i) \\ v \leftarrow \alpha v - \epsilon \hat{g} \\ \theta \leftarrow \theta + v g^←+m1▽θi∑L(f(xi;θ),yi)v←αv−ϵg^θ←θ+v
一阶动量指的是各个时刻梯度的指数加权平均,约等于 1 1 − β 1 \frac{1}{1-\beta_1} 1−β11 个历史时刻的梯度向量和的平均值,也就是t时刻的下降方向,不仅由当前点的梯度方向决定,还由此前的累积的梯度来决定, β \beta β的经验值一般为0.9,也就是意味着下降方向主要是此前累积的下降方向,并略微偏向当前时刻的下降方向。并利用当前batch微调最终的更新方向。如果当前梯度方向与历史梯度一致,会增强该方向的梯度。如果不一致,能够减少更新。
优点:
增加了稳定性;
收敛速度更快;
还有一定摆脱局部最优的能力。
3、Nesterov Momentum
具体实现:
需要:学习速率 ϵ \epsilon ϵ, 初始参数 θ \theta θ, 初始速率 v v v, 动量衰减参数 α \alpha α
每步迭代过程:
g ^ ← + 1 m ▽ θ ∑ i L ( f ( x i ; θ + α v ) , y i ) v ← α v − ϵ g ^ θ ← θ + v \hat{g} \leftarrow +\frac{1}{m}\bigtriangledown_\theta \sum_{i}L(f(x_i;\theta+\alpha v), y_i) \\ v \leftarrow \alpha v - \epsilon \hat{g} \\ \theta \leftarrow \theta + v g^←+m1▽θi∑L(f(xi;θ+αv),yi)v←αv−ϵg^θ←θ+v
注意求梯度时时用 f ( x i ; θ + α v ) f(x_i;\theta+\alpha v) f(xi;θ+αv), 而不是 θ \theta θ.
4、AdaGrad
具体实现:
需要:全局学习速率 ϵ \epsilon ϵ, 初始参数 r r r, 数值稳定量 δ \delta δ
中间变量: 梯度累计量r(初始化为0)
每步迭代过程:
g ^ ← + 1 m ▽ θ ∑ i L ( f ( x i ; θ ) , y i ) r ← r + g ^ ⊙ g ^ Δ θ ← − ϵ δ + r ⊙ g ^ θ ← θ + Δ θ \hat{g} \leftarrow +\frac{1}{m}\bigtriangledown_\theta \sum_{i}L(f(x_i;\theta), y_i) \\ r \leftarrow r + \hat{g} \odot \hat{g} \\ \Delta \theta \leftarrow -\frac{\epsilon}{\delta+\sqrt{r}}\odot \hat{g} \\ \theta \leftarrow \theta + \Delta \theta \\ g^←+m1▽θi∑L(f(xi;θ),yi)r←r+g^⊙g^Δθ←−δ+rϵ⊙g^θ←θ+Δθ
优点:
能够实现学习率的自动更改。如果这次梯度大,那么学习速率衰减的就快一些;如果这次梯度小,那么学习速率衰减的就满一些。
缺点:
任然要设置一个变量
经验表明,在普通算法中也许效果不错,但在深度学习中,深度过深时会造成训练提前结束。可能梯度平方和累加过大,梯度消失
5、RMSProp
RMSProp通过引入一个衰减系数,让r每回合都衰减一定比例,类似于Momentum中的做法。
具体实现:
需要:全局学习速率 ϵ \epsilon ϵ 初始参数 r r r, 数值稳定量 δ \delta δ,衰减速率 ρ \rho ρ
中间变量: 梯度累计量r(初始化为0)
每步迭代过程:
g ^ ← + 1 m ▽ θ ∑ i L ( f ( x i ; θ ) , y i ) r ← ρ r + ( 1 − ρ ) g ^ ⊙ g ^ Δ θ ← − ϵ δ + r ⊙ g ^ θ ← θ + Δ θ \hat{g} \leftarrow +\frac{1}{m}\bigtriangledown_\theta \sum_{i}L(f(x_i;\theta), y_i) \\ r \leftarrow \rho r + (1-\rho)\hat{g} \odot \hat{g} \\ \Delta \theta \leftarrow -\frac{\epsilon}{\delta+\sqrt{r}}\odot \hat{g} \\ \theta \leftarrow \theta + \Delta \theta \\ g^←+m1▽θi∑L(f(xi;θ),yi)r←ρr+(1−ρ)g^⊙g^Δθ←−δ+rϵ⊙g^θ←θ+Δθ
6、RMSProp with Nesterov Momentum
具体实现:
需要:全局学习速率 , 初始参数 , 初始速率v,动量衰减系数, 梯度累计量衰减速率
中间变量: 梯度累计量r(初始化为0)
每步迭代过程:
θ ~ ← θ + α v g ^ ← + 1 m ▽ θ ∑ i L ( f ( x i ; θ ) , y i ) r ← ρ r + ( 1 − ρ ) g ^ ⊙ g ^ v ← α v − ϵ r ⊙ g ^ θ ← θ + v \tilde{\theta} \leftarrow \theta + \alpha v \\ \hat{g} \leftarrow +\frac{1}{m}\bigtriangledown_\theta \sum_{i}L(f(x_i;\theta), y_i) \\ r \leftarrow \rho r + (1-\rho)\hat{g} \odot \hat{g} \\ v \leftarrow \alpha v - \frac{\epsilon}{\sqrt{r}}\odot \hat{g} \\ \theta \leftarrow \theta + v \\ θ~←θ+αvg^←+m1▽θi∑L(f(xi;θ),yi)r←ρr+(1−ρ)g^⊙g^v←αv−rϵ⊙g^θ←θ+v
7.AdaDelta
AdaDelta基本思想是用一阶的方法,近似模拟二阶牛顿法。不仅对分母添加了衰减系数,对分子也改动了一下
8.Adam
Adam(Adaptive Moment Estimation)本质上是带有动量项的RMSprop,它利用梯度的一阶矩估计和二阶矩估计动态调整每个参数的学习率。Adam的优点主要在于经过偏置校正后,每一次迭代学习率都有个确定范围,使得参数比较平稳。
具体实现:
需要:步进值 , 初始参数 , 数值稳定量,一阶动量衰减系数, 二阶动量衰减系数
其中几个取值一般为:
中间变量:一阶动量s,二阶动量r,都初始化为0
每步迭代过程:
g ^ ← + 1 m ▽ θ ∑ i L ( f ( x i ; θ ) , y i ) s ← ρ 1 s + ( 1 − ρ 1 ) g r ← ρ 2 + ( 1 − ρ 2 ) g ⊙ g s ^ ← s 1 − ρ 1 r ^ ← r 1 − ρ 2 Δ θ = − ϵ s ^ r ^ + δ θ ← θ + v \hat{g} \leftarrow +\frac{1}{m}\bigtriangledown_\theta \sum_{i}L(f(x_i;\theta), y_i) \\ s \leftarrow \rho_1 s + (1-\rho_1) g \\ r \leftarrow \rho_2 + (1-\rho_2)g \odot g \\ \hat{s} \leftarrow \frac{s}{1-\rho_1} \\ \hat{r} \leftarrow \frac{r}{1-\rho_2} \\ \Delta \theta = - \epsilon \frac{\hat{s}}{\sqrt{\hat{r}}+\delta} \\ \theta \leftarrow \theta + v \\ g^←+m1▽θi∑L(f(xi;θ),yi)s←ρ1s+(1−ρ1)gr←ρ2+(1−ρ2)g⊙gs^←1−ρ1sr^←1−ρ2rΔθ=−ϵr^+δs^θ←θ+v
网上很多 这里就不贴了
梯度消失:
由于0-1范围内的导数累乘,会发现累乘会导致激活函数导数的累乘,如果取tanh或sigmoid函数作为激活函数的话,那么必然是一堆小数在做乘法,结果就是越乘越小。随着时间序列的不断深入,小数的累乘就会导致梯度越来越小直到接近于0,这就是“梯度消失“现象。
解决
RNN 的梯度消失问题 - 知乎 (zhihu.com)
最好不要用relu 因为lstm中的两个激活函数 一个sigmoid用于生成遗忘门、输出门、输入门的值(0-1),另一个函数tanh用来输出状态和输出向量,如果用relu会造成数据分布偏移,因为relu不是关于原点中心对称的。
CNN 与 RNN
相同点:
2.1. 传统神经网络的扩展;
2.2. 前向计算产生结果,反向计算模型更新;
2.3. 每层神经网络横向可以多个神经元共存,纵向可以有多层神经网络连接。
不同点:
3.1. CNN空间扩展,神经元与特征卷积;RNN时间扩展,神经元与多个时间输出计算;
3.2. RNN可以用于描述时间上连续状态的输出,有记忆功能,CNN用于静态输出;
3.3. CNN高级100+深度,RNN深度有限。
不良的初始化,极易造成梯度消失or梯度爆炸
啃一啃神经网络——权重初始化 - 知乎 (zhihu.com)
深度学习之参数初始化(一)——Xavier初始化_Vic时代的博客-CSDN博客_xavier初始化
ID3 的缺点:
C4.5 相对于 ID3 的缺点对应有以下改进方式:
gbdt boosting思想解决偏差 rf 是bagging思想解决方差
随机森林的较深。
随机森林,GBDT,XGBoost的对比_QueenieK的博客-CSDN博客_xgboost和随机森林的区别
对于Bagging算法来说,由于我们会并行地训练很多不同的分类器的目的就是降低这个方差(variance),因为采用了相互独立的基分类器多了以后,我们想要的值自然就会靠近期望.所以对于每个基分类器来说,目标就是如何降低这个偏差(bias),所以我们会采用深度很深甚至不剪枝的决策树。
对于Boosting来说,每一步我们都会在上一轮的基础上更加拟合原数据,所以可以保证偏差(bias),所以对于每个基分类器来说,问题就在于如何选择variance更小的分类器,即更简单的分类器,所以我们选择了深度很浅的决策树。
GBDT是利用函数的一阶导作为残差,xgb 利用了二阶导
对于基分类器 f ( x ) = w q ( x ) f(x)=w_{q(x)} f(x)=wq(x) 其中 w q ( x ) w_{q(x)} wq(x) 为树的叶节点的权重(得分)。
对于 xgb 中的损失函数中的一项为
L ( y i , f t − 1 ( x i ) + f ( x i ) ) ≈ L ( y i , f t − 1 ( x i ) ) + L ′ ( y i , f t − 1 ( x i ) ) f ( x i ) + 1 2 L ′ ′ ( y i , f t − 1 ( x i ) ) f 2 ( x i ) = L ( y i , f t − 1 ( x i ) ) + g ( x i ) f ( x i ) + 1 2 h ( x i ) f 2 ( x i ) L(y_i, f_{t-1}(x_i)+f(x_i)) \approx L(y_i, f_{t-1}(x_i)) + L'(y_i, f_{t-1}(x_i))f(x_i)+\frac{1}{2}L''(y_i, f_{t-1}(x_i))f^2(x_i) \\ =L(y_i, f_{t-1}(x_i)) + g(x_i)f(x_i) + \frac{1}{2}h(x_i)f^2(x_i) L(yi,ft−1(xi)+f(xi))≈L(yi,ft−1(xi))+L′(yi,ft−1(xi))f(xi)+21L′′(yi,ft−1(xi))f2(xi)=L(yi,ft−1(xi))+g(xi)f(xi)+21h(xi)f2(xi)
所以我们要优化的目标函数为(添加正则项)(精髓)
O b j ( t ) = ∑ i L ( y i , f t − 1 ( x i ) + f ( x i ) ) + Ω ( T ) = ∑ i L ( y i , f t − 1 ( x i ) + w q ( x i ) ) + γ T + λ ∑ j = 1 T w j 2 ( 舍 去 常 数 项 ) = ∑ j T ( ( ∑ i ∈ w j g i ) w j + 1 2 ( ∑ i ∈ w j h i + λ ) w j 2 ) + γ T = ∑ j T ( G j w j + 1 2 ( H j + λ ) w j 2 ) + γ T Obj^{(t)} = \sum_{i}L(y_i, f_{t-1}(x_i)+f(x_i)) + \Omega(T) = \sum_{i}L(y_i, f_{t-1}(x_i)+w_{q(x_i)})+\gamma T + \lambda\sum_{j=1}^T w_j^2 \\ \underset{=}{(舍去常数项)}\sum_{j}^T((\sum_{i \in w_j}g_i)w_j+\frac{1}{2}(\sum_{i\in w_j}h_i+\lambda)w_j^2)+\gamma T \\ =\sum_{j}^T(G_jw_j+\frac{1}{2}(H_j+\lambda)w_j^2)+\gamma T Obj(t)=i∑L(yi,ft−1(xi)+f(xi))+Ω(T)=i∑L(yi,ft−1(xi)+wq(xi))+γT+λj=1∑Twj2=(舍去常数项)j∑T((i∈wj∑gi)wj+21(i∈wj∑hi+λ)wj2)+γT=j∑T(Gjwj+21(Hj+λ)wj2)+γT
求导求其最小值
w j ∗ = − G j H j + λ O b j ∗ = − 1 2 ∑ j T ( G j 2 H j + λ ) + γ T w_j^* = -\frac{G_j}{H_j+\lambda} \\ Obj^{*} = -\frac{1}{2}\sum_{j}^T(\frac{G_j^2}{H_j+\lambda}) + \gamma T wj∗=−Hj+λGjObj∗=−21j∑T(Hj+λGj2)+γT
所以每次都要寻找使 G a i n = 1 2 [ G R 2 H R + λ + G L 2 H L + λ − G L 2 + G R 2 H L + H R + λ ] − λ Gain = \frac{1}{2}[\frac{G_R^2}{H_R+\lambda}+\frac{G_L^2}{H_L+\lambda}-\frac{G_L^2+G_R^2}{H_L+H_R+\lambda}]-\lambda Gain=21[HR+λGR2+HL+λGL2−HL+HR+λGL2+GR2]−λ 最大的分割点。
关于树模型的问题
gbdt的目标函数与xgboost区别就是带不带 正则项 (算法内容上)。gbdt对损失函数的优化是直接使用了损失函数的负梯度,沿着梯度下降的方向来减小损失,其是也就是一阶泰勒展开。而xgboost在这里使用了 二阶泰勒展开 ,因为包含了损失函数的二阶信息,其优化的速度大大加快。但如果loss没有二阶导数,就使用一阶导数优化
xgb 是 gbdt 算法的实现,都是用的 cart 基分类器。对于xgb用上述方式分裂叶节点,对于 gbdt 则采用cart拟合残差的方法分裂叶节点。对于 xgb 将其损失函数设置为交叉熵损失函数即可。
GBDT 做分类任务有些特殊:深入理解GBDT二分类算法_Microstrong0305的博客-CSDN博客_gbdt二分类
这与决策树算法自身的优点有很大的关系。决策树可以认为是if-then规则的集合,易于理解, 可解释性强,预测速度快 。同时,决策树算法相比于其他的算法需要 更少的特征工程 ,比如可 以不用做特征标准化,可以很好的处理字段缺失的数据,也可以不用关心特征间是否相互依赖等 。决策树能够自动组合多个特征,它可以毫无压力地处理特征间的交互关系并且是非参数化的,因此你不必担心异常值或者数据是否线性可分(举个例子,决策树能轻松处理好类别A在某个特征维度x的末端,类别B在中间,然后类别A又出现在特征维度x前端的情况)不过, 单独使用决策树算法时,有容易过拟合缺点 。所幸的是,通过各种方法, 抑制决策树的复杂性,降低单颗决策树的拟合能力,再通过梯度提升的方法集成多个决策树,最终能够很好的解决过拟合的问题 。由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。
至于抑制单颗决策树的复杂度的方法有很多,比如 限制树的最大深度 、 限制叶子节点的最少样本数量 、 限制节点分裂时的最少样本数量 、吸收bagging的思想对训练样本采样(subsample), 在学习单颗决策树时只使用一部分训练样本 、借鉴随机森林的思路在学习单颗决策树时只采样一部分特征、在目标函数中添加正则项惩罚复杂的树结构等。现在主流的GBDT算法实现中这些方法基本上都有实现,因此GBDT算法的超参数还是比较多的,应用过程中需要精心调参,并用交叉验证的方法选择最佳参数。
个例子,决策树能轻松处理好类别A在某个特征维度x的末端,类别B在中间,然后类别A又出现在特征维度x前端的情况)不过, 单独使用决策树算法时,有容易过拟合缺点 。所幸的是,通过各种方法, 抑制决策树的复杂性,降低单颗决策树的拟合能力,再通过梯度提升的方法集成多个决策树,最终能够很好的解决过拟合的问题 。由此可见,梯度提升方法和决策树学习算法可以互相取长补短,是一对完美的搭档。
至于抑制单颗决策树的复杂度的方法有很多,比如 限制树的最大深度 、 限制叶子节点的最少样本数量 、 限制节点分裂时的最少样本数量 、吸收bagging的思想对训练样本采样(subsample), 在学习单颗决策树时只使用一部分训练样本 、借鉴随机森林的思路在学习单颗决策树时只采样一部分特征、在目标函数中添加正则项惩罚复杂的树结构等。现在主流的GBDT算法实现中这些方法基本上都有实现,因此GBDT算法的超参数还是比较多的,应用过程中需要精心调参,并用交叉验证的方法选择最佳参数。