集成学习

Boosting算法

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

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

    集成学习_第1张图片


  • 第一棵树:通常xgboost会初始化一个棵树tree0,初始化为0或者是常数 C 。
    第二棵树:是在第一棵树的结果基础上,增加这一颗树的结果,得到预测值,并且比第一次更接近真实值,。

    第k棵树:也是如此,。在评价接近真实值上回归任务经常选用均方误()差来做评价指标。
    在这里,每次增加的数结构为 。代表落在哪个叶子节点, 表示叶子节点对应的权重。

简化下来就是这样的:





     


  • xgboost公式推导

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

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


可以采用均方误差、log损失函数等自定义的函数都可以(二阶可导)。

式中,k表示第几课树,T表示叶子节点个数,表示每个叶子节点的权重值。


推导开始:
\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)

待补充········

Bagging算法

遇上再写·······

Stacking算法

遇上再写·······

你可能感兴趣的:(集成学习)