投票

投票是最简单最基本的集成方式,核心思想也很朴素:大家伙投票决定结果.

其原理是结合了多个不同的机器学习分类器,并且采用多数表决(硬投票)或者平均预测概率(软投票)的方式来预测分类标签.这样的分类器可以用于一组同样表现良好的模型,以便平衡它们各自的弱点.

使用sklearn做投票

sklearn提供了用于投票的接口sklearn.ensemble.VotingClassifier.下面的例子可以大体了解如何使用投票接口


In [1]:
import numpy as np
from sklearn.linear_model import LogisticRegression
from sklearn.naive_bayes import GaussianNB
from sklearn.ensemble import RandomForestClassifier, VotingClassifier

自己构造一组随机的数据


In [2]:
X = np.array([[-1, -1], [-2, -1], [-3, -2], [1, 1], [2, 1], [3, 2]])
y = np.array([1, 1, 1, 2, 2, 2])

初始化多个分类器模型


In [3]:
clf1 = LogisticRegression(random_state=1)
clf2 = RandomForestClassifier(random_state=1)
clf3 = GaussianNB()

初始化投票器


In [4]:
eclf1 = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)], voting='hard')

训练模型


In [5]:
eclf1 = eclf1.fit(X, y)

预测


In [6]:
print(eclf1.predict(X))


[1 1 1 2 2 2]

投票器的设置

投票器可以设置

  • voting

    hard表示直接以多数原则投票确定结果,soft表示基于预测概率之和的argmax来预测类别标签

  • n_jobs

    并行任务数设置

  • weights

    不同分类器的权重

  • flatten_transform(0.19版本接口)

    仅当voting为'soft'时有用.flatten_transform = true时影响变换输出的形状,变换方法返回形为(n_samples,n_classifiers * n_classes).如果flatten_transform = false,则返回(n_classifiers,n_samples,n_classes)


In [7]:
eclf3 = VotingClassifier(estimators=[('lr', clf1), ('rf', clf2), ('gnb', clf3)],n_jobs=3, voting='soft', weights=[2,1,1])

In [8]:
eclf3 = eclf3.fit(X, y)

In [9]:
print(eclf3.predict(X))


[1 1 1 2 2 2]

In [10]:
print(eclf3.transform(X).shape)


(3, 6, 2)