当前位置: 首页 > 科技观察

机器学习模型集成方法总结:Bagging,Boosting,Stacking,Voting,Blending

时间:2023-03-16 20:31:44 科技观察

机器学习是人工智能的一个分支,致力于构建使用统计模型可视化、预测数据的自动学习和自适应系统。通用机器学习模型由数据集(用于训练模型)和算法(用于从数据中学习)组成。但有些模型通常精度较低,会产生不准确的结果。克服这个问题的最简单的解决方案之一是在机器学习模型上使用集成学习。集成学习是一种元方法,它通过组合多个机器学习模型来生成优化模型来提高模型性能。集成学习可以很容易地减少过度拟合,避免模型在训练时表现更好而在测试时无法产生好的结果。综上所述,集成学习具有以下优点:提高模型性能减少过拟合减少方差与单一模型相比,它提供了更高的预测精度。可以处理线性和非线性数据。集成技术可用于解决回归和分类问题。下面我们介绍各种集成学习方法:VotingVoting是一种集成学习,它结合了多个机器学习模型的预测来产生结果。在整个数据集上训练多个基础模型以进行预测。每个模型预测都被视为“投票”。获得多数票的预测将被选为最终预测。有两种类型的投票用于汇总基础预测——硬票和软票。Hardvoting选择得票数最高的预测作为最终预测,而softvoting结合每个模型中每个类的概率,选择概率最高的类作为最终预测。在回归问题中,它的工作方式有点不同,因为我们不是寻找最频繁的类别,而是采用每个模型的预测并计算它们的平均值,从而得出最终预测。从sklearn.ensemble导入VotingClassifier##从sklearn.tree导入DecisionTreeClassifier从sklearn.linear_model从sklearn.naive_bayes导入LogisticRegression从sklearn.neighbors导入GaussianNB从sklearn.svm导入KNeighborsClassifier导入SVCensemble_voting=VotingClassifier(estimators=[('dtc',DecisionTreeClassifier(random_state=42)),('lr',LogisticRegression()),('gnb',GaussianNB()),('knn',KNeighborsClassifier()),('svc',SVC())],voting='hard')ensemble_voting.fit(X_train,y_train)BaggingBagging是采用几个弱机器学习模型并将它们的预测聚合在一起以产生最佳预测。它基于bootstrap聚合,这是一种使用替换从集合中抽取随机样本的采样技术。聚合是组合多个预测以产生最终预测的过程。随机森林是利用Bagging的最著名和最常用的模型之一。它由大量整体运行的决策树组成。它使用套袋和特征随机性的概念来创建每个单独的树。每个决策树都是通过从数据中随机抽取样本来训练的。在随机森林中,我们最终得到的树不仅在不同的数据集上进行了训练,而且还使用不同的特征来预测结果。通常有两种类型的装袋-决策树集成(称为随机森林)和决策树以外的模型集成。两者的工作原理相似,都使用聚合方法生成最终预测,唯一的区别是它们基于的模型。在sklearn中,我们有一个BaggingClassifier类,用于创建决策树以外的模型。##来自sklearn.ensemble的相同分类器(决策树)的装袋集成importBaggingClassifierfromsklearn.svmimportSVCclf=BaggingClassifier(base_estimator=SVC(),n_estimators=10,random_state=0)clf.fit(X_train,y_train)Boostingboostingensemble方法通过强调之前模型的错误来转换weaklearnerForstrong学习者。Boosting以顺序方式实现同??构ML算法,每个模型都试图通过减少前一个模型的错误来提高整个过程的稳定性。在训练n+1模型时,给数据集中的每个数据点赋予相等的权重,这样被模型n错误分类的样本可以赋予更大的权重(重要性)。误差从n个学习器传递给n+1个学习器,每个学习器都试图减少误差。ADABoost是使用Boost生成预测的最基本模型之一。ADAboost创建决策树桩森林(树桩是只有一个节点和两个叶子的决策树),这与创建整个决策树森林的随机森林不同。它为错误分类的样本分配更高的权重,并继续训练模型,直到它获得更低的错误率。从sklearn.tree导入DecisionTreeClassifier从sklearn.ensemble导入AdaBoostClassifierdt=DecisionTreeClassifier(max_depth=2,random_state=0)adc=AdaBoostClassifier(base_estimator=dt,n_estimators=7,learning_rate=0.1,random_state=0)adc_tra,fit(y_train)StackingStacking,也称为堆叠泛化,是DavidH.Wolpert于1992年提出的一种集成技术,通过使用不同的泛化器来减少错误。叠加模型使用来自多个基础模型的预测来构建用于生成最终预测的元模型。堆叠模型由多个层组成,其中每一层由多个机器学习模型组成,这些模型的预测用于训练下一层模型。在叠加过程中,数据被分为两部分,训练集和测试集。训练集被进一步划分为k-folds。基础模型在k-1部分进行训练,在k??部分进行预测。迭代此过程,直到预测到每个折叠。然后将基本模型拟合到整个数据集,并计算性能。此过程也适用于其他基本模型。来自训练集的预测被用作构建第二层或元模型的特征。这个二级模型用于预测测试集。从sklearn.neighbors导入KNeighborsClassifier从sklearn.tree导入DecisionTreeClassifier从sklearn.svm从sklearn.linear_model导入LogisticRegression从sklearn.ensemble导入StackingClassifierbase_learners=[('l1',KNeighborsDeciere,Classifier('))),('l3',SVC(gamma=2,C=1)))]model=StackingClassifier(estimators=base_learners,final_estimator=LogisticRegression(),cv=5)model.fit(X_train,y_train)BlendingBlending来源于Stacking来源于另一种形式关于集成学习技术,两者之间的唯一区别是它使用训练集中的保留(验证)集来进行预测。简而言之,预测仅在保留的数据集上进行。保留的数据集和预测用于构建二级模型。importnumpyasnpfromsklearn.datasetsimportmake_classificationfromsklearn.model_selectionimporttrain_test_splitfromsklearn.metricsimportaccuracy_score##BaseModelsfromsklearn.neighborsimportKNeighborsClassifierfromsklearn.treeimportDecisionTreeClassifierfromsklearn.svmimportSVC##MetaLearner来自sklearn.linear_modelimportLogisticRegression##创建样本数据X,y=make_classification(n_samples=10000,n_features=20,n_informative=15,n_redundant=5,random_state=42)##训练个体逻辑回归模型X_train,X_test,y_train,y_test=train_test_split(X,y,test_size=0.3,random_state=1)logrec=LogisticRegression()logrec.fit(X_train,y_train)pred=logrec.predict(X_test)score=accuracy_score(y_test,pred)print('基本模型精度:%.3f'%(score*100))##DefiningBaseModelsdefbase_models():models=list()models.append(('knn',KNeighborsClassifier()))models.append(('dt',决定ionTreeClassifier()))models.append(('svm',SVC(probability=True)))returnmodels##FittingEnsembleBlendingModel##Step1:SplittingDataIntoTrain,Holdout(Validation)和测试集X_train_full,X_test,y_train_full,y_test=train_test_split(X,y,test_size=0.3,random_state=1)X_train,X_val,y_train,y_val=train_test_split(X_train_full,y_train_full,test_size=0.33,random_state=1)##步骤2:训练基础模型训练集并对验证集进行预测predict_proba(X_val)#存储预测meta_X.append(yhat)#水平堆叠预测meta_X=np.hstack(meta_X)##步骤3:创建混合元学习器blender=LogisticRegression()##基础模型预测训练blender.fit(meta_X,y_val)##第4步:使用ble进行预测寻找元学习器meta_X=list()forname,modelinmodels:yhat=model.predict_proba(X_test)meta_X.append(yhat)meta_X=np.hstack(meta_X)y_pred=blender.predict(meta_X)#Evaluatepredictsscore=accuracy_score(y_test,y_pred)print('混合精度:%.3f'%(score*100))--------------------------------BaseModelAccuracy:82.367BlendingAccuracy:96.733Summary阅读本文后,您可能想知道是否有选择更好模型的最佳方法,或者如果有,使用哪种集成技术?在这个问题中,我们总是建议从一个简单的个体模型开始,然后使用不同的建模技术(例如集成学习)对其进行测试。在某些情况下,个体模型可能比集成模型表现更好,甚至好很多。有一点需要澄清和注意:集成学习永远不应该是第一选择,而是最后选择。原因很简单:训练集成模型将花费大量时间并需要大量处理能力。回到我们的问题,集成模型旨在通过组合同一类的多个基础模型来提高模型的可预测性。每种集成技术都是最好的,有助于提高模型性能。如果您正在寻找一种简单且易于实现的集成方法,那么应该使用Voting。如果您的数据具有高方差,那么您应该尝试装袋。如果训练好的基础模型在模型预测中有很高的偏差,那么可以尝试不同的增强技术来提高准确性。如果有多个基础模型在数据上表现良好,而您不知道选择哪个作为最终模型,则可以使用Stacking或Blending方法。当然,哪种方法表现最好取决于数据和特征分布。最后,集成学习技术是提高模型准确性和性能的强大工具。他们可以很容易地减少数据过拟合和欠拟合的机会,尤其是在参加比赛的时候,这是提高积分的关键。