集成学习入门之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要好的

最新文章

  1. C语言编写的简单的电话本管理系统
  2. 微软 .net 你更新这么快IDE vs2015 、语法糖 6.0、framework、‘吹得这么牛,然并用
  3. Visio控件关闭“形状”面板
  4. 并行计算之OpenMP入门简介
  5. 关于yum与源码安装的LAMP或LNMP网页直接显示空白页的问题?
  6. DAVINCI DM6446 开发攻略——V4L2视频驱动和应用分析
  7. java 应用程序的编译和运行
  8. sql循环查询树形结构
  9. jQuery事件--blur()和focus()
  10. HTML中元素的position属性详解
  11. rest-framework之响应器(渲染器)
  12. Overview of MySQL Programs
  13. 前端PHP入门-002-安装WAMP的集成环境md
  14. Windows command line monitor
  15. phpwind主要表结构的研究随笔[1]
  16. grep的若干用法
  17. 终极解决傻X阿里钱盾新手开店及老卖家复核身份证照片模糊无法对焦问题
  18. git隐藏文件复制
  19. 利用nginx搭建tomcat集群
  20. GET和POST 编码和乱码

热门文章

  1. Cent OS下安装JDK11
  2. Mybatis逆向工程生成类文件
  3. spring cloud服务器启动之后立刻通过zuul访问其中的实例报zuul连接超时的问题
  4. Message /index.jsp (line: [17], column: [45]) The JSP specification requires that an attribute name is preceded by whitespace
  5. Linux | Shell脚本的编写
  6. excle名字后面直接跟别的出来
  7. Ajax爬取动态数据和HTTPS自动默认证书
  8. vite插件-自动生成vue组件文档
  9. modelsim 独立仿真vivado的IP核及仿真脚本
  10. 电子物流中的EDI 应用