集成学习之bagging
投票法
在学习bagging之前,需要先介绍下投票法,它是集成学习中常用的技巧,可以帮助我们提高模型的泛化能力,减少模型的错误率。
投票法的具体流程
(a)基本思想
投票法的基本思路在于,一般情况下错误总是局部产生,因此融合多个结果可以减小误差。
例如为了确保发送数据的准确性,一个常用的纠错方法是重复多次发送数据,并以少数服从多数的方法确定正确的传输数据。
故投票法是一种遵循少数服从多数原则的集成学习模型,通过多个模型的集成降低方差,从而提高模型的鲁棒性。在理想情况下,投票法的预测效果应当优于任何一个基模型的预测效果。
(b)具体操作
投票法在回归模型与分类模型上均可使用:
-
回归投票法:预测结果是所有模型预测结果的平均值。
-
分类投票法:预测结果是所有模型中出现最多的预测结果。
分类投票法又可以被划分为硬投票与软投票:
-
硬投票:预测结果是所有投票结果出现最多的类。
-
软投票:预测结果是所有投票结果中概率加和最大的类。
软投票法与硬投票法可以得出完全不同的结论,相对于硬投票,软投票法考虑到了预测概率这一额外的信息,因此可以得出比硬投票法更加准确的预测结果。
因此对于分类问题中,硬投票与软投票的选择,一般有以下几个准则:
-
当投票集合中使用的模型能预测出清晰的类别标签时,适合使用硬投票。
-
当投票集合中使用的模型能预测类别的概率时,适合使用软投票。
-
软投票同样可以用于那些本身并不预测类成员概率的模型,只要他们可以输出类似于概率的预测分数值(例如支持向量机、最近邻和决策树)。
投票法的适用情形
在投票法中,我们还需要考虑到不同的基模型可能产生的影响。理论上,基模型可以是任何已被训练好的模型。但在实际应用上,想要投票法产生较好的结果,需要满足两个条件:
-
基模型之间的效果不能差别过大:当某个基模型相对于其他基模型效果过差时,该模型很可能成为噪声。
-
基模型之间的同质性应该不太大:例如在基模型预测效果近似的情况下,基于树模型与线性模型的投票,往往优于两个树模型或两个线性模型。
投票法的局限性在于,它对所有模型的处理是一样的,这意味着所有模型对预测的贡献是一样的。如果一些模型在某些情况下很好,而在其他情况下很差,这是使用投票法时需要考虑到的一个问题。
投票法的代码实现
Sklearn
中提供了 VotingRegressor
与 VotingClassifier
两个投票方法。
这两种模型的操作方式比较类似共同参数有:
-
estimators:以列表的形式输入基模型信息,列表中每个元组为(模型名称,模型类),需要保证每个模型必须拥有唯一的名称,在模型类中可以用Pipeline完成模型预处理。
-
weights:以数组的形式输入自定义的权重(默认为
None
) -
n_jobs:并行处理数(默认为
None
代表1,-1为使用所有线程) -
verbose:是否打印进度信息(默认为
False
)
VotingClassifier
独有的参数为:
-
voting:分类投票方式,可选
'hard'
或'soft'
,默认为'hard'
-
flatten_transform:是否进行 flatten 变换(仅在软投票时使用),默认为
True
下面开始演示投票法的使用,首先定义创建数据集的函数 get_dataset
,其使用 make_classification
创建一个含 1000 1000 1000 个样本, 20 20 20 个特征的随机数据集:
# 导入需要的第三方库
from sklearn.datasets import make_classification
from sklearn.ensemble import VotingClassifier
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.model_selection import cross_val_score
from sklearn.neighbors import KNeighborsClassifier
import matplotlib.pyplot as plt
def get_dataset():
"""创建随机数据集"""
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5