Boosting算法
Boosting的主要思想就是通过每一轮的训练得到模型的预测效果,来更新模型的权重到总模型中去。经典算法演变:Adaboost>>GDBT>>XGBoost。
这里主要介绍。
-
XGBoost核心思想
xgboost是boosting(提升算法)算法的一种机器学习方法,从GDBT改良而来。核心思想是,用一棵树预测得到,得到残差。再加一棵树预测这个残差的值,得到新的预测值。而这多了一个树的预测值要比之前的预测值更接近真实值,这就是核心思想。
第一棵树:通常xgboost会初始化一个棵树tree0,初始化为0或者是常数 C 。
第二棵树:是在第一棵树的结果基础上,增加这一颗树的结果,得到预测值,并且比第一次更接近真实值,。
第k棵树:也是如此,。在评价接近真实值上回归任务经常选用均方误()差来做评价指标。
在这里,每次增加的数结构为 。代表落在哪个叶子节点, 表示叶子节点对应的权重。
简化下来就是这样的:
-
xgboost公式推导
xgboost的目标函数由两部分组成,一个是loss函数,一个是正则项。loss函数是评价每个样本的预测值和真实值的差异,正则项是解决模型过拟合,是调节每棵树的叶子数和叶子节点的权重值。也就是这个正则项才使xgboost这种提升算法,交之前的算法更为优秀。所以xgboost原始的公式如下:
在开始推导之前,先知道这几个知识:
可以采用均方误差、log损失函数等自定义的函数都可以(二阶可导)。
式中,k表示第几课树,T表示叶子节点个数,表示每个叶子节点的权重值。
推导开始:
-
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算法
遇上再写·······