返回列表

Third place solution: mode ensemble of 6 public notebooks.

533. Playground Series - Season 3, Episode 5 | playground-series-s3e5

开始: 2023-01-31 结束: 2023-02-13 数据算法赛
第三名方案:6个公共Notebook的众数集成

第三名方案:6个公共Notebook的众数集成

作者: Gilles Vandewiele
比赛排名: 第3名

比赛结束!非常惊讶能在榜单震动中幸存下来。

正如我在之前的讨论帖中暗示的那样,一个简单的集成策略在公共排行榜上取得了很高的名次,现在看来这个策略在私人排行榜上也取得了很高的名次 ;).

我使用了以下Notebook:

然后我对这些提交结果使用了简单的加权众数,其中我将第6个Notebook的结果在列表中添加了两次(即给予双倍权重)。代码如下,我也发布了一个包含此代码的Notebook(尽管由于版本不匹配,LB分数略有不同)

import pandas as pd
import numpy as np
import glob
from sklearn.utils.extmath import weighted_mode

subs = []
for i, file in enumerate(sorted(glob.glob('subs/*'))):
    sub_df = pd.read_csv(file)
    print(sub_df.head(5))
    sub_df = sub_df.rename(columns={'quality': f'quality_{i}', 'id': 'Id'})
    sub_df = sub_df.sort_values('Id')
    sub_df = sub_df.set_index('Id', drop=True)
    subs.append(sub_df)
    
# 将 sub6.csv 再次添加到列表中以获得双倍权重
dup_sub = subs[5]
dup_sub = dup_sub.rename(columns={'quality_5': 'quality_6'})
subs.append(dup_sub)

all_sub_df = pd.concat(subs, axis=1)

# 手动设置这些类别的权重,乘以计数中的小 epsilon
class_weights = {
    3: 1.01,
    4: 1.03,
    5: 1.06,
    6: 1.05,
    7: 1.04, 
    8: 1.02
}

def my_weighted_mode(x):
    values = x.values
    weights = [class_weights[i] for i in values]
    
    return weighted_mode(values, weights)[0][0]

sub = subs[0].copy()
sub = sub.drop(columns=['quality_0'])
sub['quality'] = all_sub_df[[f'quality_{i}' for i in range(len(subs))]].apply(my_weighted_mode, axis=1).astype(int)
sub

事实证明,这里的加权众数可能有点大材小用了,使用 scipy.stats.mode 也能得到相同的结果。

我选择了私人排行榜上得分第二高的提交作为我的最终提交之一。如果我选了另一个,我可能会拿到第一名,但这总是事后诸葛亮!我很高兴能进入前三名并获得一份独家的Kaggle周边 :).

同比赛其他方案