zoukankan      html  css  js  c++  java
  • 【笔记】集成学习入门之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要好的

    感谢观看,文笔有限,博客不出彩,还请多多见谅
  • 相关阅读:
    地区表设计(包括数据插入) Dear
    本博客的内容
    linux msn
    相关的一些技术
    相关的一些产品
    考第一名的学生的发言
    AIX&LINUX操作系统调优
    shell for循环
    自动化测试
    DB2数据库日志
  • 原文地址:https://www.cnblogs.com/jokingremarks/p/14347703.html
Copyright © 2011-2022 走看看