0
点赞
收藏
分享

微信扫一扫

机器学习实战—集成学习

夏沐沐 2022-11-06 阅读 176

文章目录

一.简介

1.1 集成学习

一群人的智慧总是比一个人强,这就是集成学习的核心思想。如果你聚合一组预测器(比如分类器或回归器)的预测,得到的预测结果也比最好的单个预测器要好。这样的一组预测器称为集成,这种技术也叫集成学习。

1.2 随机森林

我们训练一组决策树分类器,每一棵树都基于训练集不同的随机子集进行训练。做出预测时,只需要获得所有树各自的预测,然后得票最多的类别作为预测结果。这样一组决策树的集成被称为随机森林,随机森林是迄今可用的最强大的机器学习算法之一。

二.集成学习—投票分类器

2.1 概念

如果我们已经训练好了一些分类器,并且每个分类器的准确率都比较客观,为了创建一个更好的分类器,最简单的方法就是聚合每个分类器的预测,然后将的票最多的结果作为预测类别。这种大多数投票分类器称为硬投票分类器。事实上,即使每个分类器都是弱学习器(意味着它的的预测效果只比随机预测好一点),通过集成依然可以实现一个强学习器

2.2 代码实现

from sklearn.ensemble  import RandomForestClassifier  #随机森林分类器
from sklearn.ensemble  import VotingClassifier  #投票分类器
from sklearn.linear_model import LogisticRegression
from sklearn.svm import SVC
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.metrics import accuracy_score
iris=load_iris()  #加载数据集
X_train, X_test, Y_train, Y_test = train_test_split(iris.data, iris.target, test_size=0.3,  random_state=42)
log_clf=LogisticRegression()  #逻辑回归评估
rnd_clf=RandomForestClassifier()
svm_clf=SVC()
voting_clf=VotingClassifier(
 estimators=[('lr',log_clf),('rf',rnd_clf),('svc',svm_clf)],
 voting='hard'  #硬投票#
)
voting_clf.fit(X_train,Y_train)
print(clf.__class__.__name__,accuracy_score(Y_test,voting_clf.predict(X_test)))

结果输出为预测准确率(预测全对为1)
在这里插入图片描述

三.集成学习—bagging和pasting

3.1 简介

在这里插入图片描述

3.2 Scikit-Learn中使用bagging和pasting

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_samples=100,bootstrap=True,n_jobs=-1)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test) 

3.3 包外评估

  1. 简介
  1. API使用
from sklearn.metrics import accuracy_score
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,bootstrap=True,n_jobs=1,oob_score=True)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test)
accuracy_score(Y_test,y_pred)

3.4 随机补丁和随机子空间

from sklearn.ensemble import BaggingClassifier
from sklearn.tree import DecisionTreeClassifier
X_train, X_test, Y_train, Y_test = train_test_split(iris.data[:,2:], iris.target, test_size=0.3,  random_state=42)
bag_clf=BaggingClassifier(DecisionTreeClassifier(),n_estimators=500,max_features=2,
                          bootstrap_features=iris.feature_names[2:],bootstrap=True,n_jobs=-1)
bag_clf.fit(X_train,Y_train)
y_pred=bag_clf.predict(X_test)  

四.集成学习—随机森林

4.1 简介

4.2 API使用

from sklearn.ensemble import RandomForestClassifier
rnd_clf=RandomForestClassifier(n_estimators=500,max_leaf_nodes=16,n_jobs=-1)#n_jobs表示并行的意思,多余决策树之间并行运行
rnd_clf.fit(X_train,Y_train)

4.3 极端随机树

4.4 特征重要性

from sklearn.datasets import load_iris
iris=load_iris()
rnd_clf=RandomForestClassifier(n_estimators=500,n_jobs=-1)
rnd_clf.fit(iris["data"],iris["target"])
for name ,score in zip(iris["feature_names"],rnd_clf.feature_importances_):
    print(name,score)

在这里插入图片描述

五.集成学习—提升法Boosting

5.1 简介

5.2 AdaBoost

