533. Playground Series - Season 3, Episode 5 | playground-series-s3e5
比赛结束!非常惊讶能在榜单震动中幸存下来。
正如我在之前的讨论帖中暗示的那样,一个简单的集成策略在公共排行榜上取得了很高的名次,现在看来这个策略在私人排行榜上也取得了很高的名次 ;).
我使用了以下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周边 :).