ML 监督学习 集成学习 Boosting

集成学习是用多个弱分类器构成一个强分类器,其哲学思想是“三个臭皮匠赛过诸葛亮”。一般的弱分类器可以由决策树,神经网络,贝叶斯分类器,K-近邻等构成。

弱学习器:泛华性能略优于随机猜测的学习器​
集成学习通常可获得比单一学习器显著优越的泛华性能

为什么要集成

如果每个个体学习器都互相独立,集成模型会工作的很好
但是每个个体学习器都在同一个训练集上训练,可能会犯同一种错误,导致集成的准确率下降​。
得到多样的分类器的方法之一:用完全不同的算法,提高集成的正确率​。

1.模型选择

假设各弱分类器间具有一定差异性(如不同的算法,不同参数),这会导致生成的分类决策边界不同。将它们结合后能得到更合理的边界,减少整体错误,实现更好的分类效果。

  1. 数据集过大或过小

数据集较大时,可以分为不同的子集,分别进行训练,然后再合成分类器。
数据集过小时,可使用自举技术(bootstrapping),从原样本集有放回的抽取m个子集,训练m个分类器,进行集成。

集成学习通过投票来预测类别

硬投票分类器
创建一个更好的分类器的方法整合每一个分类器的预测然后经过投票去预测分类这种分类器叫做硬投票分类器

软投票分类器
如果分类器能够估计分为每一类的概率---有predict_proba()方法那么可以对每个分类器的概率取平均,再预测具有最高类概率的类​必须要确保所有分类器都可以估计类的概率

要获得好的集成,个体学习器应“好而不同"---准确性和多样性
1.每个弱分类器的错误率不能高于0.5
2.弱分类器之间的性能要有较大的差别

集成学习方法

个体学习器之间存在强依赖性关系,必须串行生成的序列化方法

Boosting

一族可将弱学习器提升为强学习器的算法
a.先从初始数据集训练出一个基学习器
b.根据基学习器的表现对训练样本分布进行调整
c.基于调整后的样本分布来训练下一个基学习器
d.重复以上步骤,直到基学习器数目达到事先指定的值N
e.最后将N个基学习器进行加权结合​​​​​​

Boosting算法在训练的每一轮都要检查当前基分类器是否比随机猜测好
否则抛弃当前基学习器,学习过程停止,则可能未达到N​​​,那么可根据当前分布重新对训练样本进行采样,再重新训练出基学习器,使之达到N​

Boosting算法中代表性算法

AdaBoost(自适应增强)

Gradient Boosting + Exponential Loss + Binary base classifier

https://youtu.be/k4G2VCuOMMg

基于数据集多重抽样的分类器,Adaboost是一种迭代算法,算法本身是通过改变数据权值分布来实现。

a. 给训练数据集中的每一个样本赋予权重,权重初始化相等值,这些权重形成向量D。一般初始化所有训练样例的权重为1 / N,其中N是样例数
b.在训练集上训练出弱分类器并计算该分类器的错误率
c.同一数据集上再次训练分类器,调整样本的权重,将第一次分对的样本权重降低,第一次分错的样本权重提高
d.最后给每一个分类器分配一个权重值α,α = 0.5*ln((1-错误率)/错误率)
e.计算出alpha值后,可以对权重向量D进行更新,以使得正确分类的样本权重降低而错分样本的权重升高。
f.Adaboost算法会不断地重复训练和调整权重,直到训练错误率为0或者弱分类器的数目达到指定的值。

标准AdaBoost只适用于二分类
Scikit-learn中对应为AdaBoostClassifier类,如果要多分类,则可以设置参数algorithm=”SAMME”,​如果分类器可以预测概率(有predict_proba()),则设置参数algorithm=”SAMME.R” R代表REAL如果AdaBoost集成过拟合,可以减少基分类器的数量或对基分类器使用更强的正则化​

GBDT 积跬步以至千里

GB:梯度迭代 Gradient Boosting
通过迭代多棵树来共同决策。

DT:回归树 Regression Decision Tree

1.先用初始数据集来学习一颗决策树,可得到每一片叶子的预测值。以及预测之后的残差(真实值-预测值)
2.然后下一次迭代的决策树就基于上一次决策树的残差数据来学习,得到的结果是上一轮残差的预测值,以及本轮残差
3.不断迭代,直到最后一轮的残差为0或者非常小
4.把所用轮次的模型预测值累加起来就是最终的预测值

