感谢组织者举办这场有趣的比赛,也感谢所有参与者的讨论!我认为有很多宝贵的知识可以学习和改进!
管道流程
我在比赛开始时构建了一个管道来进行交叉验证和测试不同方法。该管道依次使用每一年可用数据(2019年、2020年和2021年)作为验证集,而其他年份则用于训练。最后,使用全部数据进行训练并预测2022年的排放量。
具体细节请参考源代码。
使用PCA
我的解决方案的核心是使用PCA。我决定使用6个主成分,这是我在ambrosm的讨论帖中提到的。每个主成分都由某个(抽象)算法独立处理,然后将结果通过PCA逆变换得到最终预测。
算法
我使用的每种算法都有一个基础估计器作为参数,用于进行预测。这种架构使得在不同算法之间切换并优化交叉验证分数成为可能。
✓ PCA1算法
这个算法非常简单:它只处理`emission`数据,并使用估计器进行预测。许多讨论中都提到所有其他列都是不必要的,这是对该想法的实现。
✓ PCA2算法
这个算法有所不同:它使用所有列。PCA被分别应用于每一列,即我们拥有`列数` * `PCA组件数`个输入特征。
✓ PCA_SARIMA算法
在PCA1算法架构中,我使用了6个独立的SARIMA模型代替简单估计器。
最佳算法(本地CV和私有排行榜)是PCA2算法。
估计器
我使用了Ridge/Lasso回归、随机森林、XGBoost、CatBoost等。树基估计器之间差异不大,但它们比线性回归效果更好。因此我选择了XGBRegressor(n_estimators = 300, max_depth = 4, learning_rate = 0.01, subsample = 0.5)。
后处理
我受到ambrosm的帖子和其它讨论的启发,这些讨论建议将结果乘以一个常数。因此,我使用不同的乘数进行预测:1.00、0.95、1.05、1.07和1.08。
然而,不知何故,我选择了这五个提交中最差的一个作为最终预测!
如果完全不使用乘数,这将是第一名!