乐趣区

关于算法:Python集成机器学习用AdaBoost决策树逻辑回归集成模型分类和回归和网格搜索超参数优化

原文链接:http://tecdat.cn/?p=24231 

Boosting 是一类集成机器学习算法,波及联合许多弱学习器的预测。

弱学习器是一个非常简单的模型,只管在数据集上有一些技巧。在开发实用算法之前很久,Boosting 就是一个实践概念,而 AdaBoost(自适应晋升)算法是该想法的第一个胜利办法。

AdaBoost 算法包含应用十分短的(一级)决策树作为弱学习者,顺次增加到汇合中。每一个后续的模型都试图纠正它之前的模型在序列中做出的预测。这是通过对训练数据集进行衡量来实现的,将更多的注意力放在先前模型呈现预测谬误的训练实例上。

在本教程中,您将理解如何开发用于分类和回归的 AdaBoost 集成。

实现本教程后,您将理解:

  • AdaBoost 集成是一个由决策树顺次增加到模型中而造成的合集。
  • 如何应用 AdaBoost 集成通过 scikit-learn 进行分类和回归。
  • 如何摸索 AdaBoost 模型超参数对模型性能的影响。
  • 增加了网格搜寻模型超参数的示例。

教程概述

本教程分为四个局部;他们是:

  1. AdaBoost 集成算法
  2. AdaBoost  API
  3. 用于分类的 AdaBoost
  4. 用于回归的 AdaBoost
  5. AdaBoost 超参数
  6. 摸索树的数量
  7. 摸索弱学习
  8. 摸索学习率
  9. 摸索代替算法
  10. 网格搜寻 AdaBoost 超参数

AdaBoost 集成算法

Boosting “Boosting”) 是指一类机器学习集成算法,其中模型按程序增加,序列中较晚的模型纠正序列中较早模型所做的预测。

AdaBoost 是“Adaptive Boosting”的缩写,是一种晋升集成机器学习算法,并且是最早胜利的晋升办法之一。

咱们称该算法为 AdaBoost 是因为与以前的算法不同,它能够自适应地调整弱假如的谬误

— A Decision-Theoretic Generalization of on-Line Learning and an Application to Boosting, 1996.

AdaBoost 联合了来自短的一级决策树的预测,称为决策树桩,只管也能够应用其余算法。决策树桩算法被用作 AdaBoost 算法,应用许多弱模型并通过增加额定的弱模型来纠正它们的预测。

训练算法波及从一个决策树开始,在训练数据集中找到那些被谬误分类的例子,并为这些例子减少更多的权重。另一棵树在雷同的数据上训练,只管当初由误分类谬误加权。反复此过程,直到增加了所需数量的树。

如果训练数据点被谬误分类,则该训练数据点的权重会减少(晋升)。应用新的权重构建第二个分类器,这些权重不再相等。同样,谬误分类的训练数据的权重减少,并反复该过程。

— Multi-class AdaBoost, 2009.

该算法是为分类而开发的,波及组合集成中所有决策树所做的预测。还为回归问题开发了一种相似的办法,其中应用决策树的平均值进行预测。每个模型对集成预测的奉献依据模型在训练数据集上的性能进行加权。

新算法不须要弱假如准确性的先验常识。相同,它适应这些准确性并生成加权少数假如,其中每个弱假如的权重是其准确性的函数。

— A Decision-Theoretic Generalization of on-Line Learning and an Application to Boosting, 1996.

当初咱们相熟了 AdaBoost 算法,让咱们看看如何在 Python 中拟合 AdaBoost 模型。

AdaBoost Scikit-Learn API

scikit-learn Python 机器学习库为机器学习提供了 AdaBoost 集成的实现。

首先,通过运行以下脚本确认您应用的版本:

# 查看 scikit-learn 版本

import sklearn

print(sklearn.\_\_version\_\_)

运行该脚本将输入的 scikit-learn 版本。

在构建模型的过程中应用了随机性。这意味着每次在雷同的数据上运行该算法时,都会产生一个略有不同的模型。

