360. 2019 Data Science Bowl | data-science-bowl-2019
首先,我要感谢 Booz Allen Hamilton 和 Kaggle 主办了如此有趣的比赛!在比赛结束前的9天里,我从大约第800名上升到了第50名,而在比赛的最后一天,我又从大约第80名上升到了第23名。所以这一周对我来说非常激动人心。
我的解决方案非常简单。总结如下:
我简要介绍一下我解决方案的关键点。
许多内核使用了 get_data 函数来顺序处理用户行为数据。但我认为这个函数让我很难制作和管理特征。所以我采用了一种新的方法来制作训练集。让我展示一下。首先,对于每个游戏会话,我分配了一个编号,表示用户在该游戏会话之前尝试过的评估次数。下面是一个例子。
train_gs_assess_dict = {}
for ins_id, user_sample in tqdm(train.groupby('installation_id')):
assess_count = 0
for gs, session in user_sample.groupby('game_session', sort=False):
if session['type'].iloc[0] == 'Assessment':
assess_count += 1
train_gs_assess_dict[gs] = assess_count
train['assess_count'] = train['game_session'].map(train_gs_assess_dict)
然后,我计算了评估之前用户活动子集的聚合特征。创建训练集和测试集的持续时间比内核的方法要长,但这使得特征的实现和管理变得非常容易。
我在第一层创建了8个模型。
| 模型 | 类型 | 目标 | 评估指标 | 与准确率组的相关性 | Kendall's Tau |
|---|---|---|---|---|---|
| LightGBM | gbdt | accuracy group | rmse | 0.621 | 0.460 |
| LightGBM | goss | accuracy group | rmse | 0.568 | 0.433 |
| LightGBM | dart | accuracy group | rmse | 0.619 | 0.459 |
| LightGBM | gbdt | accuracy | rmse | 0.615 | 0.457 |
| LightGBM | gbdt | accuracy group>2 | auc | 0.598 | 0.452 |
| LightGBM | gbdt | accuracy group>1 | auc | 0.615 | 0.456 |
| LightGBM | gbdt | accuracy group>0 | auc | 0.597 | 0.441 |
| NN | - | accuracy group | rmse | 0.600 | 0.444 |
我使用了岭回归进行堆叠。