增强算法是一系列将弱学习器转换为强学习器的算法。它们在数据科学行业中已成为主流,因为它们在机器学习社区中已经存在多年。增强算法最初由Freund和Schapire在1997年通过他们的AdaBoost算法引入,从那时起,增强算法已成为解决二元分类问题的流行技术。
要理解增强算法为何如此受欢迎,简而言之,增强算法可以超越随机森林、决策树或逻辑回归等更简单的算法。这是许多机器学习竞赛者推广算法的主要原因之一,因为增强算法功能强大,它们可以显著提高模型的预测精度。
许多机器学习竞赛者使用单个增强算法或多个增强算法来解决相应的问题。增强算法通过组合弱学习器来形成一个强学习器,其中弱学习器定义了一个与实际分类略有相关的分类器。与弱学习器相比,强学习器是一个与正确类别相关的分类器。
假设构建了一个随机森林模型,在验证数据集上给出了75%的准确率,然后决定在相同的数据集上尝试其他模型。假设在相同的验证数据集上尝试了线性回归和kNN模型,现在模型分别给出了69%和92%的准确率。
很明显,所有三个模型以完全不同的方式工作,并在相同的数据集上提供完全不同的结果。有没有想过,不是只使用这些模型中的一个,而是使用所有这些模型的组合来进行最终预测?将通过取这些模型预测的平均值来捕获数据中的更多信息;同样,增强算法结合多个更简单的模型(也称为弱学习器)来生成最终输出(也称为强学习器)。
现在会想如何识别弱学习器?为了识别弱学习器,使用具有每次迭代不同分布的机器学习算法,对于每个算法,它生成一个新的弱预测规则。经过多次迭代后,增强算法结合所有脆弱的学习器以形成一个单一的强预测规则。
另一个需要注意的重要事项是,“如何为每一轮确定不同的分布?”需要考虑三个步骤来选择正确的分布:弱学习器考虑所有分布,然后为每个观察结果分配相等的权重。如果错误是由第一个弱学习算法的预测引起的,则更多地关注观察结果的预测错误。应用下一个弱学习算法。最后,重复第二步,直到基础学习算法达到其限制或达到所需的准确性。
最后,作为结果,增强算法结合了所有来自弱学习器的输出。它提出了一个更强大的强学习器,最终提高了模型的预测准确性(如上图所示)。在增强中,它不仅结合了孤立的分类器,还使用了提升前一个分类器中错误分类数据点权重的机制。
现在让看看一些重要的增强算法类型:
在梯度提升算法中,顺序训练多个模型,对于每个新模型,模型使用梯度下降方法逐渐最小化损失函数。梯度树提升算法采用决策树作为弱学习器,因为决策树的节点考虑不同的特征分支来选择最佳拆分,这意味着所有树并不相同。因此,它们始终可以从数据中捕获不同的输出。
梯度树提升算法是顺序构建的,因为对于每棵新树,模型考虑上一棵树的错误,每个连续树的决策都建立在前一棵树犯的错误上。梯度提升算法主要用于分类和回归问题。
from sklearn.ensemble import GradientBoostingClassifier # 用于分类
from sklearn.ensemble import GradientBoostingRegressor # 用于回归
cl = GradientBoostingClassifier(n_estimators=100, learning_rate=1.0, max_depth=1)
cl.fit(Xtrain, ytrain)
其中:n_estimators参数用于控制弱学习器的数量,learning_rate参数控制所有脆弱学习器在最终输出中的贡献,max_depth参数用于限制个体回归估计器的最大深度,以限制树中的节点数量。
AdaBoost算法,简称自适应提升,是机器学习中用作集成方法的提升技术。在自适应提升中,所有权重都重新分配给每个实例,其中更高的权重给予错误分类的模型,并且它适合不同权重的弱学习器序列。
Adaboost从对原始数据集进行预测开始,然后给每个观察结果分配相等的权重。如果使用第一个学习器进行的预测是错误的,它将更高的重要性分配给错误预测的陈述,并进行迭代过程。它继续添加新学习器,直到模型达到限制。
可以使用任何接受训练数据集权重的机器学习算法作为Adaboost的弱学习器,并且它用于回归和分类问题。
from sklearn.ensemble import AdaBoostClassifier # 用于分类
from sklearn.ensemble import AdaBoostRegressor # 用于回归
from sklearn.tree import DecisionTreeClassifier
dtree = DecisionTreeClassifier()
cl = AdaBoostClassifier(n_estimators=100, base_estimator=dtree, learning_rate=1)
cl.fit(xtrain, ytrain)
其中:n_estimators和learning_rate参数的作用与梯度提升算法中相同,base_estimator参数有助于指定不同的机器学习算法。
XGBoost算法,简称极端梯度提升,实际上是梯度提升算法的改进版本,两者的工作程序几乎相同。XGBoost的一个关键点是它在节点级别实现并行处理,使其比梯度提升算法更强大、更快。
XGBoost通过设置XGBoost算法的超参数来包含各种正则化技术,从而减少过拟合并提高整体性能。关于XGBoost的一个重要注意事项是,不需要担心数据集中的缺失值,因为在训练过程中,模型本身会学习在哪里适应缺失值,即左节点或正确的节点。
XGBoost主要用于分类问题,但也可用于回归问题。
import xgboost as xgb
xgb_model = xgb.XGBClassifier(learning_rate=0.001, max_depth=1, n_estimators=100)
xgb_model.fit(x_train, y_train)