当应用具备随机学习算法的机器学习算法时,通过在屡次运行或反复穿插验证中均匀其性能来评估它们是很好的做法。在拟合最终模型时,最好是减少树的数量,直到模型的方差在反复评估中缩小,或者拟合多个最终模型并均匀其预测值。

让咱们来看看如何为分类和回归开发 AdaBoost 集成。

用于分类的 AdaBoost

在本节中,咱们将钻研应用 AdaBoost 解决分类问题。

首先,咱们能够创立一个蕴含 1,000 个示例和 20 个输出特色的合成二元分类问题。

上面列出了要害代码片段示例。

# 测试分类数据集

from skar.dtasts imprt me_clssificaton


# 对数据集进行总结

pin(X.shp y.hae)

运行示例创立数据集并总结输出和输入的维度。

接下来,咱们能够在这个数据集上评估 AdaBoost 算法。

咱们将应用反复的分层 k - 折穿插验证来评估该模型,有三个反复和 10 个折。咱们将报告该模型在所有反复和折中的准确性的平均值和标准偏差。

# 评估 adaboost 算法的分类

from numpy import mean


# 定义模型

mdl = ABster()

# 评估该模型

cv = Reeio(n\_is=10, n\_pe=3, rn_tt=1)
s=-1, rr_se='raise')

# 报告性能

prt('ccrac %.3f (%.f)' % (ean(scoes),std(n_ces)))

运行示例报告模型的均值和标准偏差准确度。

留神 :您的后果思考到算法或评估程序的随机性,或数值精度的差别。思考屡次运行该示例并比拟均匀后果。

在这种状况下,咱们能够看到具备默认超参数的 AdaBoost 集成在此测试数据集上实现了约 80% 的分类准确率。

咱们也能够应用 AdaBoost 模型作为最终模型,并进行预测分类。

首先,AdaBoost 汇合在所有可用的数据上进行拟合,而后能够调用 predict() 函数对新数据进行预测。

上面的例子在咱们的二元分类数据集上演示了这一点。
 

# 应用 adaboost 进行分类预测

from sldat  s imprt mke_lassicain

#定义模型

moel = AdBoser()

# 在整个数据集上拟合模型

mdl.t(X, y)

# 进行一次预测



yhat = mdepreict(ow)

prnt('Preicte Clas: %d'  yht\[0\])

运行示例在整个数据集上拟合 AdaBoost 集成模型,而后用于对新数据行进行预测,就像咱们在应用程序中应用模型时一样。

当初咱们相熟了应用 AdaBoost 进行分类,让咱们看一下用于回归的 API。

用于回归的 AdaBoost

在本节中,咱们将钻研应用 AdaBoost 解决回归问题。

首先,咱们能够创立一个具备 1,000 个示例和 20 个输出特色的综合回归问题。

上面列出了残缺的示例。

# 测试回归数据集
fromrn.se impr mkergrsion

# 定义数据集
X, y = mkresion(naps=1000,n_eaes=20, nom=15, nse=0.1,ramtae=6)

# 对数据集进行总结

prntX.she, y.hae)

运行示例创立数据集并总结输出和输入的维度。

接下来,咱们能够在这个数据集上评估 AdaBoost 算法。

正如咱们在上一节所做的那样,咱们将应用反复的 k 折穿插验证来评估模型,反复 3 次和 10 次。咱们将报告模型在所有反复和折中的均匀绝对误差 (MAE)。使 MAE 为负值,使其最大化而不是最小化。这意味着负 MAE 越大越好,完满模型的 MAE 为 0。

上面列出了残缺的示例。

# 评估 adaboost 汇合的回归成果

from numpy import mean




# 定义模型

mel = Aar()

# 评估该模型

KFld(n\_lit=10, n\_pes=3, rndstt=1)

crss(mde, X, y, sorng='n\_mea\_aoluteeror', cv=cv, nobs=-1, ercr='raise')

# 报告性能

rit('MAE: %.3f (%.3f)' % (mean(sc), std(_cres)))

运行示例报告模型的均值和标准偏差准确度。

留神 :您思考到算法或评估程序的随机性,或数值精度的差别。思考屡次运行该示例并比拟均匀后果。

在这种状况下,咱们能够看到具备默认超参数的 AdaBoost 集成实现了大概 100 的 MAE。

