集成学习

Boosting算法

Boosting的主要思想就是通过每一轮的训练得到模型的预测效果,来更新模型的权重到总模型中去。经典算法演变:Adaboost>>GDBT>>XGBoost。
这里主要介绍\sf {\color{red} {XGBoost} }

  • XGBoost核心思想
    xgboost是boosting(提升算法)算法的一种机器学习方法,从GDBT改良而来。核心思想是,用一棵树预测得到\hat y,得到残差(y-\hat y)。再加一棵树预测这个残差的值f_2(x_i),得到新的预测值\hat y + f_2(x_i)。而这多了一个树的预测值要比之前的预测值更接近真实值,这就是核心思想。

  • \sf {\color{red} {\text {实 现 步 骤 :}}}
    第一棵树:通常xgboost会初始化一个棵树tree0,初始化\hat y_0为0或者是常数 C 。
    第二棵树:是在第一棵树的结果基础上,增加这一颗树的结果,得到预测值,并且比第一次更接近真实值,\hat y_1 = \hat y_0 +f_1(x_i)
    \vdots
    第k棵树:也是如此,\hat y_k = \hat y_{k-1} +f_k(x_i)。在评价接近真实值上回归任务经常选用均方误((y-\hat y)^2)差来做评价指标。
    在这里,每次增加的数结构为 f_k(x_i) = {\mit{W}}_{q(x_i)}q(x_i)代表落在哪个叶子节点, {\mit{W}}表示叶子节点对应的权重。

简化下来就是这样的:


\text{tree1:} \hat y_0 = C
\text{tree2:} \hat y_1 = \hat y_0 +f_1(x_i)
\text{tree3:} \hat y_2 = \hat y_1 +f_2(x_i)
     \vdots
\text{treet:} \hat y_t= \hat y_{t-1} +f_t(x_i) = \sum^t_{k=0}f_k(x_i)


  • xgboost公式推导

xgboost的目标函数由两部分组成,一个是loss函数\sum_{i=1}^n l(y_i,\hat y_i),一个是正则项\sum_{k=1}^t {}\Omega(f_t)。loss函数是评价每个样本的预测值和真实值的差异,正则项是解决模型过拟合,是调节每棵树的叶子数和叶子节点的权重值。也就是这个正则项才使xgboost这种提升算法,交之前的算法更为优秀。所以xgboost原始的公式如下:

obj = \sum_{i=1}^n l(y_i,\hat y_i) +\sum_{k=1}^t {}\Omega(f_t)

在开始推导之前,先知道这几个知识:


\sum_{i=1}^n l(y_i,\hat y_i) 可以采用均方误差、log损失函数等自定义的函数都可以(二阶可导)。

\sum_{k=1}^t \Omega(f_t) = \sum_{k=1}^t (\gamma T + {1\over2}\sum_{j=1}^T w_j^2) 式中,k表示第几课树,T表示叶子节点个数,w_j^2表示每个叶子节点的权重值w_j^= {\mit{W}}_{q(x_i)}

\sf {\color{red}{\text{泰 勒 展 开 :}}} f(x+\Delta x) = f(x) + f^{'}(x)\Delta x + {1\over2}f^{''}(x){\Delta x}^2


推导开始:
\begin{align} obj & = \sum_{i=1}^n l(y_i,\hat y_i) +\sum_{k=1}^t {}\Omega(f_t) \\ & = \sum_{i=1}^n \color{red} {l(y_i,\hat y_{i-1}+f_t(x_i))} +\sum_{k=1}^t {}\Omega(f_t) \\ &= \sum_{i=1}^n \color{red} {\{l(y_i,\hat y_{i-1}) +l^{'}(y,\hat y_{i-1})f_t(x_i) +{1\over2}l^{''}(y,\hat y_{i-1}){f_t(x_i)}^2 \}} +\sum_{k=1}^t {}\Omega(f_t) \\ & = \sum_{i=1}^n \color{red} {\{l^{'}(y,\hat y_{i-1})f_t(x_i) +{1\over2}l^{''}(y,\hat y_{i-1}){f_t(x_i)}^2 \}} +\sum_{k=1}^t {}\Omega(f_t) + C \\ & = \sum_{i=1}^n {\{l^{'}()f_t(x_i) +{1\over2}l^{''}(){f_t(x_i)}^2 \}} +\sum_{k=1}^t {}\Omega(f_t) + C \end{align}

  • xgboost代码实现

  • 原生接口
import xgboost as xgb
# step1 导入数据
Dtrain = xgb.DMatrix(TRAIN_DATA)
# step2 设置模型(深度、学习率、任务模式等)参数(字典形式),具体参数查阅文档
# https://xgboost.readthedocs.io/en/latest/
params = PARAMETER_DICT
# step3 训练并保存模型
xgb.train(params, Dtrain, early_stopping_rounds=10).save_model(MODEL_PATH)
# 预测
Dtest = xgb.DMatrix(TEST_DATA)
ytest_pre = xgb.Booster(model_file=MODEL_PATH).predict(Dtest)
# 评价就不说了
  • sklearn接口
from xgboost.sklearn import XGBClassifier
from sklearn.model_selection import train_test_split
# 载入数据并切分
x_train, x_test, y_train, y_test = train_test_split(x_data, y_data, test_size=0.33, random_state=0)
# 这个是用来做评价的数据,也就是非缄默打印时候loss的计算数据集
eval_set = [(x_test,y_test)]
# 设置参数,搭建模型框架
params = PARAMETER_DICT
bst = XGBClassifier(params,silent=True)
# 训练、保存模型
bst.fit(x_train,y_train,early_stopping_rounds=20,eval_set=eval_set)
bst.save_model(MODEL_PATH)
# 预测
Dtest = xgb.DMatrix(x_test)
ytest_pre = xgb.Booster(model_file=MODEL_PATH).predict(Dtest)
# 评价也不说了
  • 模型重要特征展示
from xgboost import plot_importance

fig2, ax = plt.subplots(figsize=(15, 15))
plot_importance(bst,height = 0.5,ax = ax,max_num_features = 64)
plt.show()
  • xgboost调

  • 有经验就自己瞎写
    一般需要调节的参数有(附文档):
    • L1,L2正则项参数:
    • 学习率:
    • 树的最大深度:
    • 迭代的轮数:
    • 建树时候的各种比例:
      等等········
  • 没有足够的经验推荐用GridSearchCV
from xgboost.sklearn import XGBClassifier
from sklearn.model_selection import GridSearchCV
# 初始化一个模型
model = XGBClassifier()
# 设置需要验证的参数列表
parameters = {'eta':[0.1, 0.2, 0.3], 'max_deep':[1, 2, 10]}
# 搭建网格验证框架
clf = GridSearchCV(model, parameters, cv=5)
# 训练,选择最优组合
clf.fit(x_train, y_train)

\sf{\color{red}{\text{最 后 来 一 个 完 整 的 案 例 代 码 : }}}

待补充········

Bagging算法

遇上再写·······

Stacking算法

遇上再写·······

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

推荐阅读更多精彩内容