返回列表

Using pseudo labels to predict fitness / overfitting

530. Playground Series Season 3, Episode 3 | playground-series-s3e3

开始: 2023-01-17 结束: 2023-01-23 用户画像与运营 数据算法赛
使用伪标签预测适应度/过拟合

使用伪标签预测适应度/过拟合

作者: @kaggleqrdl
发布时间: 2023-01-19

我想分享一种我正在研究的技术。它可以用于本次比赛,实际上也可以用于每一场比赛,特别是当 CV(交叉验证)分数与 LB(排行榜)分数不可靠 时。请注意,我们在 Playground 比赛中遇到的 20% 数据量的排行榜可能会出现这种情况。

这个想法是使用预测标签将分数反向映射回训练集,以此来衡量模型的适应度。

我在这里的 Novozymes 比赛中尝试过,并取得了一些成功(警告,长帖) - https://www.kaggle.com/competitions/novozymes-enzyme-stability-prediction/discussion/378527

我也在上一次 Playground 比赛中尝试过,发现了一些成功之处。对于我从公开笔记本中提取的一些提交文件,我在训练集分数与私有 LB 分数之间获得了完美的 Spearman/秩相关性。

但关键的是,当我给获胜的提交文件打分时,我在训练集上得到了 "0.9023200244502575" 的 ROC AUC,这比我尝试过的所有其他提交都要高。大家可能已经知道,那份提交在公共 LB 上仅得分 "0.87945"。

如果你想自己尝试,代码如下 -

test = pd.read_csv("/kaggle/input/playground-series-s3e2/test.csv")
train = pd.read_csv("/kaggle/input/playground-series-s3e2/train.csv")
sub =pd.read_csv("/kaggle/input/winpg1/submisson_16.csv") #<- 获胜的提交
traind = pd.get_dummies(train)
test['stroke'] = sub['stroke']
import xgboost
testd = pd.get_dummies(test)
model = xgboost.XGBRegressor()
X = testd.drop(["id", 'stroke'], axis=1)
model.fit(X, testd['stroke'])
import sklearn.metrics
sklearn.metrics.roc_auc_score(traind['stroke'], model.predict(traind.drop(["id", "stroke"], axis=1)))
0.9023200244502575

我已将该获胜提交的副本附在此帖中。

我怀疑这种方法可以广泛用于所有 Kaggle 比赛中选择最终提交候选,实际上也可以用作在任何情况下衡量过拟合/适应度本身的一种方式(当然,需要一些调整 :)

在代码竞赛中,那里的想法可能是使用 OOF(袋外)标签预测折叠内标签,并以此方式交叉验证你的分数。

如果有时间,我会回顾一些发生过排名震荡的比赛,看看这是否本可以使用。我的猜测是,它可能在一定程度上依赖于相对较好的准确性分数。即,如果没有准确性,结果可能会更嘈杂,用处更小。

看看这是否也可以用于训练也会很有趣,例如,不仅基于验证损失,还基于某种半监督学习的连贯性来选择 epoch / 前向特征选择 / 爬山法。

需要明确的是,我在这里并不是建议使用伪标签进行训练。那对某些事情有效,但也经常导致过拟合。你仍然需要一套引人注目的基础模型。

同比赛其他方案