咱们还能够应用 AdaBoost 模型作为最终模型并对回归进行预测。

首先,AdaBoost 集成拟合所有可用数据,而后  能够调用_predict()_函数对新数据进行预测。

上面的示例在咱们的回归数据集上演示了这一点。

# 用于预测回归的 adaboost 集成

import maeon





# 定义模型

moel = Botsor()

# 在整个数据集上拟合该模型

fit(X, y)

# 做一个繁多的预测


 peict(row)

pit('Peon: %d' % ht\[0\])

运行示例在整个数据集上拟合 AdaBoost 集成模型,而后用于对新数据行进行预测,就像咱们在应用程序中应用模型时一样。

当初咱们曾经相熟了应用 scikit-learn API 来评估和应用 AdaBoost 集成,让咱们看一下配置模型。

AdaBoost 超参数

在本节中,咱们将认真钻研一些您应该思考调整 AdaBoost 集成的超参数及其对模型性能的影响。

摸索树的数量

AdaBoost 算法的一个重要超参数是集成中应用的决策树的数量。

回忆一下,集成中应用的每个决策树都被设计为弱学习器。也就是说,它比随机预测有技巧,但技巧不高。因而,应用一级决策树,称为决策树桩。

增加到模型中的树的数量必须很高,模型能力失常工作,通常是数百甚至数千。

树的数量能够通过“_n_”参数设置,默认为 50。

上面的示例探讨了值在 10 到 5,000 之间的树数量的影响。

# 摸索 adaboost 集成的树数对性能的影响

from numpy import mean




# 获取数据集

def gdet():

X, y = ae\_scon(n\_spes=1000, nftus=20, inve=15, n\_rant=5, ram\_ae=6)

retrn X, y



# 取得要评估的模型列表

def gemls():

mels = dct()

# 定义要思考的树的数量


for n in n_res:
mols\[str(n)\] = AaBstsfern_titos=n)

etrn moel



# 用穿插验证法评估一个给定的模型

def evat_oe(odl, X, y):

# 定义评估程序

cv = RpdStfKFol(n_pis=10, nrpt=3, andoste=1)

# 评估模型并收集后果
scs = cs\_vore(moel, X, y, scng='ccrcy', cv=cv, n\_jobs=-1)
return sces


# 定义数据集

X, y = gedast()

# 取得要评估的模型

odls = emols()

# 评估模型并存储后果

rslt, nmes = lst(), lst()

for nae, moel in odels.ims():

# 评估模型

scor = eateel(mdel, X, y)

# 存储后果

ruls.aped(scrs)

na   e.aped(nae)

# 总结体现

prnt('>%s %.3f (%3f)' % (nme, man(scrs), std(soes)))

# 绘制模型的性能,进行比拟


p.shw()

运行示例首先报告每个数量的决策树的均匀准确度。

留神 :思考到算法或评估程序的随机性,或数值精度的差别。思考屡次运行该示例并比拟均匀后果。

在这种状况下,咱们能够看到该数据集的性能在大概 50 棵树之前有所提高,而后降落。这可能是在增加额定的树后集成适度拟合训练数据集的问题。

为每个配置数量的树的准确度分数散布创立了一个箱线图。

咱们能够看到模型性能和集成大小的总体趋势。

AdaBoost 集成大小与分类精度的箱线图

摸索弱学习者

默认状况下,只有一个档次的决策树被用作弱学习器。

咱们能够通过减少决策树的深度,使合集中应用的模型不那么弱(更有技巧)。

上面的例子探讨了减少 DecisionTreeClassifier 弱学习器的深度对 AdBoost 组合的影响。

# 摸索 adaboost 集成树深度对性能的影响

from numpy import mean





# 取得数据集

def ettst():


rtrn X, y



# 取得一个要评估的模型列表

def gtodes():
modls = di()

# 摸索从 1 到 10 的深度

for i in rane(1,11):

# 定义根本模型

bae = DisioTer(mxdph=i)
# 定义汇合模型

modls\[tr(i)\] = Bost(bseimaor=bse)

rtun moes



# 用穿插验证法评估一个给定的模型

