集成方法是通过建立一组独立的机器学习模型,组合多个模型的预测对类标签进行预测的方法。这种策略组合可以减少总误差,包括减少方差和偏差,或者提高单个模型的性能。
在这里,我使用来自Kaggle的“红酒质量”数据(https://www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009)来演示集成方法。“quality”是我们的目标变量。我唯一要做的预处理就是将10分制的评分转换为3个分类级别,“ 1”,“ 2”和“ 3”分别代表“好”,“中”和“差”。
import pandas as pdfrom sklearn.model_selection import train_test_splitfrom sklearn.metrics import accuracy_score#import datawine = pd.read_csv('winequality.csv')#preprocess datadef getquality(x): if x > 6.5: return 1 elif x < 4.5: return 3 else: return 2wine['quality'] = wine['quality'].apply(getquality)#seperate features and target variablex = wine.drop(['quality'], axis=1)y = wine['quality']#split into train and test dataxtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=1)#copy code to deal with SettingWithCopyWarnxtrain = xtrain.copy()xtest = xtest.copy()ytrain = ytrain.copy()ytest = ytest.copy()
机器学习模型1:
默认的DecisionTreeClassifier()的准确性得分是0.815625。
from sklearn.tree import DecisionTreeClassifiermodel = DecisionTreeClassifier()model.fit(xtrain, ytrain)model_pred = model.predict(xtest)#see prediction resultprint('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest)))
所谓的bootstrapping aggregation,其思想是在随机不同版本的训练数据上训练许多基础模型。每个模型拥有一票表决权,并且无论预测准确度如何,都做相同的处理,然后对预测变量进行汇总以得出最终结果。在大多数情况下,Bagging后结果的方差会变小。例如,随机森林是Bagging方法中最著名的模型,它将决策树与Bagging理念结合在一起。
我们通常在每一轮中使用bootstrapping方法(替换样本)从原始样本集中提取训练子集。因此,在训练集中,有些样本可能被多次使用,而有些样本可能永远不会被使用。这使得训练子集是独立的。
模型的选择没有限制,我们根据所面临的问题采用不同的分类器或回归器。每个预测模型都可以由训练集并行生成。它们同等重要,所占比重相同。在合并输出后,我们对分类问题使用多数投票,对回归问题使用平均投票。
机器学习模型2:
我们没有建立随机森林分类器,而是将决策树与BaggingClassifier()结合使用,得到了0.856250的准确率。
from sklearn.ensemble import BaggingClassifiermodel = BaggingClassifier(base_estimator=clf, random_state=0)model.fit(xtrain, ytrain)model_pred = model.predict(xtest)#see prediction resultprint('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest)))
boosting和bagging之间最本质的区别在于,boosting并不会同等的对待基础模型,而是通过连续的测试和筛选来选择“精英”。表现良好的模型对投票的权重更大,而表现较差的模型的权重更小,然后将所有的投票组合得到最终结果。在大多数情况下,boosting后结果的偏差会变小。例如,Adaboost和Gradient boost是boosting方法中最常用的模型。
一般情况下,每一轮的训练集保持不变,但在boosting轮次结束时,模型中每个样本在训练集中的分布可能会发生变化。这是一个迭代过程,它更关注(增加权重)以前错误分类的记录,而忽略(减少权重)前一轮中正确的记录。换句话说,它可以将弱学习者的表现提高到强学习者的水平。
与bagging不同,每个预测模型只能顺序生成,因为后一个模型的参数需要前一个模型的结果。汇总模型后,我们对分类问题使用多数投票,对回归问题进行平均。
机器学习模型3:
GradientBoostingClassifier()给我们的准确率评分为0.846875,也高于没有boost的准确率。
from sklearn.ensemble import GradientBoostingClassifiermodel = GradientBoostingClassifier(random_state=0)model.fit(xtrain, ytrain)model_pred = model.predict(xtest)#see prediction resultprint(‘Accuracy Score: {0:6f}’.format(model.score(xtest, ytest)))
对基础模型(弱学习者)的结果进行平均或投票相对简单,但是学习误差可能很大,因此创建了另一种学习方法(Stacking)。Stacking策略不是对模型的结果进行简单的逻辑处理,而是在模型外增加一层。
因此,我们总共有两层模型,即通过预测训练集建立第一层模型,然后将训练集预测模型的结果作为输入,再对第二层新模型进行训练,得到最终结果。基本上,Stacking可以减少方差或bagging/boosting的偏差。
机器学习模型4:
StackingClassifier()的准确率得分为0.875000。虽然与第1层模型相比,它不是最高的,但它成功地提高了决策树和KNN的性能。
from sklearn.neighbors import KNeighborsClassifierfrom sklearn.ensemble import RandomForestClassifierfrom mlxtend.classifier import StackingClassifier#build two layer models using stackinglayer1 = [DecisionTreeClassifier(), KNeighborsClassifier(), RandomForestClassifier(random_state=0)]layer2 = GradientBoostingClassifier(random_state=0)model = StackingClassifier(classifiers=layer1, meta_classifier=layer2)model.fit(xtrain, ytrain)model_pred = model.predict(xtest)#see prediction resultprint(‘Accuracy Score: {0:6f}’.format(model.score(xtest, ytest)))
从混淆矩阵中,我们发现对于所有模型而言,葡萄酒的中等级别(第二行)确实很难预测。但是,葡萄酒的差等级(第三行)更容易识别。
尽管我们能够在不理解场景背后的情况下构建模型,但是仍然建议您了解每个机器学习模型是如何工作的。因为只有对一个模型有了更多的了解,我们才能有效地使用它,并解释它是如何正确地做出预测的。