首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

如何通过Ensemble提高机器学习性能

Ensemble可以提高数据集上的准确度。通过本文,我们将了解到如何使用scikit-learn创建一些最强大的集成类型。将引导我们了解提升(Boosting)、装袋(Bagging)和多数投票(Majority Voting),并展示如何继续提高数据集上模型的准确性。

1. 如何使用装袋集成方法,例如装袋决策树、随机森林和极端随机树。

2. 如何使用提升集成方法,例如AdaBoost和随机梯度提升。

3. 如何使用投票集成方法来结合多个算法的预测。

将模型组合成集成预测

将不同模型的预测结合在一起最流行的三种方法是:

装袋(Bagging):从训练数据的不同子样本中构建多个模型(通常是同种类型的模型)。

提升(Boosting):构建多个模型(通常是同种类型的),每个模型都学习修复序列中先前模型的预测错误。

投票(Voting):构建多个模型(通常是不同类型的)并通过简单统计(如计算平均值)来组合预测。

使用皮马印第安人糖尿病发病数据集来演示每个算法。每个集成算法都使用10折交叉验证和分类准确度性能指标进行演示。

1. 装袋(Bagging)算法

Bootstrap Aggregation(引导聚合,又称Bagging)涉及从训练数据集中多次抽样(允许替换)并针对每个样本训练一个模型。最终输出的预测是在所有子模型的预测上取平均值。三个Bagging模型如下:

装袋决策树(Bagged Decision Trees)

随机森林(Random Forest)

极端随机树(Extra Trees, short for Extremely Randomized Trees)

上述这些方法都利用了bootstrap重采样技术,通过从原始数据集中随机抽取样本,并允许样本中有重复的观测值,来创建多个独立的模型。每个模型都在其特有的数据子集上训练,并且最终的预测是所有模型预测的加权平均(通常是等权重的)。装袋决策树是最简单的形式,它涉及训练多个决策树,然后将它们的预测结果平均。随机森林和极端随机树是更高级的版本,它们不仅随机选择数据样本,还随机选择特征(在随机森林中)或特征和数据的顺序(在极端随机树中),以此来增加模型的随机性和减少过拟合的风险。

在实际应用中,这些方法通常需要调整一些参数,比如装袋的数量、树的最大深度、节点分裂的最小重要性等,以达到最佳的性能。这些参数的调整可以通过交叉验证等技术来进行。

(1) 装袋决策树(Bagged Decision Trees)

Bagging(装袋)是一种增强机器学习模型的技术,它通过结合多个模型来提高预测的准确性和稳定性。Bagging通常与具有高方差的算法一起使用,因为这些算法通过增加更多的样本和特征可以显著提高性能。决策树就是一个高方差的例子,如果不进行剪枝,它们往往会过拟合。

Bagging的基本思想是从原始数据集中随机抽取样本,并构建多个独立的模型。每个模型都在其对应的子样本集上训练,并且通常使用不同的特征子集(在随机森林中这是通过选择随机特征来实现的)。这些模型然后独立地对新数据进行预测,最终通过投票(在分类问题中)或平均(在回归问题中)来组合它们的预测。

Bagging技术的优点包括:

减少过拟合:由于每个模型都是在一个随机子样本集上训练的,因此它们通常不会过度拟合整个数据集。

提高性能:通过结合多个模型,Bagging可以提高预测的准确性和稳定性。

易于实现:Bagging的实现相对简单,特别是在scikit-learn等库中,它们提供了现成的实现,如BaggingClassifier和BaggingRegressor。

然而,Bagging也有其局限性:

计算成本:由于需要训练多个模型,Bagging可能会增加计算成本和时间。

样本抽取方法:Bagging的效果很大程度上取决于样本抽取方法。如果样本抽取不够随机,模型之间可能会产生较大的相关性,从而降低整体性能。

在实际应用中,Bagging是一种非常有效的机器学习技术,尤其是在处理分类和回归问题时。它已经成为许多机器学习竞赛和实际项目中的标准技术之一。

(2)随机森林(Random Forest)

随机森林(Random Forest)是一种基于装袋决策树(bagged decision trees)的机器学习算法。它的核心思想是通过构建多个决策树,并组合它们的预测来提高模型的准确性和稳定性。在随机森林中,训练数据的样本是带有放回地随机抽取的,这意味着每个样本在所有树中都有一样的机会被选中。

