The goal behind ensemble methods is to combine different classifiers into a meta-classifier that has a better generalization performance than each individual classifier alone.
majority voting:二分类问题
plurality voting:多分类问题的多数表决机制
我们以二项分布(binomial distribution)来演示为什么集成的方法会比单个分类器的性能要好,假设我们有 n 个基本分类器(base classifier)用于二分类问题(binary classification),每个分类器的错误率均为 ϵ 。我们进一步假设,分类器之间彼此独立,错误率之间不相关。在这样的假设下,集成方法的分类错误率为(以二项分布的概率质量函数,probability mass function,pmf):
11个基本分类器(base classifier, n=11 ),每一个的错误率为0.25 ( ϵ=0.25 ):
import scipy.stats ss
n, p = 11, .25
rv = ss.binom(n, p)
err_rate = 1-rv.cdf(5)
print(err_rate)
# 0.034327507019
接着我们画出集成方法的分类错误随每基本分类器的分类错误的变化情况:
def ensemble_err(n_classifier, err_rate):
rv = st.binom(n_classifier, err_rate)
return (1-rv.cdf(n_classifier//2))
def main():
err_range = np.linspace(0, 1, 101)
ensemble_errs = [ensemble_err(11, i) for i in err_range]
plt.plot(err_range, ensemble_errs, lw=2, label='Ensemble err')
plt.plot(err_range, err_range, '--', lw=2)
plt.legend(loc='best', frameon=False)
plt.show()
其中 wj 表示每一个分类器的权重, χA 表示 characteristic function [Cj(x)=i∈A] , A 类别标签的集合(np.unique(y))。我们以三个基本分类器构成的集成分类器为例,每一个分类器的预测结果为 [0,0,1] ,又知它们各自的权重分别为 [0.2,0.2,0.6] ,则:
>>> w = [.2, .2, .6]
>>> np.argmax(np.bincount([0, 0, 1], w))
1
# 如此匹配
又在 sklearn 中,一些分类器不仅给出预测的类别,还会给出预测为该类别的概率通过 predict_proba 方法,这种情况下,集成方法的判断函数又变为:
>>> w = np.array([.2, .2, .6])
>>> P = np.array([[0.9, 0.1], [0.8, 0.2], [0.4, 0.6]])
>>> w.dot(P)
[ 0.58 0.42]
>>> np.argmax(w.dot(P))
0