685. MITSUI&CO. Commodity Prediction Challenge | mitsui-commodity-prediction-challenge
我非常兴奋能在这次比赛中获得我的首枚银牌。我相信取得这一结果的关键在于识别出那些无论 date_id 如何变化都能与目标保持稳定相关性的特征,尽管我必须承认运气也起到了重要作用。
我将数据集转换为“长格式”(如下所示),以便单个模型可以同时处理所有目标。
| date_id | feature_1 | feature_2 | … | feature_n | target | target_id |
|---|---|---|---|---|---|---|
| 0 | 0.34 | 0.57 | … | 0.23 | 0.15 | target_0 |
| 0 | 0.12 | 0.22 | … | 0.43 | 0.07 | target_1 |
| … | … | … | … | … | … | … |
我使用了简单的留出法(hold-out method)。我将 70% 的数据集(575 天)分配给验证集——这一时期比实际的公共/私有评估窗口要长得多——以确保稳健性。
我通过绘制每个 date_id 的累积相关系数来评估模型性能和特征重要性。
我非常注重相关性的稳定性。以下是三个显著的特征:
对于特定的 target_n,此特征代表其基于训练数据均值的排名(从 0 到 423)。
train_labels = pd.read_csv("train_labels.csv").set_index("date_id").fillna(0)
train_labels = train_labels.rank(axis=1)
train_length = int(len(train_labels.index) * 0.7)
mean = train_labels.head(train_length).mean()
如图所示,此特征显示出与目标持续的正相关性。
这代表目标_n Across 训练数据的标准差排名。
train_labels = pd.read_csv("train_labels.csv").set_index("date_id").fillna(0)
train_labels = train_labels.rank(axis=1)
train_length = int(len(train_labels.index) * 0.7)
std = train_labels.head(train_length).std()
虽然此特征通常显示负相关,但与“均值排名”特征相比,它显得相当不稳定。
通过将每个目标的时间序列视为向量并应用 UMAP 进行降维,目标清楚地分离为两个不同的簇。有趣的是,这些簇通常表现出 inverse 关系(当一个簇上升时,另一个簇下降)。
我使用 K-Means 的簇 ID 作为分类特征,这稍微提高了模型的性能。我怀疑可能有更复杂的方法来利用这一发现,但我未能做到。
我最终模型的预测准确率(比赛指标)如下:
验证分数保持稳定,甚至在累积趋势方面优于训练分数,表明具有良好的泛化能力。
我的方法集中在建立在时间稳定特征之上的 LightGBM 模型。虽然我发现通过聚类可以明显看出目标行为的二分法,但除了简单的分类特征外,我无法充分利用这一见解。尽管如此,专注于稳定相关性被证明在这次比赛中是成功的。