【笔记】集成学习入门之soft voting classifier和hard voting classifier

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

posted @ 2021-01-29 23:56  DbWong_0918  阅读(1318)  评论(0编辑  收藏  举报