集成学习(中)——投票法和bagging及代码实现

投票法

讲bagging前就应该先谈到投票法,投票法是一种遵循少数服从多数原则的集成学习模型,通过多个模型的集成降低方差,从而提高模型的鲁棒性。举个例子,在预测泰坦尼克号的生死问题上,综合了logistics、Knn和决策树三个模型的预测结果,再决定出label的叫做投票。那么怎么综合这三个模型的预测结果便是关键问题了,第一种,直接使用预测的结果,如果三个模型中,一个预测死,两个预测生,那么便是生,这就是投票法的硬投票,第二种,使用模型预测的概率,可以做平均,也可以出现第四个模型讲三个模型的概率作为输入,再进行预测,这就是软投票。
投票的原理非常直观,但是效果好不好取决于你集成了哪些模型,如果本身的单个模型效果就不好,那么就会影响你整个大模型的准确率。

投票法代码实现

from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.ensemble import VotingClassifier
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import make_pipeline
from sklearn.neighbors import KNeighborsClassifier  
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
import numpy as np
import matplotlib.pyplot as plt

#借助Pipeline完成模型预处理工作
models = [('lr',LogisticRegression()),('svm',make_pipeline(StandardScaler(),SVC()))]
ensemble = VotingClassifier(estimators=models,voting='sqft')

#使用sklearn自己生成数据做样式
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)
print(X.shape, y.shape)
# 构建大模型
def get_voting():
	# 定义模型
	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
#建立详细模型
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
#接收一个模型实例,并且分层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
#打印每个算法的平均性能,
#创建一个箱形图和须状图来比较每个算法的精度分数分布。
models = get_models()
results, names = list(), list()
for name, model in models.items():
	scores = evaluate_model(model, X, y)
	results.append(scores)
	names.append(name)
	print('>%s %.3f (%.3f)' % (name, np.mean(scores), np.std(scores)))
plt.boxplot(results, labels=names, showmeans=True)
plt.show()

bagging

与投票法不同的是,Bagging不仅仅集成模型最后的预测结果,同时采用一定策略来影响基模型训练,保证基模型可以服从一定的假设。希望各个模型之间具有较大的差异性,而在实际操作中的模型却往往是同质的,因此一个简单的思路是通过不同的采样增加模型的差异性。
Bagging的核心在于自助采样(bootstrap)这一概念,即有放回的从数据集中进行采样,也就是说,同样的一个样本可能被多次进行采样。统计学上的重采样。
Bagging的基本流程:首先我们随机取出一个样本放入采样集合中,再把这个样本放回初始数据集,重复N次采样,最终我们可以获得一个大小为N的样本集合。同样的方法, 我们可以采样出X个含N个样本的采样集合,然后基于每个采样集合训练出一个基学习器,再将这些基学习器进行结合。其中我们可以引出一个重要概念OOB,中文名字叫做袋外误差,这个也是我们衡量学习器好坏的重要标准。假设集合里面的元素记为 x i x_{i} xi,那么在一次的抽取中, N 1 N_{1} N1不被抽到的概率为 ( 1 − 1 / X ) (1-1/X) (11/X),因为样本之间是相互独立的,所以在抽取N次后, N 1 N_{1} N1不被抽到的概率则为 ( 1 − 1 / X ) X (1-1/X)^{X} (11/X)X,那么在抽取次数足够大的情况下我们对X取个极限,可以得到 e − 1 e^{-1} e1,也就是说将会有约 1 / 3 1/3 1/3的样本没有被抽到,这 1 / 3 1/3 1/3的样本误差,我们便称为袋外误差。

bagging代码实现

from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.ensemble import BaggingClassifier
#生成模拟数据
X, y = make_classification(n_samples=1000,
                           n_features=20, 
                           n_informative=15,
                           n_redundant=5, 
                           random_state=5)
model = BaggingClassifier()
cv = RepeatedStratifiedKFold(n_splits=10,
                             n_repeats=3,
                             random_state=1)
#10折交叉验证,并重复三次数据,参数n_jobs=-1是使用所有内核
n_scores = cross_val_score(model, X, y, 
                           scoring='accuracy',
                           cv=cv, n_jobs=-1, 
                           error_score='raise')
print('Accuracy: %.3f (%.3f)' % (mean(n_scores), std(n_scores)))
  • 1
    点赞
  • 22
    收藏
    觉得还不错? 一键收藏
  • 2
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值