一、引言
在机器学习和数据分析领域,集成学习算法因其能够显著提高模型预测性能而备受关注。然而,任何算法在应用过程中都不可避免地会遇到一些挑战和问题,集成学习算法也不例外。其中,最为常见且关键的两大问题便是欠拟合(Underfitting)与过拟合(Overfitting)。
欠拟合,指的是模型在训练数据上都无法获得良好的性能,即模型无法充分学习到数据的内在规律和特征。这通常是由于模型复杂度不足、特征选择不当或训练数据不足等原因导致的。欠拟合的模型在应用于新数据时,往往无法给出准确的预测结果,从而限制了其在实际应用中的性能。
与欠拟合相反,过拟合 则是模型在训练数据上表现优异,但在新数据或测试数据上性能急剧下降的现象。过拟合通常是由于模型复杂度过高、训练数据中的噪声过多或模型训练过度等原因造成的。过拟合的模型虽然能够完美地拟合训练数据,但却无法适应新数据的分布和变化,因此在实际应用中往往效果不佳。
在集成学习算法中,如何有效地解决欠拟合和过拟合问题,是提高模型预测性能的关键所在。针对这两个问题,研究者们提出了多种策略和方法,如Boosting技术通过逐步增强学习来解决欠拟合问题,Bagging技术则通过创建多个子集并训练独立模型来降低过拟合风险。
分类算法
在机器学习算法(分类算法)中,将算法分为两类:
弱分类器:逻辑回归算法、决策树算法
强分类器:
相当于弱分类器算法而言称呼,往往是多个弱分类器算法组成的,
集成学习算法常见两类:
Bagging 算法:袋子
使用多个软分器算法构建多个模型,使用每个模型进行预测,共同决定预测结果
(典型算法:随机森林)
Boosting 算法:提升
选择某个弱分类器的算法,逐步优化算法模型,逐步提升Boosting,最终获取最佳算法模型
(典型算法:梯度提升树)
二、随机森林
概述
**随机森林(Random Forest)**是一种集成学习方法,它基于决策树,通过构建多个决策树并将它们的预测结果结合起来,从而提高了预测的准确性和稳定性。在随机森林中,"随机"和"森林"两个词都有其特定的含义。
"随机"的含义 在随机森林中,"随机"主要体现在两个方面:
**随机选择样本:**对于每一棵决策树,都从原始数据集中随机有放回地抽取一部分样本作为该决策树的训练集。这种做法称为自助法(bootstrap sampling),它允许训练集中有重复的样本,同时也可能有一些样本没有被选中。通过这种方法,每棵决策树都基于一个略有不同的训练集进行训练,从而提高了整个模型的泛化能力。
**随机选择特征:**在构建决策树的每个节点时,不是考虑所有的特征,而是从所有特征中随机选择一部分特征(例如,选择所有特征的平方根数量),然后基于这些随机选择的特征来找到最佳的分裂点。这种做法进一步增加了每棵决策树之间的差异,提高了整个模型的多样性。
"森林"的含义 在随机森林中,"森林"指的是由多棵决策树组成的集合。这些决策树都是基于随机选择的样本和随机选择的特征进行训练的。每棵决策树都会对其输入的数据进行预测,并产生一个分类或回归的结果。然后,这些结果会被结合起来(例如,通过投票或平均),以产生最终的预测结果。
假设我们有一个数据集,用于预测一个植物是否属于某个特定的物种。这个数据集包含了许多样本,每个样本都有多个特征(如叶子的形状、颜色、大小等)。
**随机选择样本:**对于第一棵决策树,我们从原始数据集中随机选择一部分样本(可能有重复)作为训练集。对于第二棵决策树,我们再次随机选择一部分样本(可能与第一棵树的训练集不同)。这样,每棵决策树都是基于一个略有不同的训练集进行训练的。
**随机选择特征:**在构建第一棵决策树的每个节点时,我们随机选择一部分特征(例如,选择所有特征的一半),然后基于这些特征来找到最佳的分裂点。对于第二棵决策树,我们同样随机选择一部分特征(可能与第一棵树选择的特征不同)。这样,每棵决策树在构建过程中都考虑了不同的特征组合。
**森林:**我们重复上述过程,构建多棵决策树(例如,100棵)。这些决策树共同组成了随机森林。当我们需要预测一个新的样本时,我们将它输入到每一棵决策树中,得到每棵树的预测结果。然后,我们通过投票(对于分类问题)或平均(对于回归问题)的方式,将这些预测结果结合起来,得到最终的预测结果。
算法步骤:
1.用N来表示训练用例(样本)的个数,M表示特征数目。
2.输入特征数目m,用于确定决策树上一个节点的决策结果;其中m应远小于M。
3.从N个训练用例(样本)中以有放回抽样的方式,取样N次,形成一个训练集(即bootstrap取样),并用未抽到的用例(样本)作预测,评估其误差。
4.对于每一个节点,随机选择m个特征,决策树上每个节点的决定都是基于这些特征确定的。根据这m个特征,计算其最佳的分裂方式。
5.每棵树都会完整成长而不会剪枝,这有可能在建完一棵正常树状分类器后会被采用)。
随机森林的优缺点:
优点:
- 对于很多种资料,它可以产生高准确度的分类器;
- 它可以处理大量的输入变数;
- 它可以在决定类别时,评估变数的重要性;
- 在建造森林时,它可以在内部对于一般化后的误差产生不偏差的估计;
- 它包含一个好方法可以估计遗失的资料,并且,如果有很大一部分的资料遗失,仍可以维持准确度;
- 它提供一个实验方法,可以去侦测variable interactions;
- 对于不平衡的分类资料集来说,它可以平衡误差;
- 它计算各例中的亲近度,对于数据挖掘、侦测离群点(outlier)和将资料视觉化非常有用; 使用上述。它可被延伸应用在未标记的资料上,这类资料通常是使用非监督式聚类。也可侦测偏离者和观看资料;
- 学习过程是很快速的
缺点:
- 对噪声和异常值敏感,受到噪声和异常值影响的时候可能会导致模型的性能下降。
- 难以解释和理解。与简单的线性模型相比随机森林的决策边界更加难以理解。
- 参数调整复杂。随机森林的性能受到多个参数的影响,比如树的数量、每棵树的最大深度、每个节点分裂所需的最小样本数等。
- 可能不是最优解,对于某些特定的问题,其他的机器学习算法可能较为合适。
与其他分类器一样,森林分类器必须拟合(fit)两个数组: 保存训练样本的数组(或稀疏或稠密的)X,大小为 [n_samples, n_features],和 保存训练样本目标值(类标签)的数组 Y,大小为 [n_samples]:
python
>>> from sklearn.ensemble import RandomForestClassifier
>>> X = [[0, 0], [1, 1]]
>>> Y = [0, 1]
>>> clf = RandomForestClassifier(n_estimators=10)
>>> clf = clf.fit(X, Y)
三、梯度提升树
梯度提升树(Gradient Boosting Decision Tree,简称GBDT)是一种基于梯度提升(Gradient Boosting)框架的决策树算法。它的核心思想是通过迭代地构建多棵决策树,每棵树都尝试去纠正前一棵树的预测错误,从而逐渐提高模型的预测性能。
基本原理
集成学习: 梯度提升树属于集成学习中的提升(Boosting)方法,它通过迭代训练多个弱学习器(在GBDT中通常为决策树),并将它们组合成一个强学习器来提高预测性能。
梯度提升: 在提升方法中,每个新的学习器都针对前一个学习器的错误进行训练,以逐步减小预测误差。梯度提升是提升方法的一种实现,它利用损失函数的负梯度来指导每个新学习器的训练方向。
**决策树:**在GBDT中,每个弱学习器都是一个决策树。决策树是一种易于理解和实现的分类和回归方法,它通过递归地将数据集划分为更小的子集来生成一个树形结构。
算法步骤
初始化: 首先,GBDT使用一个简单的学习器(如均值或众数)对训练数据进行初步预测,并计算预测值与真实值之间的残差。
迭代训练: 然后,GBDT开始迭代训练多个决策树。在每次迭代中,它使用当前的残差作为目标变量来训练一个新的决策树。这个新的决策树将尝试拟合当前的残差,从而逐步减小预测误差。
更新预测: 每个新的决策树训练完成后,GBDT都会将其预测结果与前一个模型的预测结果相加,得到新的预测值。同时,GBDT也会更新残差,以便在下一轮迭代中继续训练新的决策树。
重复迭代: GBDT会重复上述迭代过程,直到达到预设的迭代次数或满足其他停止条件(如验证集上的性能开始下降)。
**输出结果:**最后,GBDT将所有决策树的预测结果进行加权融合(通常使用等权融合),得到最终的预测结果。
GBDT优缺点
优点:
- 对混合型数据的自然处理(异构特征)
- 强大的预测能力
- 在输出空间中对异常点的鲁棒性(通过具有鲁棒性的损失函数实现)
缺点:
- 可扩展性差(此处的可扩展性特指在更大规模的数据集/复杂度更高的模型上使用的能力,而非我们通常说的功能的扩展性;GBDT 支持自定义的损失函数,从这个角度看它的扩展性还是很强的!)。由于提升算法的有序性(也就是说下一步的结果依赖于上一步),因此很难做并行.
GradientBoostingClassifier 既支持二分类又支持多分类问题。 下面的例子展示了如何训练一个包含 100 个决策树弱学习器的梯度提升分类器:
python
>>> from sklearn.datasets import make_hastie_10_2
>>> from sklearn.ensemble import GradientBoostingClassifier
>>> X, y = make_hastie_10_2(random_state=0)
>>> X_train, X_test = X[:2000], X[2000:]
>>> y_train, y_test = y[:2000], y[2000:]
>>> clf = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0,
... max_depth=1, random_state=0).fit(X_train, y_train)
>>> clf.score(X_test, y_test)
0.913...
弱学习器(例如:回归树)的数量由参数 n_estimators 来控制;每个树的大小可以通过由参数 max_depth 设置树的深度,或者由参数 max_leaf_nodes 设置叶子节点数目来控制。 learning_rate 是一个在 (0,1] 之间的超参数,这个参数通过 shrinkage(缩减步长) 来控制过拟合。
四、总结:
Bagging通过并行训练多个基学习器并取平均(或投票)减少方差(典型算法:随机森林 ),而Boosting通过串行方式训练基学习器并加权组合,侧重于减少偏差(典型算法:梯度提升树)。两者均有助于降低过拟合风险,但不直接解决欠拟合。
(以上为学习笔记,侵删。)