目录
1、数据质量要求
算法 | 机器学习类别 | 缺失值 | 连续值 | 不平衡数据 | 离群点 | 数据归一 | 离散特征处理 | 树形 | 特征选择依据 | spark实现 | 过拟合处理、参数 |
决策树-ID3 | 多分类 | 无法处理 | 无法处理 | 不敏感 | 不敏感 | 不敏感 | 可处理 | 多叉树 | 信息增益 | no | |
决策树-C4.5 | 多分类 | 不敏感 | 不敏感 | 不敏感 | 不敏感 | 不敏感 | one-hot 或 K值编码 | 多叉树 | 信息增益率 | no | 后剪枝,计算大 |
决策树-CART | 多分类 | spark中敏感,需处理 | 不敏感 | 不敏感 | 不敏感 | 不敏感 | one-hot 或 K值编码 | 二叉树 | Gini系数 | yes | 超参数: maxdepth、 maxbins、mininfogain、impurity |
决策树-CART | 回归 | spark中敏感,需处理 | 不敏感 | -- | 敏感 | 不敏感 | one-hot 或 K值编码 | 二叉树 | mse | yes | 超参数: 没具体使用,暂不清楚 |
随机森林(rf) | 多分类、回归 | 敏感, spark需处理 | 不敏感 | 不敏感 | 不敏感 | 不敏感 | one-hot 或 K值编码 | -- | 树的特征选择依据 | yes | 超参数: 在上述决策树的基础上,增加树的个数nums、featuresaction一般不调 |
梯度提升决策树(GBDT) | spark支持二分类、回归 | 敏感, spark需处理 | 不敏感 | 分类可能敏感 | 敏感 | 不敏感 | one-hot 或 K值编码 | 二叉树 | mse | yes | 超参数: loss类型、nums、learningrate一般不调 |
2、原理解释
转载一条比较清晰的文章:https://blog.csdn.net/lanyuelvyun/article/details/88736692
(1)白话原理
树的集成+结果认定
不管分类问题还是回归问题,都是(cart回归树+一般损失函数)
每棵树的拟合目标:
负梯度:负偏导,对损失函数求负偏导(算法提出的核心理念,可证明可以使模型收敛得到最小;对F(x)求偏导)),求到的偏导方程在Fm-1(x)(当前已有加法模型)处的值
比较清晰的对于回归问题:集成过程:单颗树是cart回归树,利用mse进行特征选择;集成方式串行,每棵树拟合前面已拟合模型的负梯度;结果认定:每棵树的预测值相加作为整体的预测值。因此,gbdt对数据的要求也就是cart回归树的要求。
对于分类问题:单颗树仍然是回归树,实现分类可形式上参考逻辑回归,也是先实现回归然后做转换并且损失函数是对数损失函数。
(2)场景
spark中的gbdt目前支持二分类和回归预测;调参要求高(不好掌握规律,不像随机森林增加数数量是个好选择)、训练时间长(串行的原因,所以每棵树深度也比较小1-5),适合机器学习竞赛等高性能要求的场景。
Gradient-Boosted Trees (GBTs) are ensembles of decision trees. GBTs iteratively train decision trees in order to minimize a loss function. The spark.ml
implementation supports GBTs for binary classification and for regression, using both continuous and categorical features.
(3)特点
总的来说,随机森林不易过拟合,好调参提升性能,而gbdt调参要求高,但训练时间长、最终的效果也更好。所以通常的做法是先尝试随机森林,它的鲁棒性好,如果效果不错,但是有更高精度要求可以尝试gbdt。
一些copy来的有用的说法:
GBDT和随机森林虽然都是决策树的组合算法,但是两者的训练过程还是很不相同的。
GBDT训练是每次一棵,一棵接着一棵(串行),因此与随机森林并行计算多棵树相比起来,会需要更长的训练时间。
在GBDT中,相对于随机森林而言(随机森林中的树可以不做很多的剪枝),一般会选择更浅(depth更小)的树,这样运算时间会减少。
随机森林更不容易过拟合,而且森林中包含越多的树似乎越不会出现过拟合。用统计学的语言来讲,就是说越多的树包含进来,会降低预测结果的方差(多次预测结果会更加稳定)。但是GBDT则恰好相反,包含预测的树(即迭代的次数越多),反而会更倾向于过拟合,用统计学的语言来将,就是GBDT迭代次数的增加减少的是偏差(预测结果和训练数据label之间的差异)。(偏差和方差这两个概念是不同的概念,见后面的图)
随机森林参数相对更容易调试一些,这是由于随着所包含的决策树的个数增加,其预测效果一般是单调的向好的方向变。而GBDT则不同,一开始预测表现会随着树的数目增大而变好,但是到一定程度之后,反而会随着树的数目增加而变差。
1、组成随机森林的树可以是分类树,也可以是回归树;而GBDT只由回归树组成
2、组成随机森林的树可以并行生成;而GBDT只能是串行生成
3、对于最终的输出结果而言,随机森林采用多数投票等;而GBDT则是将所有结果累加起来,或者加权累加起来
4、随机森林对异常值不敏感,GBDT对异常值非常敏感
5、随机森林对训练集一视同仁,GBDT是基于权值的弱分类器的集成
6、随机森林是通过减少模型方差提高性能,GBDT是通过减少模型偏差提高性能
3、代码相关
有三个关键参数:loss,numIterations,learningRate
loss(损失函数的类型)
Spark中已经实现的损失函数类型有以下三种,注意每一种都只适合一类问题,要么是回归,要么是分类。
分类只可选择 Log Loss,回归问题可选择平方误差和绝对值误差。分别又称为L2损失和L1损失。绝对值误差(L1损失)在处理带有离群值的数据时比L2损失更加具有鲁棒性。
numIterations(迭代次数)
GBDT迭代次数,每一次迭代将产生一棵树,因此numIterations也是算法中所包含的树的数目。增加numIterations会提高训练集数据预测准确率。如何选择合适的参数防止过拟合,一定需要做验证。将数据分为两份,一份是训练集,一份是验证集。
随着迭代次数的增加,一开始在验证集上预测误差会减小,迭代次数增大到一定程度后误差反而会增加,那么通过准确度vs.迭代次数曲线可以选择最合适的numIterations。
learningRate(学习率)
一般不需要调试。