天天看点

集成学习投票法1. 集成学习概述2. 投票机制

1. 集成学习概述

集成学习(ensemble learning)它并不是一个独立的机器学习算法,而是通过构建并结合多个机器学习器完成学习任务,也就是我们常说的“博采众长”。集成学习可以用于分类问题集成、回归问题集成、特征选取集成、异常点检测集成等。

2. 投票机制

2.1 思路

投票机制(voting)是集成学习里面针对分类问题的一种结合策略,基本思想是融合多个数据来降低误差。

对于回归模型:投票法最终的预测结果是多个其他回归模型预测结果的平均值。

对于分类模型:硬投票法的预测结果是多个模型预测结果中出现次数最多的类别,软投票对各类预测结果的概率求和,最终选取概率之和的最大的类标签。

集成学习投票法1. 集成学习概述2. 投票机制

2.2 原理分析

投票法是通过多个模型的集成降低方差,从而提高模型的鲁棒性。

对于分类投票法,根据输出的两种类型:输出类标签和输出类概率,将前者称为硬投票(Majority/Hard voting),将后者称为软投票(Soft Voting)。简而言之,硬投票的预测结果就是所有投票结果中最多出现的类,软投票是预测结果就是所有投票结果中概率加和最大的类。

2.3 使用注意事项

在投票法中,我们需要考虑到不同的基模型可能产生的影响。理论上,基模型可以是任何已经被训练好的模型。但是在实际应用中,想要投票法产生较好的结果,需要满足两个条件:

  • 基模型之间的效果不能差别过大。当某个基模型相对于其他基型效果过差时,该模型很可能称为噪声。
  • 基模型之间应该有较小的[同质性]。例如在基模型预测效果近似的情况下,基于树模型与线性模型的投票,往往优于两个树模型或两个线性模型。(https://baike.baidu.com/item/%E5%90%8C%E8%B4%A8%E6%80%A7)

当投票合集中使用的模型能预测出清晰的类别标签时,适合用硬投票。当投票集合中使用的模型能预测类别的概率时,适合用软投票。软投票同样可以用于那些本身并不预测类成员概率的模型,只要他们可以输出类似于概率的预测分数值(例如支持向量机、k-最近邻和决策树)。

2.4 代码实例(基于sklearn)

2.4.1 基础结构介绍

#列表中每个模型采用Tuple结构表示,第一个元素代表名称,第二个元素代表模型
models = [('lr',LogisticRegression()),('svm',SVC())]
ensemble = VotingClassifier(estimators=models)

#定义Pipeline完成模型预处理
models = [('lr',LogisticRegression()),
('svm',make_pipeline(StandardScaler(),SVC()))]
#模型还提供voting参数让我们选择硬投票还是软投票
ensemble = VotingClassifier(estimators=models,voting='soft')


           

2.4.2 完整实例

#首先创建一个1000个样本,20个特征的随机数据集
# test分类数据集
from sklearn.datasets import make_classification
# 定义数据
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, n_redundant=5, random_state=2)
# 数据集的shape
print(X.shape, y.shape)

#用多个KNN模型作为基模型演示投票法,其中每个模型采用不同的邻居值k参数
def get_voting():
# 定义base模型
models = list()
models.append(('knn1', KNeighborsClassifier(n_neighbors=1))) models.append(('knn3', KNeighborsClassifier(n_neighbors=3))) models.append(('knn5', KNeighborsClassifier(n_neighbors=5))) models.append(('knn7', KNeighborsClassifier(n_neighbors=7))) models.append(('knn9', KNeighborsClassifier(n_neighbors=9))) 
# 定义投票机制
ensemble = VotingClassifier(estimators=models, voting='hard') return ensemble

#创建函数来评估投票带来的提升,包括KNN模型配置的每个独立版本和硬投票模型
def get_models():
    models = dict()
    models['knn1'] = KNeighborsClassifier(n_neighbors=1)
    models['knn3'] = KNeighborsClassifier(n_neighbors=3)
    models['knn5'] = KNeighborsClassifier(n_neighbors=5)
    models['knn7'] = KNeighborsClassifier(n_neighbors=7)
    models['knn9'] = KNeighborsClassifier(n_neighbors=9)
    models['hard_voting'] = get_voting()
    return models
#设计evaluate_model并以分层10倍交叉验证三次重复的分数列表的形式返回
def evaluate_model(model, X, y):
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1) scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1,
error_score='raise')
    return scores

#我们还可以创建箱形图和须状图来比较每个算法的精确分数分布
# 定义数据集
X, y = get_dataset()
# 评估
models = get_models()
#评估模型并且存储结果
for name, model in models.items():
scores = evaluate_model(model, X, y)
results.append(scores)
names.append(name)
print('>%s %.3f (%.3f)' % (name, mean(scores), std(scores)))
# 可视化结果
pyplot.boxplot(results, labels=names, showmeans=True) pyplot.show()
           

输出结果:(显然投票的效果略大于任何一个基模型)

>knn1 0.873 (0.030)
>knn3 0.889 (0.038)
>knn5 0.895 (0.031)
>knn7 0.899 (0.035)
>knn9 0.900 (0.033) >hard_voting 0.902 (0.034)
           
集成学习投票法1. 集成学习概述2. 投票机制

通过箱形图我们可以看到硬投票方法对交叉验证整体预测结果分布带来了很大的提升