def elaeel(moel, X, y):

# 定义评估程序

cv = RpaedSifdKod(n_pis=10, nepts=3, rndoste=1)
# 评估模型并收集后果

soes = cro\_acoe(moel, X, y,scorng='ccray', cv=cv, \_obs=-1)

return scos



# 定义数据集

X, y = edatet()

# 取得要评估的模型

mols = etels()

# 评估模型并存储后果

rsults, nes = lst(), lst()

for ame, odel in mdelsts():

# 评估模型

scrs = evlel(moel, X, y)

# 存储后果

rsls.aped(scos)

naes.apend(nme)

# 总结体现

pit('>%s %.3f (%.3f)' % (nae, man(scors), std(scres)))

# 绘制模型的性能,以便进行比拟


p.hw()

运行示例首先报告每个配置的弱学习器树深度的均匀准确度。

留神 :思考到算法或评估程序的随机性,或数值精度的差别。思考屡次运行该示例并比拟均匀后果。

在这种状况下,咱们能够看到随着决策树深度的减少,集成在该数据集上的性能也有所提高。

为每个配置的弱学习器深度的准确度分数散布创立了一个盒须图。

咱们能够看到模型性能和弱学习器深度的总体趋势。

AdaBoost Ensemble 弱学习器深度与分类精度的箱线图

摸索学习率

AdaBoost 还反对管制每个模型对集成预测的奉献的学习率。

这由“learning_rate”参数管制,默认状况下设置为 1.0 或全副奉献。依据集成中应用的模型数量,更小或更大的值可能是适合的。模型的奉献与集成中的树数量之间存在均衡。

更多的树可能须要更小的学习率;更少的树可能须要更大的学习率。通常应用 0 到 1 之间的值,有时应用十分小的值以防止适度拟合,例如 0.1、0.01 或 0.001。

上面的示例以 0.1 的增量摸索了 0.1 和 2.0 之间的学习率值。

# 摸索 adaboost 汇合学习率对性能的影响

from numpy import mean

from numpy import std





# 获取数据集

def ge_taet() 



# 取得要评估的模型列表

def e_moels():

mods = dct()

# 摸索从 0.1 到 2 的学习率,增量为 0.1

for i in ane(0.1, 2.1, 0.1):

key = '%.3f' % i

mdls\[key\] = AdaBoo(leag_te=i)





# 用穿插验证法评估一个给定的模型

def vaatodl(moel, X, y):

# 定义评估程序

cv = RepeSatiKFld(n\_slts=10, n\_epts=3, ado_tae=1)

# 评估模型并收集后果

sces = csslsre(mel, X, y, soing='cacy', cv=cv, njs=-)




# 定义数据集

X, y = ge_dtet()

# 取得要评估的模型

model= et_oels()

# 评估模型并存储后果


for ne, moel in mode.itms():

# 评估模型

scos =valueoel(, X, y)

# 存储后果

reslt.pped(scors)

naeppend(ame)

# 总结体现


# 绘制模型的性能,以便进行比拟



ot.ow()

运行示例首先报告每个配置的学习率的均匀准确度。

留神 :思考到算法或评估程序的随机性,或数值精度的差别。思考屡次运行该示例并比拟均匀后果。

在这种状况下,咱们能够看到 0.5 到 1.0 之间的类似值,之后模型性能降落。

 

为每个配置的学习率的准确度分数散布创立了一个箱线图。

咱们能够看到在这个数据集上学习率大于 1.0 时模型性能降落的总体趋势。

AdaBoost 集成学习率与分类精度的箱线图

摸索代替算法

集成中应用的默认算法是决策树,但也能够应用其余算法。

目标是应用非常简单的模型,称为弱学习器。此外,scikit-learn 实现要求应用的任何模型还必须反对加权样本,因为它们是通过基于训练数据集的加权版本拟合模型来创立集成的形式。

能够通过“base_estimator”参数指定根本模型。在分类的状况下,根底模型还必须反对预测概率或类概率分数。如果指定的模型不反对加权训练数据集,您将看到如下错误信息:

ValueError: KNeighborsClassifier doesn't support sample_weight.

反对加权训练的模型的一个示例是逻辑回归算法。

