集成学习入门之soft voting classifier和hard voting classifier

集成学习

通过构建并结合多个学习器来完成学习任务,一般是先产生一组“个体学习器”,再用某种策略将它们结合起来,有很多种形式,像是投票,概率比较等等,像是投票就是少数服从多数

生活中经常遇到这种思路,比如看一下一个东西的好坏,可能会问多个人或者查找多个评价,如果多数觉得不错,那可能你也会认为不错,即便是没有使用过

又好像一个数据的预测结果不确定的时候,就可以使用很多个算法来一起跑一遍,然后选取数据相同的比较多的那个结果作为预测结果

在sklearn中有voting classifier这种投票方式的集成学习分类器

具体实现

(在notebook中)

加载好要用的类库,然后使用make_moons创建一个虚拟测试数据集,设置500个样本点,噪音(标准差)0.3,随机种子为42,然后绘制出数据情况

import numpy as np
import matplotlib.pyplot as plt
from sklearn import datasets
X,y = datasets.make_moons(n_samples=500,noise=0.3,random_state=42)
plt.scatter(X[y==0,0],X[y==0,1])
plt.scatter(X[y==1,0],X[y==1,1])

图像如下

进行数据的分割

from sklearn.model_selection import train_test_split

X_train,X_test,y_train,y_test = train_test_split(X,y,random_state=666)

首先使用逻辑回归的训练方式,在训练完以后进行分类准确度的求解

from sklearn.linear_model import LogisticRegression

log_clf = LogisticRegression()
log_clf.fit(X_train,y_train)
log_clf.score(X_test,y_test)

结果如下

使用SVM的训练方式,在训练完以后进行分类准确度的求解

from sklearn.svm import SVC

svm_clf = SVC()
svm_clf.fit(X_train,y_train)
svm_clf.score(X_test,y_test)

结果如下

使用决策树的训练方式,在训练完以后进行分类准确度的求解

from sklearn.tree import DecisionTreeClassifier

dt_clf = DecisionTreeClassifier()
dt_clf.fit(X_train,y_train)
dt_clf.score(X_test,y_test)

结果如下

将三种算法预测出的结果都进行保存,三种结果相加以后得到一个向量,如果结果大于等于2,这就代表了至少有两个模型,至多有三个模型认为这个结果等于1,此时就认为结果为1,反之为0,再将其转换成整形向量,这就是少数服从多数的情况,然后看一下综合三个算法少数服从多数的结果的前十项是什么样的

y_predict1 = log_clf.predict(X_test)
y_predict2 = svm_clf.predict(X_test)
y_predict3 = dt_clf.predict(X_test)
y_predict = np.array((y_predict1 + y_predict2 + y_predict3)>=2,dtype='int')
y_predict[:10]

结果如下

然后计算一下这个综合的结果的准确度

from sklearn.metrics import accuracy_score

accuracy_score(y_test,y_predict)

结果如下(正常应该是比前三个高,这里是随机种子设置的不好,可以进行修改以实现真正要表达的情况)

在sklearn中可以直接使用VotingClassifier这个类来实现集成学习的操作,传入参数estimators,其就是一个估计器列表,过程和管道很像,将三个模型都传入其中并进行实例化,使voting等于hard,然后对训练数据集进行训练,并求解准确度

from sklearn.ensemble import VotingClassifier

voting_clf = VotingClassifier(estimators=[
('log_clf',LogisticRegression()),
('svm_clf',SVC()),
('dt_clf',DecisionTreeClassifier())],voting='hard') voting_clf.fit(X_train,y_train)
voting_clf.score(X_test,y_test)

结果如下

结果和前面手动模拟的结果是一样的,使用算法的时候是可以直接调参将算法调节到最好的情况

上面使用的是hard voting classifier,那么有hard voting classifier就相应的还存在Soft Voting Classifier

Soft Voting Classifier

hard voting classifie就是少数服从多数的方式,在很多情况下少数服从多数并不是合理的,比如民主暴政(完全民主的结果就是多数人对于少数人的暴政)的情况,这种得出的结果很多时候是不合理的,那么更合理的投票方式应该带有权值属性,即对于不同的投票人,分值权重不一样,有的高一些,有的低一些,比如投票通过一个经济决定,普通民众,女权带师和经济学出身的专家如果投票的比重是一样的话,那很明显,这个结果可能不会是好的结果

因此对于数据的权重占比,在投票中设置好这个权值是很重要的,在soft voting classifier中,就将每个模型的相应的分类的概率作为权值,计算就需要将每个模型对应的类别的概率取平均值,然后对比不同的类别的结果,最后得出最终结果,也就是说在soft voting classifier中,不仅要看有多少票,还要看对应的类别由多少的概率确认分给这个类别

这就可以发现,在这种方法下,要求集合中的每一个模型都可以估计概率,不然没法算,只要函数predict_proba参数的算法就是可以计算概率的,像是逻辑回归算法,KNN算法,SVM算法和决策树算法都是可以计算概率的

具体使用实现

(在notebook中)

熟悉的布置环境和上面一模一样,绘制出来的图像如下

在对数据集进行分割以后(设置随机种子为10),在sklearn中可以直接使用VotingClassifier这个类来实现集成学习的操作,不过这里是hard voting classifier,代码和上面一模一样,可以得出结果,结果如下

对于soft voting classifier来说,和hard voting classifier是一样的,只不过将voting改为soft,然后将三个模型传入其中,实例化SVC的时候传入参数probability以实现概率计算,实例化DecisionTreeClassifier的时候传入随机种子666,然后训练分类器,之后计算准确度

