当前位置: 代码网 > 科技>人工智能>机器学习 > 【机器学习】集成学习投票法:投票回归器(VotingRegressor) & 投票分类器(VotingClassifier)

【机器学习】集成学习投票法:投票回归器(VotingRegressor) & 投票分类器(VotingClassifier)

2024年08月01日 机器学习 我要评论
本文介绍 VotingRegressor 和VoteClassifier的工作原理,并使用鸢尾花和糖尿病数据集作为示例,分别展示如何使用投票分类器解决分类/回归任务。

前言

投票回归器和投票分类器都属于集成学习。在【机器学习】集成学习基础概念介绍中有提到过,集成学习的结合策略包括: 平均法、投票法和学习法。sklearn.ensemble库中的voting classifiervoting regressor,它们分别实现了对回归任务和分类任务的预测模型投票机制。

本文主要分成两个部分:
vote regressor
- 原理介绍;
- 代码示例:使用糖尿病数据集展示投票回归预测并绘制结果。
voteclassifier
- 原理介绍:软、硬两种投票方法的逻辑和区别;
- 代码示例:使用鸢尾花数据集展示如何通过投票分类器提高整体模型的表现。


votingregressor

1. 原理介绍

投票回归器(votingregressor)聚合了多个基础模型的预测结果,最后的取所有模型预测值的平均值作为最后结果。

2. 详细代码示例

1)训练模型

我们将使用三个不同的回归器来预测数据:gradientboostingregressor, randomforestregressor, 和 linearregression)。然后,上述3个回归器将用于 votingregressor。


import matplotlib.pyplot as plt
from sklearn.datasets import load_diabetes
from sklearn.ensemble import gradientboostingregressor
from sklearn.ensemble import randomforestregressor
from sklearn.linear_model import linearregression
from sklearn.ensemble import votingregressor

x, y = load_diabetes(return_x_y=true)

# train classifiers
reg1 = gradientboostingregressor(random_state=1)
reg2 = randomforestregressor(random_state=1)
reg3 = linearregression()

reg1.fit(x, y)
reg2.fit(x, y)
reg3.fit(x, y)

ereg = votingregressor([('gb', reg1), ('rf', reg2), ('lr', reg3)])
ereg.fit(x, y)

2)预测并绘制结果

我们使用每个回归器对前20个进行预测,并绘制出结果图展示。

#making predictions
xt = x[:20]

pred1 = reg1.predict(xt)
pred2 = reg2.predict(xt)
pred3 = reg3.predict(xt)
pred4 = ereg.predict(xt)# train classifiers
reg1 = gradientboostingregressor(random_state=1)

#绘制结果
plt.figure()
plt.plot(pred1, 'gd', label='gradientboostingregressor')
plt.plot(pred2, 'b^', label='randomforestregressor')
plt.plot(pred3, 'ys', label='linearregression')
plt.plot(pred4, 'r*', ms=10, label='votingregressor')

plt.tick_params(axis='x', which='both', bottom=false, top=false,
                labelbottom=false)
plt.ylabel('predicted')
plt.xlabel('training samples')
plt.legend(loc="best")
plt.title('regressor predictions and their average')

plt.show()

在这里插入图片描述


voteclassifier

1. 原理介绍

votingclassifier背后的想法是组合概念上不同的机器学习分类器,并使用多数投票或平均预测概率(软投票)来预测类别标签。这样的分类器可以用于一组性能同样良好的模型,以平衡它们各自的弱点。

#定义投票分类器
model= votingclassifier(
     estimators=[('lr',lr), ('rf', rf), ('gnb', gnb)], #指定需要投票的学习器,这里lr\rf\gnb代表3中不同的模型。
     voting='soft', #选择投票方式,有soft和hard
     weights=[2,10,1])  #权重设置

#使用投票分类器训练模型
model.fit(x,y)

硬投票(majority/hard voting)

  • 多数投票法,也叫硬投票,根据少数服从多数的原则 (majority class labels),。
  • 若是有并列的最高票,则会按照升序排序顺序选择。举例如下:

