数据科学

特级大师专业提示:使用 cuML 通过堆叠夺得 Kaggle 竞赛冠军

 

堆叠概述

堆叠是一种先进的表格数据建模技术,通过结合多个不同模型的预测来实现高性能。利用 GPU 的计算速度,可以高效地训练大量模型。其中包括梯度提升决策树 (Gradient Boosted Decision Trees, GBDT) 、深度学习神经网络 (Deep Learning Neural Networks, NN) 以及其他机器学习 (Machine Learning, ML) 模型,例如支持向量回归 (Support Vector Regression, SVR) 和 K 最近邻 (K-Nearest Neighbors, KNN) 。这些单独的模型被称为 Level 1 模型。

然后训练 Level 2 模型,这些模型使用 Level 1 模型的输出作为输入。Level 2 模型学习使用 Level 1 模型的不同组合来预测不同场景中的目标。最后,训练简单的 Level 3 模型,对 Level 2 模型的输出求平均值。此过程的结果是三级堆栈。

 

Image shows three levels of models used sequentially to get the final accuracy score. Level 1 has 12 diverse models. Level 2 uses the previous level as input and Level 3 averages the two models in Level 2 to get the final winning model.

不同的目标预测方法

不同的模型通过不同的方式解决问题来构建。可以使用不同类型的模型以及不同的架构和超参数。还可以使用不同的预处理方法和特征工程。

 

ALT text: Image shows a scatter plot of feature Episode_Length_minutes and target Listening_Time_minutes. There is a strong linear relationship where the target is approximately equal to 0.72 multiplied by the feature. The image also illustrates that the residual is defined as the difference between scatter plot points and the linear regression line in the y axis direction.

根据图 2 中描述的见解,您至少可以通过以下四种方式预测目标:

  • 按原样预测 TARGET
  • 预测目标比率除以 episode length 分钟数
  • 根据线性关系预测 RESIDUAL
  • 预测 MISSING episode_length_minutes

这四种方法都有两种情况:

  • 88% 的行具有 episode length 分钟
  • 12% 的行缺少 episode length 分钟

预测目标

构建模型的常用方法是使用给定的目标。您可以从 10 个给定特征列中设计其他特征列,然后使用所有这些特征训练模型以预测给定目标:

model = Regressor().fit(train[FEATURES],train['Listening_Time_minutes'])
PREDICTION = model.predict(train[FEATURES])

仅使用这种方法就赢得了 2025 年 2 月 Kaggle Playground 竞赛的第一名。有关更多详细信息,请参阅 Grandmaster 专业提示:使用 cuDF pandas 凭借特征工程在 Kaggle 比赛中获得第一名

预测比率

预测给定目标的替代方案是预测目标与特征 Episode_Length_minutes 之间的比率:

train['new_target'] = train.Listening_Time_minutes / train.Episode_Length_minutes

您可以训练模型来预测这个新目标。然后将该预测值乘以 Listening_Time_minutes0 或 Episode_Length_minutes 的估算值。

预测残差

预测给定目标的另一个替代方案是预测目标与 Linear Regression 模型之间的残差。首先,训练和推理 Linear Regression 模型。然后,通过从预测 Linear Regression 模型中减去现有目标来创建新目标:

model = LinearRegressor().fit(train[FEATURES],train['Listening_Time_minutes'])
LINEAR_REGRESSION_PREDS = model.predict(train[FEATURES])
train['new_target'] = train.Listening_Time_minutes - LINEAR_REGRESSION_PREDS

您可以训练模型来预测这个新目标。然后,将该预测添加到线性回归预测中。

预测缺失特征

特征 Episode_Length_minutes 是最重要的特征,但在 12% 的训练行中缺失。您可以构建单独的模型来预测此特征。此外,您可以在存在 Episode_Length_minutes 的位置使用训练数据和测试数据的所有行来训练模型:

combined = cudf.concat([train,test],axis=0)
model = Regressor().fit(combined[FEATURES], combined['Episode_Length_minutes'])
Episode_Length_minutes_IMPUTED = model.predict(train[FEATURES])

预测 Episode_Length_minutes 后,您至少可以通过三种方式使用它来预测实际目标,包括:

  • 使用 Episode_Length_minutes 估算缺失值,然后训练模型
  • 替换 Episode_Length_minutes 的整列,然后训练模型
  • 将预测的 Episode_Length_minutes 与预测比率相乘

预测伪标签

前几节展示了一种使用测试数据特征列帮助估算训练数据中缺失值的方法。这是一种从测试列中提取信息的强大技术。在现实世界中处理其他未标记数据时,它非常有用。使用测试列的另一种方法是使用伪标记。

伪标记(Pseudo labeling)过程分为三步:

  • 照常训练模型
  • 测试数据的推理标签
  • 将伪标记测试数据与我们的训练数据连接起来,然后训练另一个模型

以下代码是一个简单示例。请注意,如果您使用 K-Fold 或 Nested K-Fold,则可以更好地泛化并避免泄漏。

0.72 x Episode_Length_minutes0

构建堆栈

在使用 GBDT、NN、ML 以及之前提到的各种技术构建了数百个不同的模型之后,下一步就是构建堆栈。使用前向特征选择,可将 Level 1 模型的 out-of-fold (OOF) 预测添加为 Level 2 模型的特征。此外,还可以包括原始数据集中的其他特征,以及从 OOF 预测衍生的工程特征,例如模型置信度或平均预测:

df['confidence'] = df[OOF].std(axis=1)
df['concensus'] = df[OOF].mean(axis=1)

对于多样性,最好训练多个 Level 2 模型。一个不错的选择是 GBDT Level 2 模型和 NN Level 2 模型。对于 Level 3,执行 Level 2 预测的加权平均值。结果是最终预测。

使用先进的堆栈技术实现了 CV 验证指标 RMSE = 11.54 和私有排行榜 RMSE = 11.44。这在 2025 年 4 月举办的预测播客收听时间的 Kaggle Playground 竞赛中获得了第一名。

总结

cuML 现在支持您以 GPU 速度创建所有统计 ML 模型。您可以使用 GPU 构建 GBDT,使用 GPU 构建 NN,现在使用 GPU 构建 cuML。通过快速创建许多不同的模型,您可以构建堆栈等高级表格数据解决方案。

快速实验有助于找到更准确的解决方案。cuML 堆栈在 2025 年 4 月举办的预测播客收听时间的 Kaggle Playground 竞赛中获得第一名,证明了这一点。有关参赛作品的更多详细信息,请参阅第一名 – RAPIDS cuML Stack – 3 个级别

 

 

标签