619. Playground Series - Season 4, Episode 7 | playground-series-s4e7
代码 Notebook: https://www.kaggle.com/code/ravaghi/insurance-cross-selling-6th-place-solution
我使用了原始数据集以及竞赛数据集来训练所有模型。我改变了数据类型以减少内存使用,使用简单的映射将分类特征转换为数值,并添加了以下特征,这些特征我借鉴自这个 Notebook。
dataframe['Previously_Insured_Annual_Premium'] = pd.factorize(dataframe['Previously_Insured'].astype(str) + dataframe['Annual_Premium'].astype(str))[0]
dataframe['Previously_Insured_Vehicle_Age'] = pd.factorize(dataframe['Previously_Insured'].astype(str) + dataframe['Vehicle_Age'].astype(str))[0]
dataframe['Previously_Insured_Vehicle_Damage'] = pd.factorize(dataframe['Previously_Insured'].astype(str) + dataframe['Vehicle_Damage'].astype(str))[0]
dataframe['Previously_Insured_Vintage'] = pd.factorize(dataframe['Previously_Insured'].astype(str) + dataframe['Vintage'].astype(str))[0]
起初我犹豫是否使用这些特征,因为它们具有泄露性质,但它们改善了我的交叉验证 (CV) 和公共 leaderboard (LB) 分数,所以我决定保留它们。
我的集成中使用了以下模型:
我保存了每个模型的 OOF 预测和测试预测,并在集成中使用了生成的文件。请注意,提供的 Notebook 中没有我使用的确切超参数集,但其余代码与我最终模型使用的代码相同。
对于 CatBoost 和逻辑回归,我将所有特征视为分类特征。对于神经网络,我对一些特征进行了独热编码 (one-hot encoded),并对其中一个特征进行了目标编码 (target encoded),建议见此处。
我使用了一个简单的 StackingClassifier 作为我的集成技术。为了节省时间并防止 StackingClassifier 从头开始训练每个模型,我使用了在上一次竞赛中学到的这个技巧。我对基础模型的 OOF 预测进行了对数变换,并将其输入模型。
默认情况下,StackingClassifier 使用 LogisticRegression 作为其最终估计器。我尝试调整 LogisticRegression,但没有帮助。我也尝试了调整后的 XGBClassifier 和 LGBMClassifier,但它们也没有帮助,所以我决定坚持使用默认设置。
我将 @paddykb 的保险矩阵漏洞技巧 (the glitch in the insurance matrix trick) 应用到了我的测试预测中,并将我的分数提高了约 0.0006,这与 @paddykb 报告的改进相同。
以下是我在 5 折交叉验证中训练的每个模型的 CV 分数。