机器学习常见问题

Posted on 2021-12-29 10:56  foghorn  阅读(50)  评论(0编辑  收藏  举报

模型有过拟合的现象,过拟合怎么办?

  • 降低模型复杂度

  • 增加更多的训练数据:使用更大的数据集训练模型

  • 数据增强

  • 正则化:L1、L2、添加BN层

  • 添加Dropout策略

  • Early Stopping

  • 重新清洗数据:把明显异常的数据剔除

  • 使用集成学习方法:把多个模型集成在一起,降低单个模型的过拟合风险

L1正则和L2正则有啥区别?

  • L1是模型各个参数的绝对值之和。L2是模型各个参数的平方和的开方值。

  • L1会趋向于产生少量的特征,而其他的特征都是0。因为最优的参数值很大概率出现在坐标轴上,这样就会导致某一维的权重为0 ,产生稀疏权重矩阵L2会选择更多的特征,这些特征都会接近于0。 最优的参数值很小概率出现在坐标轴上,因此每一维的参数都不会是0。当最小化||w||时,就会使每一项趋近于0。

  • L1的作用是为了矩阵稀疏化。假设的是模型的参数取值满足拉普拉斯分布。L2的作用是为了使模型更平滑,得到更好的泛化能力。假设的是参数是满足高斯分布。

dropout介绍一下,训练测试有啥不一样的地方?

dropout在训练时,以一定的概率p来drop掉相应的神经网络节点,以(1-p)的概率来保留相应的神经网络节点,这相当于每一次训练时模型的网络结构都不一样,也可以理解为训练时添加了不同的数据,所以能够有效减少过拟合。

问题呢,是出在测试时,因为训练的时候以概率p drop了一些节点,比如dropout设置为0.5,隐藏层共有6个节点,那训练的时候有3个节点的值被丢弃,而测试的时候这6个节点都被保留下来,这就导致了训练和测试的时候以该层节点为输入的下一层的神经网络节点获取的期望会有量级上的差异。

为了解决这个问题,在训练时对当前dropout层的输出数据除以(1-p),之后再输入到下一层的神经元节点,以作为失活神经元的补偿,以使得在训练时和测试时每一层的输入有大致相同的期望。

GBDT与Xgboost的区别

  • 传统的GBDT以CART树作为基学习器,XGBoost还支持线性分类器,这个时候XGBoost相当于L1和L2正则化的逻辑斯蒂回归(分类)或者线性回归(回归);

  • 传统的GBDT在优化的时候只用到一阶导数信息,XGBoost则对代价函数进行了二阶泰勒展开,得到一阶和二阶导数;

  • XGBoost在代价函数中加入了正则项,用于控制模型的复杂度。从权衡方差偏差来看,它降低了模型的方差,使学习出来的模型更加简单,放置过拟合,这也是XGBoost优于传统GBDT的一个特性;

  • shrinkage(缩减),相当于学习速率(XGBoost中的eta)。XGBoost在进行完一次迭代时,会将叶子节点的权值乘上该系数,主要是为了削弱每棵树的影响,让后面有更大的学习空间。(GBDT也有学习速率);

  • 列抽样:XGBoost借鉴了随机森林的做法, 支持列抽样, 不仅防止过 拟合,还能减少计算;

  • 对缺失值的处理: 对于特征的值有缺失的样本,XGBoost还可以自动 学习出它的分裂方向;

  • XGBoost工具支持并行。Boosting不是一种串行的结构吗?怎么并行 的?注意XGBoost的并行不是tree粒度的并行,XGBoost也是一次迭代完才能进行下一次迭代的(第t次迭代的代价函数里包含了前面t-1次迭代的预测值)。

XGBoost的并行是在特征粒度上的。我们知道,决策树的学习最耗时的一个步骤就是对特征的值进行排序(因为要确定最佳分割点),XGBoost在训练之前,预先对数据进行了排序,然后保存为block结构,后面的迭代 中重复地使用这个结构,大大减小计算量。这个block结构也使得并行成为了可能,在进行节点的分裂时,需要计算每个特征的增益,最终选增益最大的那个特征去做分裂,那么各个特征的增益计算就可以开多线程进行。

LightGBM与XGBoost的区别

  • xgboost采用的是level-wise的分裂策略,而lightGBM采用了leaf-wise的策略,区别是xgboost对每一层所有节点做无差别分裂,可能有些节点的增益非常小,对结果影响不大,但是xgboost也进行了分裂,带来了不必要的开销。leaft-wise的做法是在当前所有叶子节点中选择分裂收益最大的节点进行分裂,如此递归进行,很明显leaf-wise这种做法容易过拟合,因为容易陷入比较高的深度中,因此需要对最大深度做限制,从而避免过拟合。

  • lightgbm使用了基于histogram的决策树算法,这一点不同与xgboost中的 exact 算法,histogram算法在内存和计算代价上都有不小优势。

  • (1)内存:直方图算法的内存消耗为(#data* #features * 1Bytes)(因为对特征分桶后只需保存特征离散化之后的值),而xgboost的exact算法内存消耗为:(2 * #data * #features* 4Bytes),因为xgboost既要保存原始feature的值,也要保存这个值的顺序索引,这些值需要32位的浮点数来保存。

  • 计算:预排序算法在选择好分裂特征计算分裂收益时需要遍历所有样本的特征值,时间为(#data),而直方图算法只需要遍历桶就行了,时间为(#bin)

特征工程怎么做的?

  • 数据预处理:处理缺失值、图片数据扩充、处理异常值、处理类别不平衡问题

  • 特征缩放:归一化、正则化

  • 特征编码:序号编码(Ordinal Encoding)、独热编码(One-hot Encoding)、二进制编码(Binary Encoding)

Copyright © 2024 foghorn
Powered by .NET 9.0 on Kubernetes