为了减少树之间的相关性,随机森林在构建每棵树时不是选择最优的特征进行分割,而是只考虑特征的一个随机子集。这样做有两个主要的效果:

降低过拟合的风险:由于每次分割只考虑特征的一个随机子集,这限制了模型的复杂度,从而减少了过拟合的可能性。

提高模型的多样性:由于每棵树考虑的特征子集都是随机的,因此构建出来的树之间具有更多的多样性,这有助于提高整体模型的泛化能力。

(3)极端随机树(Extra Trees)

极端随机树(Extra Trees)是袋装方法的一种改进,它从训练数据集的样本中构建随机树。我们可以使用scikit-learn库中的ExtraTreesClassifier类来构建一个用于分类的Extra Trees模型。

2. 提升算法(Boosting Algorithms)

提升算法是一种集成学习方法,它通过构建一系列模型来纠正前面模型序列中的错误。一旦这些模型建立起来,它们的预测可能会根据它们展示的准确性进行加权,然后将这些结果结合起来,生成最终的输出预测。最常用的两种提升集成机器学习算法是:

适应性提升(AdaBoost, short for Adaptive Boosting)

随机梯度提升(Stochastic Gradient Boosting, SGB)

(1)适应性提升(AdaBoost, short for Adaptive Boosting)

AdaBoost(适应提升)是最早成功的提升集成算法之一。它通常通过为数据集中的实例分配权重,这些权重表示它们被分类的容易程度或困难程度,从而允许算法在构建后续模型时更加关注或减少对它们的关注。我们可以使用 AdaBoostClassifier类构建一个用于分类的 AdaBoost 模型。

(2)随机梯度提升(Stochastic Gradient Boosting)

随机梯度提升(也称为梯度提升机)是最先进的集成学习技术之一。它也是一种正在证明可能是提高性能的最佳技术之一的方法。我们可以使用GradientBoostingClassifier类构建一个用于分类的梯度提升模型。

3. 投票集成(Voting Ensemble)

投票集成(Voting Ensemble) 投票是结合多个机器学习算法预测的最简单方法之一。它通过首先从训练数据集创建两个或更多独立的模型来工作。然后可以使用投票分类器(Voting Classifier)来包装模型,并在对新数据进行预测时平均子模型的预测。子模型的预测可以加权,但是手动或启发式地指定分类器的权重是困难的。更高级的方法可以学习如何最佳地加权子模型的预测,但这种方法称为堆叠(stacked aggregation)。

代码示例

# coding: utf-8"""本脚本用于展示和比较不同集成学习模型在Pima Indians糖尿病数据集上的表现。包括装袋决策树(Bagging)、随机森林(Random Forest)、极端随机树(Extra Trees)、适应性提升(AdaBoost)、随机梯度提升(Stochastic Gradient Boosting)和投票集成(Voting Ensemble)。"""

from pathlib import Path # 用于处理文件路径import pandas as pd # 用于数据处理from sklearn.preprocessing import StandardScaler # 用于特征标准化from sklearn.model_selection import KFold, cross_val_score # 用于交叉验证from sklearn.ensemble import BaggingClassifier, RandomForestClassifier, ExtraTreesClassifier, AdaBoostClassifier, GradientBoostingClassifier, VotingClassifier # 用于集成学习模型from sklearn.tree import DecisionTreeClassifier # 用于决策树模型from sklearn.linear_model import LogisticRegression # 用于逻辑回归模型from sklearn.svm import SVC # 用于支持向量机模型

# 定义文件路径filename = Path(__file__).parent / 'data/pima-indians-diabetes.csv'

# 加载数据data = pd.read_csv(filename)

# 重命名列名以提高可读性column_names = {'Pregnancies': 'pregnant_times', 'Glucose': 'glucose', 'BloodPressure': 'blood_pressure', 'SkinThickness': 'skin_thickness', 'Insulin': 'insulin', 'BMI': 'BMI', 'DiabetesPedigreeFunction': 'DPF', 'Age': 'age', 'Outcome': 'outcome'}data.rename(columns=column_names, inplace=True)

