机器学习-机器学习之集成学习(ensemble learning)

前面我们说了很多算法模型,当然有的时候我们为了让模型能有更好的泛化效果,我们会采用模型融合的方式来进行对模型的融合。先来讲讲基础:
什么是集成学习?集成学习就是通过多个个体学习器集合起来通过某种策略来达到一个更好的结果。(例如随机森林)什么是个体学习器(我也喜欢叫他基类学习器)?就是一个个体。比如说随机森林里的一颗树叫个体学习器。
集成学习的分类:Voting,Stacking,Bagging。

Voting

voting是一个很常见的策略,就是投票少数服从多数。不仅仅是在今天讲的集成学习里面存在着voting这种策略,其实在大数据领域里面也存在着这样的策略。这个很简单啊,简单解释一下就是(在以前班长选举的时候很多的时候都是两个候选人,然后班主任老师让我们剩下的人来投票,你支持A或者B,然后去统计各个候选人的得票数为多少,然后少数服从多数)。就个就是voting的策略。

同理,我们在机器学习里面也可以使用这样的策略,例如有三个个体学习器,我们对五个数据进行预测。
在这里插入图片描述

对于ABC三个个体学习器来讲他们的预测准确率是:80%,60%,60%。

然后我们对ABC三个个体学习器来进行voting操作那么他们得到的预测结果为:
在这里插入图片描述

这就是对ABC三个进行voting后的结果,预测结果为100%。(当然我这里100%只是为了证明voting的可行性,大家应该能理解吧。)这不是就是印证了那句老话:三个臭皮匠赛过诸葛亮吗?当然对于80%的个体学习器也不算是臭皮匠,hhhhh。

OK,原理我们都懂了 我们上代码看看实际效果。

from sklearn import datasets
from sklearn import model_selection
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import VotingClassifier
import warnings
warnings.filterwarnings("ignore")# 载入数据集
iris = datasets.load_iris()
x_data, y_data = iris.data, iris.target
knn = KNeighborsClassifier(n_neighbors=1)
dt = DecisionTreeClassifier()
lr = LogisticRegression()
sclf = VotingClassifier([('knn', knn), ('dtree', dt), ('lr', lr)])
for clf, label in zip([knn, dt, lr, sclf],
                      ['KNN', 'Decision Tree', 'LogisticRegression', 'VotingClassifier']):
    scores = model_selection.cross_val_score(clf, x_data, y_data, cv=5, scoring='accuracy')
    print("Accuracy: %0.2f [%s]" % (scores.mean(), label))

最后得到的结果是

[KNN]	[Decision Tree]	[LogisticRegression]	[VotingClassifier]
0.96
0.97
0.97
0.97

其实这不是我想要的结果:

其实我们想一想就单独这三个模型其实不是"臭皮匠"而是"诸葛亮",三个诸葛亮其实他们的结果应该是差不多的。所以对于效果好的个体学习器来讲,投票得到的提升并不是很大。因为他们个体的泛化能力就很好了。

总结一下:对于voting来讲适合于分类任务。比如回归任务就不太好处理了,回归任务最好是用Average。Average(对不同模型得出的结果取平均或加权平均)比如:三个个体学习器对于五支股票价格的预测:
在这里插入图片描述

这就完成了一个简单的结果取值平均,而加权平均呢?就是给与每个个体学习器不同的权重。比如A 4/9 B 2/9 C 3/9 。这样的权重。

Stacking

对于Stacking而言,我自己对stacking的认知是:Stacking的策略是把训练样本集分为两部分,一部分用来训练初级学习器,通过初级分类器预测的结果和另外一部分样本一起用来训练次级学习器。由此得到最终的的预测结果。还是来个例子比较好:

还是用莺尾花数据来讲:我们先定义两个初级学习器

knn = KNeighborsClassifier(n_neighbors=1)
dt = DecisionTreeClassifier()
然后去定义一个次级分类器(一般用lr)做回归和一个StackingClassifier
lr = LogisticRegression()
sclf = StackingClassifier(classifiers=[clf1, clf2],  meta_classifier=lr)
      然后开始测试:
 for clf, label in zip([clf1, clf2, sclf],['KNN', 'Decision Tree', 'StackingClassifier']):
     scores = model_selection.cross_val_score(clf, x_data, y_data, cv=3, scoring='accuracy')
     print("Accuracy: %0.2f [%s]" % (scores.mean(), label))
   最后得到结果:

在这里插入图片描述

​    ​    ​  

​ ​ ​ ​ ​ ​ ​ ​Bagging

bagging全称bootstrap aggregating。这种方法,把个体预测器当做黑盒子处理,不进行进一步修改,所以,它的个体预测器可以是任何机器学习算法。它对训练数据集进行随机取样,并使用取样后的数据子集,训练每一个个体预测器。在预测时,每一个预测器都会做出预测,整体结果则是每个预测的平均。(例如随机森林做回归任务)

from sklearn import datasets
from sklearn.ensemble import BaggingClassifier
from sklearn import tree
from sklearn.model_selection import train_test_split
​
iris = datasets.load_iris()
x_data = iris.data[:,:2]
y_data = iris.target
x_train,x_test,y_train,y_test = train_test_split(x_data, y_data,train_size=0.75,random_state=1)
dtree = tree.DecisionTreeClassifier()
dtree.fit(x_train, y_train)
print(dtree.score(x_test,y_test))
bagging_tree = BaggingClassifier(dtree, n_estimators=800)#使用bagging算法训练100组决策树分类器
# 输入数据建立模型
bagging_tree.fit(x_train, y_train)
print(bagging_tree.score(x_test,y_test))

​最后得到结果:

0.631578947368421
0.6842105263157895

**

AdaBoost

**

AdaBoost:会因为一个基本分类器被错误分类的样本的权值会增大,而正确分类的样本的权值会减小,并再次用来训练下一个基本分类器。同时,在每一轮迭代中,加入一个新的弱分类器,直到达到某个预定的足够小的错误率或达到预先指定的最大迭代次数才确定最终的强分类器。简单来说,给你随机出题,你做对了的题会降低出现的权重,而你做错的题会增加出现的​权重。然后你每次都考试的时候,给你上次做错的题就会多(因为权重大),直到考到95分为止​。(对照下上文)

​代码:

from sklearn import datasets
​
x, y =datasets.make_moons(n_samples=500, noise=0.3, random_state=666)
from sklearn.model_selection import train_test_split
# 这里由于不在采用随机抽样,因此需要分割数据集
x_train, x_test, y_train, y_test = train_test_split(x, y, train_size=0.75,random_state=88)
from sklearn.ensemble import AdaBoostClassifier
from sklearn.tree import DecisionTreeClassifier
# 这里根据决策树的调参方式进行调参。


tree = DecisionTreeClassifier()
tree.fit(x_train,y_train)
print(tree.score(x_test,y_test))
ada_clf = AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=2),
                            n_estimators=500)
ada_clf.fit(x_train, y_train)
print(ada_clf.score(x_test, y_test))

​得到的结果是:

0.832
0.88

好了基本上集成学习就差不多了,但是在最后说一句​(集成学习不一定能使你的模型的泛化能力马上提高)。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值