答: 因为平方误差函数得到的损失函数,是一个非凸函数,求解时很容易陷入局部最优,而交叉熵损失函数是一个凸函数,通过凸优化算法很容易得到最优解。
交叉熵作为损失函数时,参数 w的梯度只和当前预测值与实际值的差值有关,没有受到sigmoid导数的影响,且真实值与预测值相差越大,梯度越大,更新速度越快。
逻辑回归为什么用sigmoid作为激活函数:因为逻辑回归是假设分布服从过一个伯努利分布,而sigmoid是伯努利分布的指数形式。
交叉熵损失函数是为了预测的数据分布与真实的数据分布之间差异越小越好。
对于随机变量,有两个单独的概率分布,KL散度可以用来表示这两个分布之间的差异,不具有对称性。
实际上KL散度 = 交叉熵 - 熵,但因为数据的分布A是固定的,所以最小化KL散度等价于最小化交叉熵。
熵:可以表示一个事件A的自信息量,也就是A包含多少信息。
KL散度:可以用来表示从事件A的角度来看,事件B有多大不同。
交叉熵:可以用来表示从事件A的角度来看,如何描述事件B。
深度学习中交叉熵函数的优势:
因为在训练中主要依靠的是损失函数的梯度,沿着梯度下降的方向去调整参数。
如果使用均方误差函数,参数的梯度和激活函数的梯度成正比,激活函数的梯度越大,参数的调整幅度越大。常用的sigmoid函数的梯度在输入较大的时候梯度比较小,导致初始输入激活函数的误差越大,下降速度越缓慢,训练速度也就越慢。
sigmoid的函数曲线(横轴表示输入,纵轴表示输出):
从图中看出,初始输入(也就是误差)越大,梯度越小,下降就会越缓慢;
使用的是交叉熵损失函数的话,它的梯度直接和当前的输出值与实际值之间的误差相关,误差越大,梯度越大,参数调整的也就越快,训练速度也就越快,所以用交叉熵损失函数的训练效果比均方误差要好。
交叉熵的梯度更新公式:
具体见:交叉熵代价函数(作用及公式推导)
答:SVM只有少量的支持向量参与到核函数运算中,计算复杂度不高,而逻辑回归如果要使用核技巧,所有的样本点都要参与运算,计算复杂度太高。
SVM没有针对缺失值作特殊处理,而且SVM希望样本在特征空间中线性可分,所以特征空间的好坏很重要,缺失特征值对训练结果又很大影响。
当噪声成为支持向量的时候,对模型的影响是非常大的。
遍历特征的所有值,依次寻找使得损失函数前后相差最大的进行分裂。
优点:
缺点:
原始问题是一个凸二次规划问题,但对偶问题更容易求解;
原始问题是最后的求解是对w、b求解,复杂度和特征的维度有关,其维数是训练样本的特征维数 + 1, 对偶问题是对α求解,其维数等于样本个数,所以svm对高维空间中较稀疏的样本表现较好;
满足KKT条件时,原始问题的解和对偶问题解是等价的;
自然引入核函数,推广到非线性模型;
不把参数w、b消去,无法得到内积形式;
SVM算法对大规模训练样本难以实现,求解二次规划涉及M阶矩阵的运算,M数量很大时,将耗费大量的时间和内存。
相同点:
不同点:
1.SVM只考虑离分类面最近的支持向量,而lr考虑所有的数据点;SVM不依赖于数据分布,分类平面不受一类点影响,LR则受所有数据点的影响;
4. 非线性问题时,SVM可以采用核函数方法,而LR不采用;
因为 SVM 只需要计算支持向量,而lr需要计算所有数据点,计算复杂度太高;
5. SVM损失函数自带正则化;
6. LR可以输出概率,SVM不行,结果没有概率意义;
7. LR的损失函数是为了减少分类错误,SVM使决策面到所有样本的距离最大;
核函数的选择:
1.线性核,主要用于线性可分的情况,参数少,速度快;
2.RBF核,主要用于线性不可分,参数多,分类结果依赖于参数;
如果特征数量大,跟数量差不多,可以选取LR或者线性核函数的SVM;
如果特征数量小, 样本数量一般,SVM+高斯核;
如果特征数量小,样本数量多,手工添加一些feature变成第一种;
两个算法的目的都是增加对分类影响较大的数据点的权重,减少与分类关系较小的数据点的权重。SVM通过只考虑支持向量,也就是和分类最相关的少数点。而逻辑回归通过非线性映射,大大减小了离分类平面较远的点的权重,相对提升了与分类最相关的权重。
逻辑回归相对来说,更容易解释,模型更简单,特别是大规模线性分类时比较方便。
1.偏差度量了学习算法的期望预测和真实结果的偏离程度,即学习算法本身的拟合能力;
2.方差度量了同样大小的训练集变动所导致的学习性能变化,即刻画了数据扰动所造成的影响;(未知数据在模型上的性能表现);
3.噪声则表达了当前任务上任何学习算法所能达到的期望泛化误差的下界;
1.数据增强;
2.使用合适模型(数据太少+模型太复杂);
3.集成模型;
方向导数:是某个方向上的偏导数,假如一个函数有m个自变量,对m个自变量各自求偏导,就会得到m个方向的偏导数;
梯度:是指方向导数中,会使得函数变化最大的方向。它是一个矢量,其方向上的导数最大,大小刚好就是方向导数的大小;
物理意义:随机给定一个正样本和一个负样本, 用一个分类器进行分类预测,正样本的得分比负样本的得分要大的概率;
计算方式:
对于二分类, 先画出 ROC曲线,曲线的每一个点表示一个阈值,分类对所有样本进行打分预测,打分大于阈值的认为是正类,小于阈值的是负类。将打分从大到小排序,依次从大到小调整阈值大小,坐标横轴是假阳率,纵轴是真阳率,每个不同的阈值最终都会得出不同的(假阳率,真阳率),也就是一个个坐标点,连接起来就是ROC曲线。
随着阈值的降低,被认为是正类的样本数越来越多,那么正样本的召回率是一直在增大,相反负样本的召回率在减小。如果正样本的召回率增加的速度大于负样本的召回率的下降速度,说明分类器效果还是不错的。
精准率:所找到的信息中有多少是用户真正感兴趣的,预测的结果中,预测为正样本中,有多少结果是正确的。
召回率:有多少用户感兴趣的信息被找出来了,预测正确的正样本数,占预测结果的比例。
真阳率(真正率):真正的样本率,即标签为正预测也为正的样本数,占实际为正的所有样本数比例;
假阳率(假正率):假的正样本率,即标签为负预测却为正的样本数,占所有实际为负的样本数比例;
1.缺失值较多的特征,直接舍弃;
2.用0、均值、中值填充;
3. 用上下数据进行填充;
4. 插值法填充,通过两点估计中间的值;
5. 用算法预测缺失值
主要目标:
解决数据稀疏的情况下,特征组合(为什么要特征组合?没有考虑到特征与特征之间的关系)的问题;
优点:
1.可以在非常稀疏的数据中,进行合理的参数估计;
2.FM的时间复杂度是线性的;
3.FM是一个通用模型,可以用于任何特征为实值的情况;
普通的线性模型都是将各个特征独立考虑,没有考虑到特征与特征之间的相互关系。
简单起见,考虑二阶交叉的情况下,具体模型为:
模型的前部分就是LR模型,后半部分交叉项即特征的组合。当交叉项全为0时,退化为LR模型。从公式中可以看出,组合特征的参数一共有n(n - 1)/2 , 任意两个参数都是独立的。
在数据稀疏的情况下,二次项参数非常难以训练,每个参数的训练都需要大量xi 和 xj 非零的样本,由于样本本就稀疏,这样的样本会非常少。
Adaboost调参:
sklearn库中,adaboost支持两种方法,AdaBoostClassifier和AdaBoostRegressor,一个用于分裂,另一个回归。
分类器使用两种算法实现,SAMME 和 SAMME.R,回归则是Adaboost.R2.
调参首先对框架,具体参数有:
1。base_estimator:弱分类器,需要支持样本权重。分类时默认使用CART分类树,回归时则是CART回归树。如果选择的算法是SAMME.R,对应的弱分类器就需要支持概率预测;
2. algorithm:SAMME使用弱分类器的分类效果作为弱学习器权重,SAMME.R使用预测概率大小来作为弱分类器的权重。默认是SAMME.R,由于是概率连续值,迭代一般比SAMME快。
3. loss:只有回归时有,有线性、平方、指数三种。
4. n_estimators:弱分类器的迭代次数,一般是50;
5. learning_rate:每个弱学习器的权重缩减系数。
接下来是对弱分类器的参数,对于决策树而言主要有最大特征数、树的深度、内部节点再划分所需的最小样本数、叶子节点最少的样本数、叶子节点最小的样本权重、最大叶子节点数;
缺点:
对异常样本敏感,异常样本可能在迭代中获得较高的权重。
优点:
1.作为分类器时,精度很高;
2.使用各种回归分裂模型来构建弱学习器,非常灵活;
3. 构造简单,易于理解;
4. 不容易发生过拟合;
损失函数不可导时,最小二乘法和梯度下降法不再适用,可以用坐标轴下降法和最小角回归法、近端梯度下降。
坐标轴下降法:沿着坐标轴的方向去下降,梯度下降沿着梯度的负方向下降,他们都是迭代法。
和梯度下降法比较:
优势:
xgboost把缺失值当做稀疏矩阵对待,确实数据会被分到左子树和右字数分别计算损失,选择较优的那个。如果训练中没有缺失值,而预测时出现了,默认被分到右子树。
决策树处理缺失值:
1. 数值型变量的缺失值用中位数替换,描述型变量确实用对应类别中出现最多的数值代替。
2. 还是使用中位数和出现次数最多的数替换,对需要替换的数据先和其他数据做相似度测量。
RNN在所有的时间步中共享参数(U,V,W),因此每个输出的梯度不仅取决于当前时间步的计算,还取决于以前的时间步计算。例如为了计算 t = 4 的梯度,还需要反向传播前3个步骤的梯度并求和(BPTT,时间反向传播)。
RNN模型如果需要实现长期记忆,需要将当前的计算与前面所有的计算连乘,计算量会暴增。
使用BPTT训练的普通RNN由于梯度消失和爆炸而难以学习长期依赖关系。
梯度消失是因为,激活函数tanh的导数在0-1之间,反向传播时更新前面的参数时,当参数初始化为小于1的时候,反向传播需要计算之前的导数,会产生一个连乘,而小于1的数连乘容易导致梯度消失;
梯度爆炸,当初始化足够大时候,tanh函数的导数连乘后大于 1, 导致偏导会极大,因而梯度爆炸;
LSTM有三个输入(当前时刻网络的输入、上一时刻网络的输出h(t-1)、上一时刻的记忆单元状态),两个输出(当前输出值、当前时刻的记忆单元状态)。
第一步:
h(t - 1)是基于C(t - 1)的输出,可以理解为基于C(t - 1)的预测,
遗忘门: 对原有的记忆信息进行选择性的保留和遗忘;
第二步:
输入门:首先对原有的信息进行筛选,对新的信息进行筛选,然后将两个部分的信息结合到一起,C(t -1)成为C(t)。
当前的新状态以多大程度更新到记忆单元中。
第三步:
输出门:根据当前的C(t)产生h(t)
当前的输出多大程度上取决于当前的记忆单元;
卷积神经网络的参数共享体现在,每个时间步中的卷积核是相同的,
1*1的卷积核易于升维、降维。
若卷积核数量与输入相同,则单纯的向网络增加了非线性;
1.使用核技巧;2.特征离散化,特征组合;
回归的优化目标函数可以和分类问题保持一致,
但约束问题不是最大化不同类别间支持向量的距离,用模型的输出与真实输出之间的均方差来计算损失,SVM允许真实与预测之间存在一定的偏差,只有当两者之间的偏差大于阈值时,才计算损失。相当于以模型为中心,构建了一个宽度为2倍阈值的间隔带,训练样本若落入间隔带中,则被认为是正确的。
普通对矩阵作特征分解时,矩阵必须为方阵。当行列不一样时,可以用SVD来求解。
假设 矩阵A是一个 m * n 的矩阵,定义矩阵的SVD分解为:
中间是个 m * n的矩阵,除了主对角线上的元素外全为0,主对角线上的每个值称为奇异值,左边是m * m 的矩阵,右边是 n * n的矩阵。
左奇异矩阵可以用来对行数进行压缩,右奇异矩阵用于对列数即特征维度压缩,也即是PCA降维。
特征值矩阵是奇异值矩阵的平方。
SVD可以用于PCA降维,来做数据压缩和去噪,也可以用于推荐算法,将用户和喜好的矩阵作特征分解,进而得到隐含的用户需求来做推荐。
均值池化:
通过对领域内特征数值求平均来实现,能够抑制由于领域大小受限造成估计值方差增大的现象,特点是对背景的保留效果好。
最大池化:
取领域内的最大值实现,抑制网络参数误差造成估计均值偏移的现象,特点是更好的提取纹理信息。
池化本质是降采样,除了能够降低参数量之外,还能保持对平移、伸缩、旋转操作的不变性。
没有dropout之前的计算公式:
加入dropout之后:
伯努利函数,是以概率p随机生成一个只有0,1的向量。
让某个神经元以概率p停止工作,其实就是让他的激活函数值以概率 p 变为 0 。
预测阶段时,每个神经元的权重参数都要乘以概率 p。
或者在dropout之后,对激活值向量进行缩放,乘以1/(1 - P)。
为什么要缩放:训练的时候随机丢弃一些神经元,预测的时候就不能这样做了。如果丢弃的话,会带来结果不稳定的问题。补偿方案,就是对每个神经元的权重乘以 P,这样在总体上,使得测试数据和训练数据大致是一样的。
为什么能够解决过拟合?
实现代码:
# coding:utf-8
import numpy as np
# dropout函数的实现
def dropout(x, level):
if level < 0. or level >= 1: #level是概率值,必须在0~1之间
raise ValueError('Dropout level must be in interval [0, 1[.')
retain_prob = 1. - level
# 我们通过binomial函数,生成与x一样的维数向量。binomial函数就像抛硬币一样,我们可以把每个神经元当做抛硬币一样
# 硬币 正面的概率为p,n表示每个神经元试验的次数
# 因为我们每个神经元只需要抛一次就可以了所以n=1,size参数是我们有多少个硬币。
random_tensor = np.random.binomial(n=1, p=retain_prob, size=x.shape) #即将生成一个0、1分布的向量,0表示这个神经元被屏蔽,不工作了,也就是dropout了
print(random_tensor)
x *= random_tensor
print(x)
x /= retain_prob
return x
图片的底层特征是与特征在图片中位置无关,而高级特征一般是与位置有关的,这时就要用局部全连接层或者全连接层。
多层网络中,影响梯度大小的因素有两个,权重和激活函数的偏导。深层的梯度是多个激活函数偏导乘积的形式来计算。如果这些偏导比较小或者为0,那么梯度容易消失。相反,如果偏导比较大,就有可能梯度爆炸。
解决方案:
选择一个合适的激活函数,它的梯度在一个合理的范围内。LSTM使用gate函数,有选择的让一部分信息通过。gate是由一个sigmoid函数和一个逐点乘积操作组成,sigmoid输出1或者0,用来判断通过还是阻止。所以当gate打开,梯度就不会消失;关闭,梯度不会爆炸。
回归树:
使用平方误差最小化准进行选择特征并划分,每个叶子节点给出的预测值,是划分到该叶子节点的所有样本目标值的均值。
要确定最优划分,还需要遍历所有属性,以及所有的取值来分别尝试划分并计算在此种划分情况下的最小平方误差,选取最小的作为此次划分。
分类树:
使用Gini指数最小化准则选择特征划分。基尼指数表示集合的不确定性,最小化误分类的概率。从数据集中随机抽取两个样本,其类别不一致的概率。基尼指数越小,纯度越高。
基尼指数与熵:
gbdt中的Shrinkage思想:
它认为每次走一小步来逼近结果的效果,比每次迈一大步很快逼近结果的方式更容易防止过拟合。它不完全信任每次学习到残差,累加时只选取残差的一部分作为结果,通过多学习几棵树来弥补不足。
每次学习到的残差乘以step参数。
本质上,为每一刻树设置了一个weight,累加时需要乘以这个weight。
shinkage能够减少过拟合。
GBDT对异常值敏感。
优点:
指该事件发生与不发生的概率比值。
xgboost的目标函数表达式分为两部分,第一部分为loss function,第二部分为regularization。正则项包含两部分,一部分是提升树叶子节点的数量,控制树的复杂度,可以达到剪枝的效果。另一部分是每棵树的叶子节点的权重的平方和。
通过目标函数,xgboost的每棵子树倾向于学习较简单的树。另外当正则项参数为 0 时,目标表达式就会退化为传统的gradient tree boosting 模型。
对决策树来说,连续值特征进行划分时通常比较困难,因为连续值特征往往取值较多。通常做法是先按特征值进行排序,在按顺序计算增益选择划分点。xgboost的做法是在训练之前,预先按特征取值对样本进行排序。
由于预先保存为block结构,所以对叶节点进行分裂时,每个特征的增益计算就可以开多线程进行计算,训练速度由此提升。而且这种block结构也支持列抽样,每次从所有block特征中选择一个子集作为候选分裂特征就可以了。
当数据量非常大难以被加载到内存时或者在分布式环境中,近似分裂算法,将连续特征离散化,对于某个特征,首先根据特征分布寻找若干个分位点,分成不同的集合,根据分位点将相应样本划分到桶中。遍历特征时,只要对每个桶内的样本统计值进行累加统计,寻找最佳分裂点进行分裂。
深度可分离卷积,首先独立的对各个通道进行卷积操作,然后再将不同通道之间的信息进行融合。
假如输入是 row × col × chan, 首先对三维数据作纵向上的卷积,也就是各个通道分开卷积,最终的输出通道与原始的输入通道保持一致,没有变化,即new_row × new_col × chan。这一步之后,再进行横向上的卷积,用 1 × 1 × new_chan的卷积核进行计算,得到的输出就是 new_row × new_col × new_chan的新数据。因为是1 × 1的卷积运算,所以也可以叫逐点卷积。
优点:
深度可分离卷积比普通卷积减少了所需要的参数,重要的是深度可分离卷积将以往普通卷积操作同时考虑通道和区域变成,卷积先只考虑区域,然后再考虑通道,实现了通道和区域的分离。
其中1×1 的内核,一个明显的目的是增加或减少图像的深度。如果卷积有太多或太少的通道,利用1×1可以进行平衡。还有另一种说法,1×1核的主要目的是应用非线性。在神经网络的每一层之后,都可以应用一个激活层。无论是relu、softmax还是其他,激活层都具有非线性。直线的组合仍然是直线,非线性层扩展了模型的可能性,这也是通常使深度网络优于宽度网络的原因。为了不显著增加参数量和计算量的情况下增加非线性层的数量,可以应用一个1×1的卷积核后再添加一个激活层,这有助于给网络增加一层深度。
普通卷积会对输入的数据整体上做一个卷积操作,分组卷积则是将数据纵向分为几组,每组分开用不同的卷积核进行运算后,再讲每组结果concat拼接起来。最终输出的通道数和普通卷积一样。
本身,分组卷积的设计就是为了减少对硬件设备的要求,它极大的减少了卷积运算的参数量。
空洞卷积是针对图像语义分割问题中下采样会降低图像分辨率、对视信息而提出的一种卷积策略。利用添加空洞扩大感受野,让原本大小假如为3 × 3 (dilated rate= 1)的感受野,在相同计算量的情况下,拥有5 × 5 的感受野(dilated rate = 2), 从而无需下采样。
比普通卷积层多了一个超参数扩张率(dilated rate),指的是卷积核处理数据时卷积核中各参数的间距大小,空洞的位置全填进去 0 。相同的计算条件下,空洞卷积提供了更大的感受野。当网络层需要较大的感受野,但计算资源有限而无法提高卷积核数量或者大小时,可以考虑空洞卷积。
它是人为虚设的一个变量,通常取值为0或1,来反映某个变量的不同属性。
原始的多分类变量转化为哑变量,每个哑变量表示某两个级别或若干个级别之间的差异,通过构建回归模型,每一个哑变量都能得出一个估计的回归系数,从而使回归的结果更容易解释,更具有实际意义。
对于具有n个分类属性的某一自变量,通常需要1个属性作为参照物,因此可以产生n - 1个虚拟变量。
比如血型A、B、O、AB,如果直接赋值为1、2、3、4,他们在数值上是具有从小到大的顺序关系,而实际上上它们之间应该不具有这种关系,直接将其带入到模型中是不合理的,此时需要将其转化为虚拟变量。
ICS(internal covariate shift)现象:对于神经网络的各层输出,由于它们经过了层内的操作,其分布于各层对应的输入分布显然不同,而且差异会随着网络深度增大而增大,高层的输入分布变化会非常剧烈。
ICS会导致什么问题:1.上层参数需要不断适应新的输入数据分布,降低学习速度。2.下层输入的变化可能趋向于变大或变小,导致上层落入饱和区,使得学习速度变慢。3.每层的更新会影响到其它层。
为什么不用白化:
normalization的权重伸缩不变性:
权重伸缩不变性是指,当权重按照常量进行伸缩时,得到的规范化后的值不变。权重伸缩变性可以有效的提高反向传播的效率,还具有参数正则化的效果。
假设输入是N×C×H×W,样本数、通道数、行、列;
Batch Normalization:
1.BN的计算是把每个通道的NHW单独拿出来作归一化处理;
2. 针对每一个channel 都有一组参数,用来恢复这层网络需要学到的分布;
3. batch size 越小,BN的效果也越差,因为计算中得到的均值和方差不能代表全局;
Layer Normalization:
1.把每个CHW单独拿出来,不受batchsize影响;
2.常用在RNN中,但如果输入特征区别大,不建议使用它做归一化处理;
Instance Normalization:
1.把每个HW单独拿出来作归一化处理,不受通道和batchsize的影响;
Group Normalization:
1.先把通道C分为G组,然后把每个分开的ghw单独拿出来作归一化处理,最后G组合并成新的CHW。
2.属于介于LN拟合IN之间的方法;
Switchable Normalization:
1.将BN、LN、IN结合,赋予权重,让网络自己去学习归一化应该使用什么方法。
GRU背后的原理和LSTM极其相似,也是利用门控机制控制输入、记忆等信息而在当前时间步做出预测。GRU有两个门,分别是重置门、更新门。
重置门决定了如何将新的输入信息与前面的记忆结合,更新门决定了将之前的记忆保留程度。如果将重置门设为1,更新门设为0,则退化为传统RNN。
GRU和LSTM的区别在于:
如果训练集很小,那么由于训练集的分布可能并不会接近于真实分布,这个时候高偏差/低方差的分类要比低偏差/高方差的分类器效果要好,因为在小样本数据集上低偏差可能就意味着过拟合。当训练集增大时,训练集分布越来越接近于真实分布,这时的低偏差就很重要了。
C4.5是通过概率权重的方法处理缺失值。
分两步:第一步,特征值缺失的情况下,计算所有特征的信息增益或则增益率时候,降低缺失值较多的特征的权重来体现信息的缺失。第二步,选定该划分特征,但样本缺失了该划分特征,将样本同时划分到所有子节点,不过要调整样本的权重。
为什么需要归一化/标准化?
前提:归一化/标准化实质上都是一种线性变化,线性变换不会改变原始数据的数值排序,这决定了归一化/标准化不会造成数据失效,反而能提高数据表现;
通过梯度下降求解的模型一般都是需要归一化的,比如线性回归、逻辑回归、KNN、SVM、神经网络;
树模型不需要归一化;
归一化能提高梯度下降求最优解的速度,归一化之前如果数据处于一个相差较大的范围,比如1到1000,那么特征形成的等高线会非常尖,使用梯度下降进行求解时,很可能走之字路线,从而导致很多次迭代才能收敛。归一化后,等高线收缩到一个相对较圆的区间内,求解时能很快收敛。
归一化有可能提高精度;
标准化是:均值为0, 方差为1;
归一化:将特征向量缩放到系统数值范围,[0,1]或者[-1, 1];
非线性归一化:利用数学函数,将原始值进行映射,例如指数、正切、log等,经常用在数据分化比较大的地方。
归一化和标准化区别:
相同点:都能消除由于不同量纲所引起的误差,且都是一种线性变换,对向量按比例压缩再平移。
什么时候用归一化,什么时候用标准化?
神经网络必须归一化/标准化
树模型为什么不需要归一化?
树模型不需要归一化,因为他们不关心变量的值,而是关心变量之间的分布、变量间的条件概率。
数值的缩放不影响分裂点位置。按照特征值进行排序的,排列顺序不变,所属的分支以及分裂点就不变。
线性不可分的情况下,对偶问题中的解中α > 0对应的样本点,称为支持向量。
stacking:将训练集拆分成k个大小相似但互不相交的子集,选择其中一个作为测试集,剩余未训练集,一次轮换,得到k个弱学习器以及对应的输出,将k个输出作为新的训练集训练一个新的次学习器,作为最终的学习器。
弱分类器尽量使用多种算法,防止过拟合。
blending:将原始训练集分成两部分,在第一部分上训练多个模型,预测另一部分的结果,将结果作为新的特征继续训练。
个体学习器性能相近的时候,使用平均融合,相差较大时,用加权平均。
blending和stacking相比:
xgboost:多棵树共同决策,所有决策树的结果累加起来作为最终结果;
问题:首先加入模型的决策树对模型的贡献非常大,较为靠后的树只影响到少部分样本,而对大部分的样本贡献微乎其微,容易导致模型过拟合并且对少数初始生成的树过度敏感。
xgboost采用缩减方法,为每一棵树设定一个很小的学习率,在一定程度上缓解了过拟合。
DART:将dropout技术引入,应用到增强树中,在训练过程中暂时丢弃部分已经生成的树,使模型中树的贡献更加均衡,防止模型过拟合。
DART在MART的基础上做了两处优化,第一处是在计算梯度时,仅仅从现有的模型中随机选择一个子集,通过该树子集创建新模型,计算新模型的负梯度,通过新的回归树去拟合该负梯度;
第二处是在对新增加的树进行标准化,因为新训练的树会尽力缩小模型和理想模型的差距,而丢弃树集也会缩小该差距,两者共同作用会导致模型过拟合。DART对新树进行标准化,按照丢弃树的数量,对新树进行等比例缩放,确保丢弃树和丢弃树集中的树在相同数量级。
判别式模型:对条件概率分布进行建模,如LR、SVM、神经网络等等;
生成式模型:对联合概率分布进行建模,如贝叶斯、高斯混合模型;
3.relu激活函数
PCA是将高维数据投影到某个低维空间中,并使得其方差尽量大。如果数据中有特征数值特别大,那么它在整个误差计算上的比重就很大,在投影时候,为了逼近原始数据,整个投影会去努力逼近最大的那个特征,而忽略了其他较小的特征。
从计算角度看,如果用梯度下降计算PCA,对数据进行中心化会加快收敛速度;
一阶泰勒展开可以证明负梯度方向是下降最快的方向。而拟合残差只是考虑到损失函数为评分误差的特殊情况,负梯度是更加广义上的拟合项。
代价函数除了loss还有正则项,正则中有参数和变量,很多情况下只拟合残差loss会变小但是正则变大,代价函数不一定就小。梯度的本质也是一种方向导数,综合了各个方向的变化,选择了一个最优下降方向。所以再有正则项的情况下就不再是拟合残差时损失函数最小了,所以需要计算损失函数的梯度。
不可以。lstm中都是饱和函数,当前输入达到一定值后,输出就不会发生明显变化了。如果采用非饱和函数,难以实现门控的效果。
LightGBM是XGBoost的改进版,添加了很多新的方法进行改进模型。
1.特征并行。lgb并没有垂直的切分数据集,而是每个worker都有全量的训练数据。每个worker在基于局部的特征集找到最优分裂特征,worker间传输最优分裂信息,并得到全局最优分裂信息。每个worker基于全局最优分裂信息,在本地进行数据分裂。
2.数据并行。归并来自不同worker的不同特征子集的直方图,然后再局部归并的直方图中找到最优局部信息,最终找到最优的分裂信息。
3.投票并行。每个worker中选出top k个分裂特征,将每个worker选出的特征进行汇总,得出全局特征。
和xgboost对比:
1.xgboost采用基于预排序的决策树算法,每遍历一个特征就需要计算一次特征的增益;lgb使用基于直方图的决策树算法,直方图的优化算法只需要计算k次。
2.xgboost使用按层生长的决策树策略,lgb则采用带有深度限制的按叶子节点算法。在分裂次数相同的情况下,leaf-wise可以降低更多的误差,但会产生较深的树,导致过拟合;
3.优化了特征并行和数据并行算法,还增加了投票并行方案。