voting_clf2 = VotingClassifier(estimators=[
('log_clf',LogisticRegression()),
('svm_clf',SVC(probability=True)),
('dt_clf',DecisionTreeClassifier(random_state=666))
],voting='soft') voting_clf2.fit(X_train,y_train)
voting_clf2.score(X_test,y_test)

结果如下

可以发现这个准确度是比hard voting classifier的准确的要高的,这就是soft voting classifier的调用方式,使用起来很容易,而且很多时候效果是比hard voting classifier要好的

【笔记】集成学习入门之soft voting classifier和hard voting classifier的更多相关文章

  1. Python机器学习笔记 集成学习总结

    集成学习(Ensemble  learning)是使用一系列学习器进行学习,并使用某种规则把各个学习结果进行整合,从而获得比单个学习器显著优越的泛化性能.它不是一种单独的机器学习算法啊,而更像是一种优 ...

  2. 笔记︱集成学习Ensemble Learning与树模型、Bagging 和 Boosting

    本杂记摘录自文章<开发 | 为什么说集成学习模型是金融风控新的杀手锏?> 基本内容与分类见上述思维导图. . . 一.机器学习元算法 随机森林:决策树+bagging=随机森林 梯度提升树 ...

  3. Nacos集成学习入门

    微服务注册中心nacos学习:先尝试使用它,然后撸它源码搞懂它. 在这里整理一下自己之前集成nacos的内容. 我的github地址:https://github.com/mrxiaobai-wen/ ...

  4. 集成学习-Majority Voting

    认识 集成学习(Ensemble Methods), 首先是一种思想, 而非某种模型, 是一种 "群体决策" 的思想, 即对某一特定问题, 用多个模型来进行训练. 像常见的单个模型 ...

  5. 每天成长一点---WEB前端学习入门笔记

    WEB前端学习入门笔记 从今天开始,本人就要学习WEB前端了. 经过老师的建议,说到他每天都会记录下来新的知识点,每天都是在围绕着这些问题来度过,很有必要每天抽出半个小时来写一个知识总结,及时对一天工 ...

  6. Hadoop学习笔记(1) ——菜鸟入门

    Hadoop学习笔记(1) ——菜鸟入门 Hadoop是什么?先问一下百度吧: [百度百科]一个分布式系统基础架构,由Apache基金会所开发.用户可以在不了解分布式底层细节的情况下,开发分布式程序. ...

  7. ORMLite学习入门笔记

    ORMLite学习入门笔记 使用原始的SQLiteHelper来操作维护数据库有点过于繁琐,重复工作量较大.所以会想到使用一个比较方便的ORM来维护我们本地的数据库,各位业界前辈都给我推荐了ORMLi ...

  8. iOS学习笔记-地图MapKit入门

    代码地址如下:http://www.demodashi.com/demo/11682.html 这篇文章还是翻译自raywenderlich,用Objective-C改写了代码.没有逐字翻译,如有错漏 ...

  9. 机器学习笔记(九)---- 集成学习(ensemble learning)【华为云技术分享】

    集成学习不是一种具体的算法,而是在机器学习中为了提升预测精度而采取的一种或多种策略.其原理是通过构建多个弱监督模型并使用一定策略得到一个更好更全面的强监督模型.集成学习简单的示例图如下: 通过训练得到 ...

随机推荐

  1. AOP面向切面的实现

    AOP(Aspect Orient Programming),我们一般称为面向方面(切面)编程,作为面向对象的一种补充,用于处理系统中分布于各个模块的横切关注点,比如事务管理.日志.缓存等等. AOP ...

  2. nginx 基本配置

    server { listen 80; server_name 域名; #access_log /var/log/nginx/admin.log; index index.html index.htm ...

  3. JavaWeb中Servlet和Jsp跳转路径的写法

    最近学习时,常常要写一些页面之间的跳转或者前台和后端之间的跳转 下面总结一下自己对于这些跳转路径的写法 声明:以下讲到的jsp文件都默认在WebRoot目录下 1.表单(Jsp)->Servle ...

  4. DIY一个智能开关kwswitch

    源码地址:https://gitee.com/kerwincui/kwswitch 平台简介 该智能开关平台包括服务端.硬件端.PC端和安卓端.硬件使用ESP8266模块,成本相对较低,可以发挥想象力 ...

  5. Spring Cloud中的注解

    一.Eureka @EnableEurekaServer: @EnableDiscoverClient:标注服务是一个Eureka的客户端 @LoadBalanced:自动构造LoadBalancer ...

  6. Redisson 分布式锁源码 11:Semaphore 和 CountDownLatch

    前言 Redisson 除了提供了分布式锁之外,还额外提供了同步组件,Semaphore 和 CountDownLatch. Semaphore 意思就是在分布式场景下,只有 3 个凭证,也就意味着同 ...

  7. File类与常用IO流第十一章——打印流

    第十一章.打印流 概述:java.io.PrintStream extends OutputStream,为其他输出流添加了功能,使题目能够方便的打印各种数据值表示形式. 特点: 只负责数据的输出,不 ...

  8. sql-3-DML_DQL

    DML-操作数据 1.insert语句 --增加一行数据 insert into 表名([字段1,字段2,字段3,...])values('值1','值2','值3',...); insert int ...

  9. 基于Gin+Gorm框架搭建MVC模式的Go语言后端系统

    文/朱季谦 环境准备:安装Gin与Gorm 本文搭建准备环境:Gin+Gorm+MySql. Gin是Go语言的一套WEB框架,在学习一种陌生语言的陌生框架,最好的方式,就是用我们熟悉的思维去学.作为 ...

  10. 第四篇 -- CSS基础

    表单.单选.下拉框.文本域.多选框.提交.重置.按钮 <!DOCTYPE html> <html lang="en"> <head> <m ...