GDBT Boosting参数

loss:损失函数,对于分类模型,有对数似然函数“deviance”和指数损失函数“exponential” 选择指数损失函数就是Adaboost算法
n_estimators:默认100,最大的弱学习器的个数/弱学习器的最大迭代次数
learning_rate:默认0.1

例子
###1.投票分类器---由几个不同的分类器组成
from sklearn.datasets import load_iris, make_moons
from sklearn.model_selection import cross_val_score, train_test_split
from sklearn.preprocessing import StandardScaler,LabelEncoder
from sklearn.metrics import accuracy_score
from sklearn.ensemble import RandomForestClassifier,VotingClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
import warnings
warnings.filterwarnings("ignore")


#创建一个半月形的数据集,数据集划分
x, y = make_moons(n_samples=1000, noise=0.25, random_state=0)
x_train,x_test,y_train,y_test=train_test_split(x,y,test_size=0.3,random_state=0)

#构建模型
lr=LogisticRegression()
rf=RandomForestClassifier()
svm1=SVC()
svm2=SVC(probability=True)#SVC默认probability=False,改为True,将使用交叉验证
voting_hard=VotingClassifier(estimators=[('lr',lr),('rf',rf),('svm',svm1)],voting='hard')
voting_soft=VotingClassifier(estimators=[('lr',lr),('rf',rf),('svm',svm2)],voting='soft')
voting_hard.fit(x_train,y_train)
voting_soft.fit(x_train,y_train)
#如果用KNN,LogisticRegression最好标准化特征StandardScaler


#训练模型并进行预测
print('hard voting')
for mla in (lr,rf,svm1,voting_hard):
    mla.fit(x_train,y_train)
    y_pred1=mla.predict(x_test)
    print(mla.__class__.__name__, accuracy_score(y_test, y_pred1))
    
print('-'*10)
print('soft voting')
for mlas in (lr,rf,svm2,voting_hard):
    mlas.fit(x_train,y_train)
    y_pred2=mlas.predict(x_test)
    print(mlas.__class__.__name__, accuracy_score(y_test, y_pred2))

###2.AdaBoostClassifier
from sklearn.ensemble import AdaBoostClassifier
ada=AdaBoostClassifier(DecisionTreeClassifier(max_depth=1),n_estimators=200,algorithm="SAMME.R",learning_rate=0.5)
ada.fit(x_train,y_train)
y_pred3=ada.predict(x_test)
print('-'*10)
print('AdaBoost',accuracy_score(y_test,y_pred3))
#当然对于回归也有AdaBoostRegressor

from sklearn.datasets import load_iris
from sklearn.ensemble import GradientBoostingClassifier
from sklearn.model_selection import GridSearchCV

iris=load_iris()
x=iris.data
y=iris.target

from sklearn import model_selection
X_train,X_test,y_train,y_test=model_selection.train_test_split(x,y,test_size=0.3,random_state=20)

gbdt=GradientBoostingClassifier()
gbdt.fit(X_train,y_train)

print(gbdt.score(X_test,y_test))

print(gbdt.feature_importances_)

parameters={'n_estimators':[50,80,100],
            'learning_rate':[0.01,0.1,0.2,0.5,1]}

gbdt=GradientBoostingClassifier()
grid_search=GridSearchCV(gbdt,parameters,scoring='accuracy',cv=5)
grid_search.fit(x,y)

print(grid_search.best_estimator_)
print(grid_search.best_score_)
print(grid_search.best_params_)
总结
Conclusion
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 222,000评论 6 515
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 94,745评论 3 399
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 168,561评论 0 360
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 59,782评论 1 298
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 68,798评论 6 397
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 52,394评论 1 310
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,952评论 3 421
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 39,852评论 0 276
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 46,409评论 1 318
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 38,483评论 3 341
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 40,615评论 1 352
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 36,303评论 5 350
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,979评论 3 334
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 32,470评论 0 24
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 33,571评论 1 272
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 49,041评论 3 377
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 45,630评论 2 359

推荐阅读更多精彩内容