上面的例子演示了一个 AdaBoost 算法逻辑回归算法弱学习者。

# 评估 adaboost 算法与逻辑回归弱学习者的分类办法

from numpy import mean





# 定义模型

modl = AdaClass(est=Logi())

# 评估该模型

cv = ReaeSrfiedKd(nspis=10, neas=3, andm_=1)

sce =crsvlre(del, X, y, scrg='acacy', cv=cv, nos=-1, r_soe='ase')

# 报告性能 

运行示例报告模型的均值和标准偏差准确度。

留神 :思考到算法或评估程序的随机性,或数值精度的差别。思考屡次运行该示例并比拟均匀后果。

在这种状况下,咱们能够看到带有逻辑回归弱模型的 AdaBoost 集成在这个测试数据集上实现了大概 79% 的分类准确率。

网格搜寻 AdaBoost 超参数

将 AdaBoost 配置为算法可能具备挑战性,因为影响模型在训练数据上的行为的许多要害超参数和超参数互相交互。

因而,应用搜寻过程来发现对给定的预测建模问题运行良好或最佳的模型超参数配置是一种很好的做法。风行的搜寻过程包含随机搜寻和网格搜寻。

在本节中,咱们将钻研 AdaBoost 算法的要害超参数的网格搜寻通用范畴,您能够将其用作您本人我的项目的终点。这能够通过应用_GridSearchCV_ 类并指定一个字典来实现,该字典将模型超参数名称映射到要搜寻的值。

在这种状况下,咱们将对 AdaBoost 的两个要害超参数进行网格搜寻:集成中应用的树的数量和学习率。咱们将为每个超参数应用一系列风行的体现良好的值。

将应用反复的 k 折穿插验证评估每个配置组合,并应用均匀分数(在本例中为分类精度)比拟配置。

上面列出了在咱们的合成分类数据集上对 AdaBoost 算法的要害超参数进行网格搜寻的残缺示例。

# 在分类数据集上用网格搜寻 adaboost 的要害超参数的例子

from sklearn.datasets import make_classification



# 定义数据集

X, y = mke(neares=0, nnrte=15, nednt=5, rd_sae=6)

# 用默认的超参数定义模型

mdl = AdaosCr()

# 定义要搜寻的数值的网格
rid =ict()

gid\['n_estrs'\] = \[10, 50, 100, 500\] 

grd\['lri_at'\] = \[0.0001, 0.001, 0.01, 0.1, 1.0\] 

# 定义评估程序

cv = RaSteKld(n\_lts=10, n\_eet=3, rn_te=1)

# 定义网格搜寻程序
gri\_arh = GiarcCV(ipostor=oel, pram\_ri=gid, n_os=-1, cv=cv, srg='auacy')

# 执行网格搜寻

gr_ru = gr.fit(X, y)

# 总结最佳得分和配置


# 总结所有被评估过的分数



for man, sev,prm in zip(ansstds, pams):
    print(")wt:" mantdv, paam))

运行该示例可能须要一段时间。在运行完结时,首先报告获得最佳分数的配置,而后是思考的所有其余配置的分数。

在这种状况下,咱们能够看到具备 500 棵树和 0.1 学习率的配置体现最好,分类准确率约为 81.3%。

只管在这种状况下没有测试这些配置以确保网格搜寻在正当的工夫内实现,但模型可能会在更多树(例如 1,000 或 5,000)下体现得更好。

进一步浏览

如果您想深刻理解,能够查看原文或浏览无关该话题的更多资源。


最受欢迎的见解

1. 从决策树模型看员工为什么到职

2.R 语言基于树的办法:决策树,随机森林

3.python 中应用 scikit-learn 和 pandas 决策树

4. 机器学习:在 SAS 中运行随机森林数据分析报告

5.R 语言用随机森林和文本开掘进步航空公司客户满意度

6. 机器学习助推快时尚精准销售工夫序列

7. 用机器学习辨认一直变动的股市情况——隐马尔可夫模型的利用

8.python 机器学习:举荐零碎实现(以矩阵合成来协同过滤)

9.python 中用 pytorch 机器学习分类预测银行客户散失

退出移动版