在XGBoost里,每棵树是一个一个往里面加的,每加一个都是希望效果能够提升,下图就是XGBoost这个集成的表示(核心)
一开始树是0,然后往里面加树,相当于多了一个函数,再加第二棵树,相当于又多了一个函数...等等,这里需要保证加入新的函数能够提升整体对表达效果。提升表达效果的意思就是说加上新的树之后,目标函数(就是损失)的值会下降。
如果叶子结点的个数太多,那么过拟合的风险会越大,所以这里要限制叶子结点的个数,所以在原来目标函数里要加上一个惩罚项「omega(ft)」。
XGBoost算法完整的目标函数见下面这个公式,它由自身的损失函数和正则化惩罚项「omega(ft)」相加而成。
一阶导二阶导的梯度数据都是可以算出来的,只要指定了主函数中的两个参数,这就是一个确定的值。下面给出一个直观的例子来看下这个过程
(这里多说一句:Obj代表了当我们指定一个树的结构的时候,在目标上最多会减少多少,我们可以把它叫做结构分数,这个分数越小越好)
对于每次扩展,我们依旧要枚举所有可能的方案。对于某个特定的分割,我们要计算出这个分割的左子树的导数和和右子数导数和之和(就是下图中的第一个红色方框),然后和划分前的进行比较(基于损失,看分割后的损失和分割前的损失有没有发生变化,变化了多少)。遍历所有分割,选择变化最大的作为最合适的分割。
使用xgb : https://blog.csdn.net/sinat_35512245/article/details/79668363
学到的知识有:
1,流程:
拿到数据:pandas 读取
查看数据:data.info()
粗略特征选择或者是缺失值处理:
1,data.iloc,data.loc选择数据,
2,进行缺失值处理:sklearn.preprocessing.Imputer(missing_values=’NaN’, strategy=’mean’, axis=0, verbose=0, copy=True)
3,特征选择:
对于回归问题: f_regression, mutual_info_regression,对于分类问题: chi2, f_classif, mutual_info_classif
建立基本模型
查看特征的重要性:from xgboost import plot_importance
优化:
1,重新进行特征选择:sklearn.feature_selection
2,标签标准化:sklearn.preprocessing.LabelEncoder
调参:https://segmentfault.com/a/1190000014040317
学到的知识:
调参工具:sklearn.model_selection.GridSearchCV
1,得分函数的选择:scoring
2,一般来说需要调整的参数有:
learning_rate: 0.1
-
n_estimators: 500
-
max_depth: 5
-
min_child_weight: 1 最小叶子节点样本权重的和
-
subsample: 0.8 控制对于每棵树,随机采样的比例
-
colsample_bytree:0.8 每次生成树的时候随机选取 列数 的比例
-
gamma: 0 指定了节点分裂所需的最小损失函数下降值
-
reg_alpha: 0 权重的L1正则化项。(和Lassoregression类似)。 可以应用在很高维度的情况下,使得算法的速度更快
-
reg_lambda: 1控制XGBoost的正则化部分
参数解释:http://www.sohu.com/a/291104957_99917536
数据预处理:https://www.jianshu.com/p/88f6912fcda2
xgboost 和gbdt的区别:http://www.cnblogs.com/fujian-code/p/9018114.html
XGBOOST从原理到实战:二分类 、多分类 https://blog.csdn.net/HHTNAN/article/details/81079257