软投票(soft voting):

  • 加权投票法,增加了权重weight参数, 使用加权平均概率(weighted average probabilities)
  • 该方法要求分类器支持predict_proba方法,即可以输出每个实例属于每一类的概率。
  • 如下图所示, 有三个分类器(classifier 1、classifier 2、classifier 3)和三个分类(class1,2,3) ,我们分别给3个分类器都设置相同的权重,即:w1=1, w2=1, w3=1。class2的平均概率是最高的(0.4>0.37>0.23),所以该实例最后的分类为class 2。
    在这里插入图片描述

2. 详细代码示例

1)导入包和数据准备

数据集使用的是鸢尾花数据集。

from sklearn import datasets
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import logisticregression
from sklearn.naive_bayes import gaussiannb
from sklearn.ensemble import randomforestclassifier
from sklearn.ensemble import votingclassifier
import pandas as pd
import numpy as np
import warnings 
warnings.filterwarnings("ignore")

#数据提取
iris = datasets.load_iris()
#设置x、y
x, y = iris.data[:, 1:3], iris.target

#格式转换,整合成表格 
iris_data = pd.dataframe(np.hstack((x, y.reshape(-1, 1))),index = range(x.shape[0]),columns=['petal_length_cm','petal_width_cm','class'] )

2)基础分类器建模

这里使用了逻辑回归、随机森林、朴素贝叶斯三个模型作为基础的分类器

#逻辑回归
lr = logisticregression(random_state=1)
lr.fit(x,y)
iris_data['lr']=lr.predict(x)

#随机森林
rf = randomforestclassifier(n_estimators=50, random_state=1)
rf.fit(x,y)
iris_data['rf']=rf.predict(x)

#朴素贝叶斯
gnb = gaussiannb()
gnb.fit(x,y)
iris_data['gnb']=gnb.predict(x)

3)votingclassifier

集成学习使用硬投票、软投票以及设定权重后的软投票法。

#硬投票
hard_vote = votingclassifier(
     estimators=[('lr',lr), ('rf', rf), ('gnb', gnb)],
     voting='hard')
hard_vote.fit(x,y)
iris_data['hard_vote']=hard_vote.predict(x)

# 软投票
soft_vote = votingclassifier(
     estimators=[('lr',lr), ('rf', rf), ('gnb', gnb)],
     voting='soft')
soft_vote.fit(x,y)
iris_data['soft_vote']=soft_vote.predict(x)

# 软投票自定义权重
soft_weight_vote = votingclassifier(
     estimators=[('lr',lr), ('rf', rf), ('gnb', gnb)],
     voting='soft',
     weights=[2,10,1])  #权重设置
soft_weight_vote.fit(x,y)
iris_data['soft_weight_vote']=soft_weight_vote.predict(x)

3)结果查看

查找结果不同的实例:

  • 通过对比rf、soft_vote和soft_weight_vote, 后者因为权重的设置增加了rf分类器的权重,所以soft_weight_vote 的结果和rf一致。
  • hard_vote是根据lr、rf、gnb中的多数结果。
#查看结果
#iris_data.tail(10)
#iris_data.head(10)
iris_data[iris_data['rf']!=iris_data['soft_vote']]

在这里插入图片描述
仅这个实例而言,通过计算accuracy 对比模型效果:

  • 三个基础模型的准确率差异较大;
  • 三个投票分类器的准确率都在0.95,表明集成算法的准确性最高、也更稳定。
#查看各个模型表现
for clf, label in zip([lr, rf, gnb, hard_vote,soft_vote,soft_weight_vote], 
                      ['logistic regression', 'random forest', 'naive bayes', 'ensemble(hard)','ensemble(soft_weight)']):
    scores = cross_val_score(clf, x, y, scoring='accuracy', cv=5)
    print("accuracy: %0.2f (+/- %0.2f) [%s]" % (scores.mean(), scores.std(), label))

在这里插入图片描述

(0)

相关文章:

版权声明:本文内容由互联网用户贡献,该文观点仅代表作者本人。本站仅提供信息存储服务,不拥有所有权,不承担相关法律责任。 如发现本站有涉嫌抄袭侵权/违法违规的内容, 请发送邮件至 2386932994@qq.com 举报,一经查实将立刻删除。

发表评论

验证码:
Copyright © 2017-2025  代码网 保留所有权利. 粤ICP备2024248653号
站长QQ:2386932994 | 联系邮箱:2386932994@qq.com