# 删除含有缺失值的行以进行数据清洗data.dropna(inplace=True)

# 对特征数据进行标准化处理scaler = StandardScaler()X = scaler.fit_transform(data.iloc[:, :-1]) # 提取目标变量Y = data.iloc[:, -1] print(X.shape, Y.shape)

###### 装袋决策树(Bagged Decision Trees) ######print("\n\033[1;30m装袋决策树(Bagged Decision Trees):\033[0m")# 设置随机数种子,保证结果可复现seed = 7 # 划分训练集和测试集kfold = KFold(n_splits=10, random_state=seed, shuffle=True)# 使用决策树作为基础模型cart = DecisionTreeClassifier()# 指定使用的树的数量num_trees = 100# 创建装袋模型model = BaggingClassifier(estimator=cart, n_estimators=num_trees, random_state=seed)# 计算交叉验证的平均分数和标准差results = cross_val_score(model, X, Y, cv=kfold)# 输出结果print("Bagged Decision Trees: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))

###### 随机森林(Random Forest) ######print("\n\033[1;30m随机森林(Random Forest):\033[0m")# 设置树的数量和每次抽取的特征数num_trees, max_features = 100, 3kfold = KFold(n_splits=10, random_state=seed, shuffle=True)# 创建随机森林模型model = RandomForestClassifier(n_estimators=num_trees, max_features=max_features)results = cross_val_score(model, X, Y, cv=kfold)# 输出结果print("Random Forest: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))

###### 极端随机树(Extra Trees) ######print("\n\033[1;30m极端随机树(Extra Trees):\033[0m")# 设置树的数量和每次抽取的特征数num_trees, max_features = 100, 3kfold = KFold(n_splits=10, random_state=seed, shuffle=True)# 创建极端随机树模型model = ExtraTreesClassifier(n_estimators=num_trees, max_features=max_features)results = cross_val_score(model, X, Y, cv=kfold)# 输出结果print("Extra Trees: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))

###### 适应性提升(AdaBoost) ######print("\n\033[1;30m适应性提升(AdaBoost):\033[0m")# 设置树的数量和随机数种子num_trees, seed = 30, 7kfold = KFold(n_splits=10, random_state=seed, shuffle=True)# 创建AdaBoost模型model = AdaBoostClassifier(n_estimators=num_trees, random_state=seed)results = cross_val_score(model, X, Y, cv=kfold)# 输出结果print("AdaBoost: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))

###### 随机梯度提升(Stochastic Gradient Boosting) ######print("\n\033[1;30m随机梯度提升(Stochastic Gradient Boosting):\033[0m")# 设置树的数量和随机数种子num_trees, seed = 100, 7kfold = KFold(n_splits=10, random_state=seed, shuffle=True)# 创建随机梯度提升模型model = GradientBoostingClassifier(n_estimators=num_trees, random_state=seed)results = cross_val_score(model, X, Y, cv=kfold)# 输出结果print("Stochastic Gradient Boosting: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))

###### 投票集成(Voting Ensemble) ######print("\n\033[1;30m投票集成(Voting Ensemble):\033[0m")# 定义参与投票的模型models = [ ('lr', LogisticRegression()), ('dtc', DecisionTreeClassifier()), ('svm', SVC())]# 创建投票集成模型ensembles = VotingClassifier(models)results = cross_val_score(ensembles, X, Y, cv=kfold)# 输出结果print("Voting Ensemble: %.3f%% (%.3f%%)" % (results.mean()*100.0, results.std()*100.0))

总结

我们了解了用于提高模型在问题中的性能的集成机器学习算法。

装袋集成,包括装袋决策树、随机森林和极端随机数。

提升集成,包括AdaBoost和随机梯度提升。

投票集成,用于平均任何任意模型的预测。

  • 发表于:
  • 原文链接https://page.om.qq.com/page/OQV-4iF010tpVKgXTjxe8K8Q0
  • 腾讯「腾讯云开发者社区」是腾讯内容开放平台帐号(企鹅号)传播渠道之一,根据《腾讯内容开放平台服务协议》转载发布内容。
  • 如有侵权,请联系 cloudcommunity@tencent.com 删除。

扫码

添加站长 进交流群

领取专属 10元无门槛券

私享最新 技术干货

扫码加入开发者社群
领券