欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

集成学习之多数投票预测

程序员文章站 2024-02-02 12:46:04
...

一、集成学习

集成方法(ensemble method)是指,通过将不同的分类器组合成为一个元分类器,元分类器与包含的单个分类器相比,元分类器具有更好的泛化性能。常用的集成方法有多数投票(majority voting)原则,多数投票原则是指将大多数分类器预测的结果作为最终的预测类标,也就是说,将得票数超过50%的结果作为类标。严格的说,多数投票仅用于二分类的情况。但是,我们也可以将多数投票原则推广到多分类,被称为简单多数投票法(plurality voting)。
通过训练集,我们可以训练出m个不同的成员分类器。不同的成员分类器,可以使用不同的分类算法,如决策树、logistic回归、支持向量机等。除此之外,我们也还可以使用相同的分类算法,来拟合不同的训练子集来构建不同的成员分类器。随机森林算法,就是使用这种方式来组合不同的决策树分类器。下面用一张图来描述一些多数投票的过程:
集成学习之多数投票预测

二、为什么多数投票的结果会优于单个分类器的预测结果?

在一个二分类的问题中,假设每个分类器都具有相同的出错率(预测错误)ε ,整个系统一共由n个成员分类器所组成,且每个分类器之间是相互独立的,不同分类器之间的出错率互不相关。如果,集成学习预测模型要出错的话,需要一半以上的成员分类器预测错误,我们通过二项分布来计算系统出错的概率
集成学习之多数投票预测
例如:如果成员分类器出错率ε为0.25,一共有11个成员分类器,那么k就需要大于5时系统才会预测错误,集成系统的出错率就为
集成学习之多数投票预测
通过上面的计算结果可以发现,0.25>0.034,所以集成系统要优于单个的成员分类器。那么是所有的集成系统的性能都要优于单个的成员分类器吗?显然不是,下面我们通过python来寻找,当ε满足什么条件的时候,集成系统的性能要优于当个的成员分类器。
import numpy as np
from scipy.misc import comb
import math
import matplotlib.pyplot as plt

'''
获取集成系统出错的概率
'''
def ensemble_error(classfier_num,error):
    #计算k值
    k = math.ceil(classfier_num / 2.0)
    #获取集成系统出错的概率
    probs = [comb(classfier_num,k)*error**k*(1-error)**(classfier_num-k)
             for k in range(k,classfier_num+1)]
    return sum(probs)


if __name__ == "__main__":
    #定义错误率取值的范围
    error_range = np.arange(0,1.01,0.01)
    #当成员分类器的出错率不同时,计算集成系统的出错概率
    ensem_errors = [ensemble_error(11,error=error) for error in error_range]
    plt.plot(error_range,error_range,label="成员分类器出错率",linewidth=2,linestyle="--")
    plt.plot(error_range,ensem_errors,label="集成系统出错率",linewidth=2)
    plt.legend(loc="upper left")
    plt.grid()
    plt.show()
集成学习之多数投票预测

通过成员分类器的出错率和成员系统的出错率可以发现,ε<0.5的时候,也就是成员分类器的性能要优于随机猜想的时候,集成系统的性能要优于单个的分类器。