乐于分享
好东西不私藏

[AI量化] Day 10 | LightGBM 组合实验

[AI量化] Day 10 | LightGBM 组合实验
今天继续 LightGBM 参数调优。Day 09 单参数实验只考察了一个参数变化的影响,今天升级到多参数组合,用正交实验设计同时考察 4 个参数的搭配效果。

正交实验设计

单参数调优的局限在于:参数之间可能存在交互作用。A 参数的最优值可能取决于 B 参数的取值。单独调优 A 找到的最佳值,在与 B 组合时未必最优。

4 参数 × 3 水平 = 81 种组合。全跑一遍太耗时。正交实验设计用数学方法挑出代表性组合,9 次实验覆盖 80% 的信息量。

正交表 L9(3^4):┌────────┬───────┬───────┬────────┬─────────┐│ 实验号 │ lr    │ depth │ leaves │ colsample│├────────┼───────┼───────┼────────┼─────────┤│ 32     │ 0.01  │ 8     │ 64     │ 0.7     ││ 33     │ 0.01  │ 10    │ 128    │ 0.9     ││ 34     │ 0.01  │ 12    │ 256    │ 1.0     ││ 35     │ 0.05  │ 8     │ 128    │ 0.7     ││ 36     │ 0.05  │ 10    │ 64     │ 0.9     ││ 37     │ 0.05  │ 12    │ 256    │ 1.0     ││ 38     │ 0.1   │ 8     │ 256    │ 0.9     ││ 39     │ 0.1   │ 10    │ 64     │ 0.7     ││ 40     │ 0.1   │ 12    │ 128    │ 1.0     │└────────┴───────┴───────┴────────┴─────────┘

正交性保证:每个参数的每个水平都均匀出现 3 次。

代码实践

import qlibfrom qlib.constant import REG_CNfrom qlib.utils import init_instance_by_configfrom qlib.workflow import Rimport pandas as pdimport numpy as npimport matplotlib.pyplot as pltimport seaborn as snsimport warningswarnings.filterwarnings('ignore')provider_uri = "/Users/tian/Documents/aicoding/qlib/a_ty_study/data/qlib_data/cn_data"qlib.init(provider_uri=provider_uri, region=REG_CN)# 定义正交实验配置orthogonal_config = [# (exp_id, lr, depth, leaves, colsample)    (320.018640.7),    (330.01101280.9),    (340.01122561.0),    (350.0581280.7),    (360.0510640.9),    (370.05122561.0),    (380.182560.9),    (390.110640.7),    (400.1121281.0),]all_results = []for exp_id, lr, depth, leaves, colsample in orthogonal_config:    result = run_orthogonal_experiment(exp_id, lr, depth, leaves, colsample)    all_results.append(result)

运行 9 个实验的结果:

================================================================================正交实验结果汇总================================================================================ exp_id   lr  depth  leaves  colsample       IC     ICIR      time     32 0.01      8      64        0.7 0.019458 1.945782 36.842383     33 0.01     10     128        0.9 0.020539 2.053870 39.038554     34 0.01     12     256        1.0 0.031221 3.122106 42.592270     35 0.05      8     128        0.7 0.013548 1.354798 36.251076     36 0.05     10      64        0.9 0.014608 1.460768 35.779799     37 0.05     12     256        1.0 0.030694 3.069372 43.520219     38 0.10      8     256        0.9 0.014347 1.434726 36.148463     39 0.10     10      64        0.7 0.005809 0.580874 34.288053     40 0.10     12     128        1.0 0.034153 3.415315 35.755852================================================================================

排名前三:

排名
实验号
IC
ICIR
lr
depth
leaves
colsample
1
40
0.0342
3.42
0.1
12
128
1.0
2
34
0.0312
3.12
0.01
12
256
1.0
3
37
0.0307
3.07
0.05
12
256
1.0

实验 40 胜出:IC=0.0342, ICIR=3.42。

参数敏感性排序(差异越大越敏感):

colsample: 0.0191  ← 最敏感depth:     0.0184leaves:    0.0121lr:        0.0056  ← 最不敏感

参数效应分析结果:

lr:  0.01: IC=0.0237  0.05: IC=0.0196  0.1:  IC=0.0181depth:  8:  IC=0.0158  10: IC=0.0137  12: IC=0.0320  ← depth=12 明显更好leaves:  64:  IC=0.0133  128: IC=0.0227  256: IC=0.0254colsample:  0.7: IC=0.0129  0.9: IC=0.0165  1.0: IC=0.0320  ← 全量特征明显更好

热力图:

参数效应曲线:

交叉验证

找到最佳配置后,需要验证这个配置在不同时间段是否稳定。训练数据用 2010-2014,测试三个时间段:2015-2016、2017-2019、2019-2020。

时间序列交叉验证的关键:只能用"前向"验证,用历史预测未来是正确做法,用未来预测历史是作弊。

# 最佳配置best_config = {'learning_rate'0.1,'max_depth'12,'num_leaves'128,'colsample_bytree'1.0}# 三个验证时间段cv_segments = [    (41'2015-2016''2010-01-01''2014-12-31''2015-01-01''2016-12-31'),    (42'2017-2019''2012-01-01''2016-12-31''2017-01-01''2019-12-31'),    (43'2019-2020''2014-01-01''2018-12-31''2019-01-01''2020-08-01'),]

三个时间段全部通过稳定性检验:

================================================================================稳定性评估================================================================================   period       IC     ICIR  win_rate  IC_ok  ICIR_ok  overall_pass2015-2016 0.034153 3.415315       0.6   True     True          True2017-2019 0.051228 5.122806       0.6   True     True          True2019-2020 0.035737 3.573745       0.6   True     True          True================================================================================通过统计================================================================================IC > 0.02 通过: 3/3ICIR > 0.5 通过: 3/3整体通过: 3/3================================================================================

跨时间段表现:

IC 范围: 0.0342 ~ 0.0512IC 均值: 0.0404ICIR 范围: 3.4153 ~ 5.1228ICIR 均值: 4.0373

可视化结果:

今日收获

正交实验 vs 网格搜索:81 种组合 → 9 种代表组合,效率提升 8 倍,覆盖度约 80%。适合初期快速探索参数空间。

参数敏感性发现:colsample_bytree 最敏感,其次是 depth。lr 相对不敏感,但太小会欠拟合(lr=0.01),太大不稳定(lr=0.5)。

训练数据时间长度的影响:Day 09 用 6 年训练数据(2008-2014),今天用 4 年(2010-2014)。数据少的时候需要更复杂的模型(depth=12, leaves=256)来弥补,数据多的时候可以用更保守的配置。

最佳配置:lr=0.1, depth=12, leaves=128, colsample=1.0。这个配置在 3 个时间段都稳定有效,ICIR 均值 4.04,属于优秀水平(>1.0 为优秀)。

进度:10/70