百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 技术文章 > 正文

机器学习中集成学习( Bagging, Boosting和Stacking)简介和示例

itomcoil 2024-12-28 13:34 32 浏览


什么是集成方法?

集成方法是通过建立一组独立的机器学习模型,组合多个模型的预测对类标签进行预测的方法。这种策略组合可以减少总误差,包括减少方差和偏差,或者提高单个模型的性能。

在这里,我使用来自Kaggle的“红酒质量”数据(https://www.kaggle.com/uciml/red-wine-quality-cortez-et-al-2009)来演示集成方法。“Quality”是我们的目标变量。我唯一要做的预处理就是将10分制的评分转换为3个分类级别,“ 1”,“ 2”和“ 3”分别代表“好”,“中”和“差”。

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
#import data
wine = pd.read_csv('winequality.csv')
#preprocess data
def getquality(x):
    if x > 6.5:
        return 1
    elif x < 4.5:
        return 3
    else:
        return 2
wine['quality'] = wine['quality'].apply(getquality)
#seperate features and target variable
x = wine.drop(['quality'], axis=1)
y = wine['quality']
#split into train and test data
xtrain, xtest, ytrain, ytest = train_test_split(x, y, test_size=0.2, random_state=1)
#copy code to deal with SettingWithCopyWarn
xtrain = xtrain.copy()
xtest = xtest.copy()
ytrain = ytrain.copy()
ytest = ytest.copy()

机器学习模型1:

默认的DecisionTreeClassifier()的准确性得分是0.815625。

from sklearn.tree import DecisionTreeClassifier
model = DecisionTreeClassifier()
model.fit(xtrain, ytrain)
model_pred = model.predict(xtest)
#see prediction result
print('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest)))

Bagging

所谓的bootstrapping aggregation,其思想是在随机不同版本的训练数据上训练许多基础模型。每个模型拥有一票表决权,并且无??论预测准确度如何,都做相同的处理,然后对预测变量进行汇总以得出最终结果。在大多数情况下,Bagging后结果的方差会变小。例如,随机森林是Bagging方法中最著名的模型,它将决策树与Bagging理念结合在一起。

我们通常在每一轮中使用bootstrapping方法(替换样本)从原始样本集中提取训练子集。因此,在训练集中,有些样本可能被多次使用,而有些样本可能永远不会被使用。这使得训练子集是独立的。

模型的选择没有限制,我们根据所面临的问题采用不同的分类器或回归器。每个预测模型都可以由训练集并行生成。它们同等重要,所占比重相同。在合并输出后,我们对分类问题使用多数投票,对回归问题使用平均投票。

机器学习模型2:

我们没有建立随机森林分类器,而是将决策树与BaggingClassifier()结合使用,得到了0.856250的准确率。

from sklearn.ensemble import BaggingClassifier
model = BaggingClassifier(base_estimator=clf, random_state=0)
model.fit(xtrain, ytrain)
model_pred = model.predict(xtest)
#see prediction result
print('Accuracy Score: {0:6f}'.format(model.score(xtest, ytest)))

Boosting

boosting和bagging之间最本质的区别在于,boosting并不会同等的对待基础模型,而是通过连续的测试和筛选来选择“精英”。表现良好的模型对投票的权重更大,而表现较差的模型的权重更小,然后将所有的投票组合得到最终结果。在大多数情况下,boosting后结果的偏差会变小。例如,Adaboost和Gradient boost是boosting方法中最常用的模型。

一般情况下,每一轮的训练集保持不变,但在boosting轮次结束时,模型中每个样本在训练集中的分布可能会发生变化。这是一个迭代过程,它更关注(增加权重)以前错误分类的记录,而忽略(减少权重)前一轮中正确的记录。换句话说,它可以将弱学习者的表现提高到强学习者的水平。

与bagging不同,每个预测模型只能顺序生成,因为后一个模型的参数需要前一个模型的结果。汇总模型后,我们对分类问题使用多数投票,对回归问题进行平均。

机器学习模型3:

GradientBoostingClassifier()给我们的准确率评分为0.846875,也高于没有boost的准确率。

from sklearn.ensemble import GradientBoostingClassifier
model = GradientBoostingClassifier(random_state=0)
model.fit(xtrain, ytrain)
model_pred = model.predict(xtest)
#see prediction result
print(‘Accuracy Score: {0:6f}’.format(model.score(xtest, ytest)))

Stacking

对基础模型(弱学习者)的结果进行平均或投票相对简单,但是学习误差可能很大,因此创建了另一种学习方法(Stacking)。Stacking策略不是对模型的结果进行简单的逻辑处理,而是在模型外增加一层。

因此,我们总共有两层模型,即通过预测训练集建立第一层模型,然后将训练集预测模型的结果作为输入,再对第二层新模型进行训练,得到最终结果。基本上,Stacking可以减少方差或bagging/boosting的偏差。

机器学习模型4:

StackingClassifier()的准确率得分为0.875000。虽然与第1层模型相比,它不是最高的,但它成功地提高了决策树和KNN的性能。

from sklearn.neighbors import KNeighborsClassifier
from sklearn.ensemble import RandomForestClassifier
from mlxtend.classifier import StackingClassifier
#build two layer models using stacking
layer1 = [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 result
print(‘Accuracy Score: {0:6f}’.format(model.score(xtest, ytest)))

最后

从混淆矩阵中,我们发现对于所有模型而言,葡萄酒的中等级别(第二行)确实很难预测。但是,葡萄酒的差等级(第三行)更容易识别。

尽管我们能够在不理解场景背后的情况下构建模型,但是仍然建议您了解每个机器学习模型是如何工作的。因为只有对一个模型有了更多的了解,我们才能有效地使用它,并解释它是如何正确地做出预测的。

相关推荐

Python编程实现求解高次方程_python求次幂
Python编程实现求解高次方程_python求次幂

#头条创作挑战赛#编程求解一元多次方程,一般情况下对于高次方程我们只求出近似解,较少的情况可以得到精确解。这里给出两种经典的方法,一种是牛顿迭代法,它是求解方程根的有效方法,通过若干次迭代(重复执行部分代码,每次使变量的当前值被计算出的新值...

2025-10-23 03:58 itomcoil

python常用得内置函数解析——sorted()函数

接下来我们详细解析Python中非常重要的内置函数sorted()1.函数定义sorted()函数用于对任何可迭代对象进行排序,并返回一个新的排序后的列表。语法:sorted(iterabl...

Python入门学习教程:第 6 章 列表

6.1什么是列表?在Python中,列表(List)是一种用于存储多个元素的有序集合,它是最常用的数据结构之一。列表中的元素可以是不同的数据类型,如整数、字符串、浮点数,甚至可以是另一个列表。列...

Python之函数进阶-函数加强(上)_python怎么用函数

一.递归函数递归是一种编程技术,其中函数调用自身以解决问题。递归函数需要有一个或多个终止条件,以防止无限递归。递归可以用于解决许多问题,例如排序、搜索、解析语法等。递归的优点是代码简洁、易于理解,并...

Python内置函数range_python内置函数int的作用

range类型表示不可变的数字序列,通常用于在for循环中循环指定的次数。range(stop)range(start,stop[,step])range构造器的参数必须为整数(可以是内...

python常用得内置函数解析——abs()函数

大家号这两天主要是几个常用得内置函数详解详细解析一下Python中非常常用的内置函数abs()。1.函数定义abs(x)是Python的一个内置函数,用于返回一个数的绝对值。参数:x...

如何在Python中获取数字的绝对值?

Python有两种获取数字绝对值的方法:内置abs()函数返回绝对值。math.fabs()函数还返回浮点绝对值。abs()函数获取绝对值内置abs()函数返回绝对值,要使用该函数,只需直接调用:a...

贪心算法变种及Python模板_贪心算法几个经典例子python

贪心算法是一种在每一步选择中都采取当前状态下最优的选择,从而希望导致结果是全局最优的算法策略。以下是贪心算法的主要变种、对应的模板和解决的问题特点。1.区间调度问题问题特点需要从一组区间中选择最大数...

Python倒车请注意!负步长range的10个高能用法,让代码效率翻倍

你是否曾遇到过需要倒着处理数据的情况?面对时间序列、日志文件或者矩阵操作,传统的遍历方式往往捉襟见肘。今天我们就来揭秘Python中那个被低估的功能——range的负步长操作,让你的代码优雅反转!一、...

Python中while循环详解_python怎么while循环

Python中的`while`循环是一种基于条件判断的重复执行结构,适用于不确定循环次数但明确终止条件的场景。以下是详细解析:---###一、基本语法```pythonwhile条件表达式:循环体...

简单的python-核心篇-面向对象编程

在Python中,类本身也是对象,这被称为"元类"。这种设计让Python的面向对象编程具有极大的灵活性。classMyClass:"""一个简单的...

简单的python-python3中的不变的元组

golang中没有内置的元组类型,但是多值返回的处理结果模拟了元组的味道。因此,在golang中"元组”只是一个将多个值(可能是同类型的,也可能是不同类型的)绑定在一起的一种便利方法,通常,也...

python中必须掌握的20个核心函数——sorted()函数

sorted()是Python的内置函数,用于对可迭代对象进行排序,返回一个新的排序后的列表,不修改原始对象。一、sorted()的基本用法1.1方法签名sorted(iterable,*,ke...

12 个 Python 高级技巧,让你的代码瞬间清晰、高效

在日常的编程工作中,我们常常追求代码的精简、优雅和高效。你可能已经熟练掌握了列表推导式(listcomprehensions)、f-string和枚举(enumerate)等常用技巧,但有时仍会觉...

Python的10个进阶技巧:写出更快、更省内存、更优雅的代码

在Python的世界里,我们总是在追求效率和可读性的完美平衡。你不需要一个数百行的新框架来让你的代码变得优雅而快速。事实上,真正能带来巨大提升的,往往是那些看似微小、却拥有高杠杆作用的技巧。这些技巧能...