众多里最好的多半是运气
GridSearchCV 会尝试网格上的每个设置,用交叉验证给每个打分,并保留最好的。对金融数据,折必须沿时间向前:TimeSeriesSplit(5) 用过去训练,在随后的块上验证,共五次。评分可以用 AUC(scoring='roc_auc')。在管道中,设置用步骤名、两个下划线和参数名来指定:'logit__C'。搜索之后,best_params_ 保存获胜者,cv_results_['mean_test_score'] 保存每个网格点的得分,默认 refit=True 时,搜索对象本身用在全部所给数据上重新拟合的最佳模型来预测。设置很少且得分平滑时,最佳验证得分只是轻微高估。在我们的 60 列收益率上,C 网格给出的 AUC 为 0.512、0.500、0.504:调参没有改变任何东西,因为本来就没什么可找的。
危险随候选数量增加而增大。抽取 n 个真实能力为零的模型,它们的验证得分以标准差 σ 散布在均值周围,最好的那个高于均值约 σ((1-γ)Φ⁻¹(1-1/n)+γΦ⁻¹(1-1/ne)),其中 γ=0.5772 是欧拉常数,Φ⁻¹ 是正态分位数。试 12 个各用 60 列中三列的随机模型:最好的验证 AUC 为 0.523,仅凭运气预测为 0.523。把获胜者在训练行上重新拟合,并在它从未见过的后 30% 的日子上打分:AUC 为 0.478,低于抛硬币。这就是赢家的诅咒。防御办法是一个任何搜索都不触碰的最终留出集、更少的候选,以及清醒地看这个公式已经解释了多少最佳得分。
- 沿时间向前:对时间序列,搜索中用
TimeSeriesSplit,不要用打乱的折。 - n 个里最好的,即使什么都不管用,也会高出均值约 σ Φ⁻¹(1-1/n)。
- 保留一个任何搜索都不碰的最终留出集,并报告其得分而非验证得分。
实验:评分内容
- 管道5 分
- 网格搜索20 分
- 验证得分10 分
- 许多小模型20 分
- 运气带来的期望最佳值10 分
- 赢家的诅咒15 分
- 研究20 分