在这里插入图片描述

5.2 AdaBoost原理解析

  1. AdaBoost算法的初始时会将每个实例权重 w ( i ) w^{(i)} w(i)最初设置为 1 m \frac 1 m m1,然后对第一个预测器进行训练,并根据训练集计算其加权错误率 r 1 r_1 r1,第j个预测器的加权错误率的求法
    r j = ∑ i = 1 m w ( i ) ( y ^ j ( i ) ≠ y ( i ) ) ∑ i = 1 m w ( i ) r_j=\frac {\sum_{i=1}^m w^{(i)}(\hat y_j^{(i)}\neq y^{(i)})} {\sum_{i=1}^m w^{(i)}} rj=i=1mw(i)i=1mw(i)(y^j(i)=y(i))
  1. 预测器的权重这里我们记为 a j a_j aj,它的计算方法如下列公式所示。其中 β \beta β是我们的学习率超参数(默认为1),可以看出我们的预测器越准确( r j r_j rj越小)其权重就越高。

a j = β l o g 1 − r j r j a_j=\beta log \frac {1-r_j} {r_j} aj=βlogrj1rj

  1. 然后AdaBoost算法使用下面公式来更新实例的权重,从而提高了错误分类的实例的权重

对于 i = 1 , 2 , . . . . . , m 对于i=1,2,.....,m 对于i=1,2,.....,m
w ( i ) ← { w ( i ) , 如果 y ^ j ( i ) = y ( i ) w ( i ) e x p ( a j ) w^{(i)}\leftarrow \begin{cases} w^{(i)},如果 \hat y_j^{(i)}=y^{(i)}\\ w^{(i)}exp(a_j)\\ \end{cases} w(i){w(i),如果y^j(i)=y(i)w(i)exp(aj)
4. 然后对所有实例权重进行归一化(除以 ∑ i = 1 m w ( i ) \sum_{i=1}^m w^{(i)} i=1mw(i)
5. 最后使用更新后的权重训练一个新的预测器,然后重复整个过程(计算新预测器的权重,更新实例权重)直到达到所需的预测器或得到完美的预测器时算法结束
a 1 f 1 + a 2 f 2 + . . . + a n f n = F a_1f_1+a_2f_2+...+a_nf_n=F a1f1+a2f2+...+anfn=F

  1. 最后进行预测,AdaBoost就是简单地计算所有预测器的预测结果,并使用预测器权重 a j a_j aj对他们进行加权,最后得到大多数加权投票的类就是预测器给出的预测类

5.3 AdaBoost的API使用

Scikitlearn使用的是AdaBoost的多分类版本,叫做SAMME(基于多类指数损失函数的逐步添加模型),如果使用的预测器可以估算出每类的概率,可以使用SAMME的变体,SAMME.R,它和SAMME不同的是,它依赖的是类概率而不是类预测。

from sklearn.ensemble import AdaBoostClassifier
ada_clf=AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5)
ada_clf.fit(X_train,Y_train)

5.4 梯度提升

5.5 梯度提升原理

  1. 初始:训练集上训练第一个决策树
from sklearn.tree import DecisionTreeClassifier
tree_reg1=DecisionTreeClassifier(max_depth=2)
tree_reg1.fit(X_train,Y_train)
  1. 第二步:针对第一个预测器的残差训练第二个决策树
y2=Y_train-tree_reg1.predict(X_train)  #计算残差
tree_reg2=DecisionTreeRegressor(max_depth=2)
tree_reg2.fit(X_train,y2)
  1. 第三步:将前面得到的两棵树的预测相加,对性实例进行预测
y_pred=sum(tree.predict(iris.data[2:3,2:]) for tree in(tree_reg1,tree_reg2))
y_pred

5.6 梯度提升API使用

from sklearn.ensemble import GradientBoostingRegressor
gbrt=GradientBoostingRegressor(max_depth=2,n_estimators=3,learning_rate=1.0)
gbrt.fit(X_train,Y_train)
举报

相关推荐

0 条评论