547. Playground Series - Season 3, Episode 13 | playground-series-s3e13
度假归来后,我非常惊喜地发现自己获得了私人排行榜的第二名!这是我第一次参加竞赛,整个过程非常精彩。我要感谢Kaggle组织了这项竞赛系列,对我们这些新手来说帮助巨大。同时也要感谢所有分享代码、解决方案和经验的人——你们给了我很多启发!
回到正题,我原本想直接分享代码,但发现代码太乱了,甚至不知道从哪开始整理。因此,我决定分享一些我使用过的技巧。
我没有在模型上花太多功夫,直接使用了XGB,并采用分层K折交叉验证进行训练。以下是我的参数:
XGBClassifier(objective = 'multi:softprob',
tree_method = 'exact',
colsample_bytree = 0.6,
gamma = 0.8,
learning_rate = 0.01,
max_depth = 6,
min_child_weight = 3,
n_estimators = 300,
subsample = 0.6)
StratifiedKFold(n_splits = 4, random_state = 42, shuffle = True)
首先,我借鉴了@sergiosaharovskiy的聚类方法,对同一类别的症状进行聚类。
然后,我组合了每一对特征,并执行了与、或、异或操作,在此过程中生成了超过6000个新特征。
我这样做的原因是考虑到不同人患相同疾病时可能会有不同的症状。例如,我感冒时不会喉咙痛但会头痛,而其他人可能完全相反,或者同时有这两种症状。此外,数据中的特征是"独热编码"格式,由于我不是医学专家,就采用了上述较为简单的方法。
接下来,我进行了特征选择。从原始特征作为初始集合开始,我添加新创建的特征,并以模型性能(MAP@3)作为标准,筛选出以下额外特征:
最后进行训练并提交结果。
这就是我全部的解决方案。在比赛期间,我还尝试了一些特征选择方法,例如Sklearn的SelectKBest和Boruta-SHAP包,但它们在当前数据集上的表现不如上述方法。此外,我最近一直在研究各种特征选择技术,非常渴望与大家讨论。如果你有任何好的建议,请务必告诉我!