机器学习中集成学习( Bagging, Boosting和Stacking)简介和示例
作者头像
  • 造就
  • 2020-04-30 15:49:50 17

什么是集成方法?

集成方法是一种通过建立多个独立的机器学习模型,并将这些模型的预测结果结合起来,从而提高整体预测准确性的方法。这种方法可以降低总体误差,包括减少方差和偏差,或者增强单个模型的功能。

本次演示中,我使用了Kaggle上的“红酒质量”数据集(https://www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009)来展示集成方法的应用。“质量”是我们要预测的目标变量。唯一的预处理步骤是将评分转换为三个分类级别:“1”代表“好”,“2”代表“中”,“3”代表“差”。

数据预处理

```python import pandas as pd from sklearn.modelselection import traintestsplit from sklearn.metrics import accuracyscore

导入数据

wine = pd.read_csv('winequality.csv')

预处理数据

def getquality(x): if x > 6.5: return 1 elif x < 4.5: return 3 else: return 2

wine['quality'] = wine['quality'].apply(getquality)

分离特征和目标变量

x = wine.drop(['quality'], axis=1) y = wine['quality']

划分训练集和测试集

xtrain, xtest, ytrain, ytest = traintestsplit(x, y, testsize=0.2, randomstate=1)

复制数据以避免警告

xtrain = xtrain.copy() xtest = xtest.copy() ytrain = ytrain.copy() ytest = ytest.copy() ```

机器学习模型1

默认的DecisionTreeClassifier()模型的准确率为0.815625。

```python from sklearn.tree import DecisionTreeClassifier

model = DecisionTreeClassifier() model.fit(xtrain, ytrain) model_pred = model.predict(xtest)

查看预测结果

print('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest))) ```

Bagging

所谓的自举聚合(bootstrap aggregation),其核心思想是在不同版本的训练数据上训练多个基础模型。每个模型具有相同的投票权重,并且所有模型的预测结果会被汇总以得出最终结果。在大多数情况下,Bagging能显著降低结果的方差。例如,随机森林就是一种结合决策树和Bagging理念的著名模型。

模型的选择没有限制,可以根据具体问题选用不同的分类器或回归器。每个预测模型可以并行生成,且每个模型的权重相同。在合并输入后,对分类任务采用多数投票,对回归任务采用平均投票。

机器学习模型2

我们使用BaggingClassifier()将决策树与Bagging技术相结合,得到了0.856250的准确率。

```python from sklearn.ensemble import BaggingClassifier

model = BaggingClassifier(baseestimator=clf, randomstate=0) model.fit(xtrain, ytrain) model_pred = model.predict(xtest)

查看预测结果

print('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest))) ```

Boosting

Boosting与Bagging的主要区别在于,Boosting不会同等对待所有基础模型,而是通过连续的测试和筛选来选择“精英”模型。表现良好的模型在投票中的权重更大,而表现较差的模型的权重更小。Boosting通常能显著降低结果的偏差。例如,AdaBoost和梯度提升是两种常用的Boosting方法。

在Boosting过程中,每一轮的训练集保持不变,但模型中每个样本的分布可能会发生变化。这是一个迭代过程,它更关注于那些先前被错误分类的样本,而减少对正确分类样本的关注。换句话说,Boosting可以将弱学习者提升为强学习者。

机器学习模型3

GradientBoostingClassifier()的准确率为0.846875,高于未使用Boosting的准确率。

```python from sklearn.ensemble import GradientBoostingClassifier

model = GradientBoostingClassifier(randomstate=0) model.fit(xtrain, ytrain) modelpred = model.predict(xtest)

查看预测结果

print('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest))) ```

Stacking

在基础模型(弱学习者)的结果上进行简单的平均或投票虽然简单,但可能无法有效减少学习误差。因此,Stacking方法应运而生。不同于简单的逻辑处理,Stacking在模型外添加了一层,从而减少了方差或偏差。

Stacking策略是在第一层模型中使用多个基础模型,然后将这些模型的预测结果作为输入,训练第二层模型,从而获得最终结果。基本上,Stacking可以提高模型的整体性能。

机器学习模型4

使用StackingClassifier()的准确率为0.875000。尽管与第一层模型相比,它不是最高的,但确实提升了决策树和KNN模型的性能。

```python from sklearn.neighbors import KNeighborsClassifier from sklearn.ensemble import RandomForestClassifier from mlxtend.classifier import StackingClassifier

使用Stacking构建两层模型

layer1 = [DecisionTreeClassifier(), KNeighborsClassifier(), RandomForestClassifier(randomstate=0)] layer2 = GradientBoostingClassifier(randomstate=0) model = StackingClassifier(classifiers=layer1, metaclassifier=layer2) model.fit(xtrain, ytrain) modelpred = model.predict(xtest)

查看预测结果

print('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest))) ```

总结

通过混淆矩阵分析,我们发现对于所有模型而言,红酒的中等级别(第二行)的预测较为困难,而差等级别的预测则更为准确。尽管可以在不了解背景的情况下构建模型,但我们仍然建议深入了解每个机器学习模型的工作原理。只有充分理解模型,才能更有效地应用它们,并解释它们的预测结果。

    本文来源:图灵汇
责任编辑: : 造就
声明:本文系图灵汇原创稿件,版权属图灵汇所有,未经授权不得转载,已经协议授权的媒体下载使用时须注明"稿件来源:图灵汇",违者将依法追究责任。
    分享
学习示例StackingBoosting机器集成Bagging简介
    下一篇