1. 使用 RMarkdown 的 child 参数,进行文档拼接。
  2. 这样拼接以后的笔记方便复习。
  3. 相关问题提交到 Issue

参考 https://github.com/lukasz-f/data-camp 整合代码。

1 notebook

附录

1.1 调参案例

The blackcellmagic extension is already loaded. To reload it, use:
  %reload_ext blackcellmagic

以上是目前默认超参数。

D:\install\miniconda\lib\site-packages\xgboost\core.py:587: FutureWarning: Series.base is deprecated and will be removed in a future version
  if getattr(data, 'base', None) is not None and \
D:\install\miniconda\lib\site-packages\xgboost\core.py:588: FutureWarning: Series.base is deprecated and will be removed in a future version
  data.base is not None and isinstance(data, np.ndarray) \
[0] train-mae:11.2447+0.085538  test-mae:11.2587+0.16325
[50]    train-mae:7.43714+0.0840341 test-mae:7.93709+0.137656
[100]   train-mae:6.99125+0.0716425 test-mae:7.91611+0.143741
Untuned rmse: 7.899204

1.1.3 learning rate

{‘eval_metric’: ‘mae’, ‘booster’: ‘gbtree’, ‘eta’: 0.05, ‘subsample’: 0.35, ‘colsample_bytree’: 0.7, ‘num_parallel_tree’: 3, ‘min_child_weight’: 40, ‘gamma’: 10, ‘max_depth’: 3, ‘silent’: 1}

eta best_mae
0 0.001 10.841469
1 0.010 8.241155
2 0.100 7.941816
3 0.200 7.941957
4 0.300 7.995030

1.1.6 subsample

subsample best_mae
0 0.10 8.181179
1 0.50 7.829253
2 0.80 7.781617
3 0.90 7.745327
4 0.95 7.747116
5 1.00 7.761571

已经降低了误差, 因此最好的超参数是

{‘eval_metric’: ‘mae’, ‘booster’: ‘gbtree’, ‘eta’: 0.1, ‘subsample’: 0.9, ‘colsample_bytree’: 0.8, ‘num_parallel_tree’: 3, ‘min_child_weight’: 40, ‘gamma’: 10, ‘max_depth’: 5, ‘silent’: 1}

1.4 偶然性导致和过拟合

偶然性导致过拟合。

假设一个二分类问题,label为0和1,特征有100维,如果有1w个样本,但其中只要10个正样本1,而这些样本的特征 f1的值为全为1,而其余9990条样本的f1特征都为0(在高维稀疏的情况下这种情况很常见)。

我们都知道在这种情况下,树模型很容易优化出一个使用f1特征作为重要分裂节点的树,因为这个结点直接能够将训练数据划分的很好,但是当测试的时候,却会发现效果很差,因为这个特征f1只是刚好偶然间跟y拟合到了这个规律,这也是我们常说的过拟合

那么这种情况下,如果采用LR的话,应该也会出现类似过拟合的情况:y = W1f1 + Wifi+….,其中 W1特别大以拟合这10个样本。为什么此时树模型就过拟合的更严重呢?

仔细想想发现,因为现在的模型普遍都会带着正则项,而 LR 等线性模型的正则项是对权重的惩罚,也就是 W1一旦过大,惩罚就会很大,进一步压缩 W1的值,使他不至于过大。但是,树模型则不一样,树模型的惩罚项通常为叶子节点数和深度等,而我们都知道,对于上面这种 case,树只需要一个节点就可以完美分割9990和10个样本,一个结点,最终产生的惩罚项极其之小。

对于稀疏变量的处理,正则化如果是通过树的深度来惩罚的话,就基本效果很差了。 这是 tree learner 和 linear learner 的差距

一般来说,图像、NLP等样本量远远小于特征数量的样本,XGBoost 都不适用。

样本量远远小于特征数量=>本身就是过拟合的特征,会出现一个特征偶然的和 y 变量拟合得很好。 那么一般来说,CTR我们现在做的 XGB 效果好,就是因为样本量很大而已。

参考文献