🎡 项目名称
Kaggle 游乐园比赛 - 性格预测:内向 or 外向
🔍 项目背景
这是一次来自 Kaggle Playground 系列的比赛,目标是通过个人的社交行为与心理特征预测其性格倾向:Introvert(内向)或 Extrovert(外向)。数据维度不高,但暗含复杂的行为偏好,适合作为结构化建模训练。
🎯 项目目标
构建一个稳定、准确的分类模型,预测用户性格倾向,并力求优化 F1-score,最终提升排行榜排名。同时锻炼数据预处理、特征工程、模型调参、模型融合、可解释性分析等核心技能。
🧱 数据结构
数据集共 18,524 条训练样本,特征如下:
- Time_spent_Alone
- Stage_fear
- Social_event_attendance
- Going_outside
- Drained_after_socializing
- Friends_circle_size
- Post_frequency
- Personality(目标变量)
问题特征:
- 目标变量存在类别不平衡(Introvert:Extrovert ≈ 1:3)
- 多特征存在缺失值
- 类别特征非数值型,需要编码
📍 主要建模思路
✅ Step1: 缺失值处理
- 数值型特征:使用均值填充
- 类别型特征:使用众数填充
- 简单但稳妥,避免过度拟合
✅ Step2: EDA & 类别不平衡分析
- 可视化目标变量比例,确认正负样本分布
- 各特征分布图 & KDE 曲线分析其与性格倾向的潜在关系
✅ Step3: 建立基线模型
- 使用逻辑回归、LightGBM、XGBoost 分别建模
- 评估指标统一使用 F1-score(更适合不平衡问题)
- 采用 StratifiedKFold 做交叉验证确保结果稳定
✅ Step4: 特征工程探索
- 构造新特征:如 Post_frequency * Friends_circle_size 表示社交活跃度
- 分析特征分布偏态,对高偏离特征进行对数平滑尝试(log+1)
- 使用 SHAP 分析特征重要性,进行解释和删除冗余字段
✅ Step5: 模型融合 & 阈值优化
- 融合 LightGBM + XGBoost + LR 的软投票结果
- 使用加权平均概率方式融合 LGB 和 Voting 模型
- 针对 F1-score 曲线优化分类阈值(最终为 0.40)
✅ Step6: 模型解释
- 使用 SHAP 分析高影响力变量(如 Time_spent_Alone, Drained_after_socializing)
- 利用 summary_plot 和 dependence_plot 分析变量与预测值关系
✅ Step7: 模型提交 & Leaderboard 分析
- 提交多个融合版本观察得分
- 最终得分:0.974089,排名 546/841,距离 Top 排名仅差 0.0016 分
📉 项目挑战与解决方案
❗挑战1:高比例缺失值如何处理?
- 训练集中多个特征缺失比例超过5%,尝试使用 KNN 和 MICE 多重插补,发现引入了较大噪声,提升有限。
- 最终选择基于数据分布特性,数值型特征使用
mean
,类别型使用mode
填充,确保训练稳定性。
❗挑战2:模型结果几轮都不变?
- 多轮交叉验证结果精度一致,初步以为模型已达上限。
- 实际原因是:测试集预测概率未变化,阈值未调优,且融合模型未正确加入新的预测。
- 通过排查代码中
oof_preds_voting
定义,修复后重新生成融合预测,加入 LightGBM 输出,分数上升。
❗挑战3:模型解释困难
- 初期使用 sklearn 的 feature importance 输出权重,发现排序缺乏直观解释。
- 引入 SHAP 值分析后,生成 summary_plot 可视化重要特征并标注正负方向。发现 Alone_ratio 是模型影响最大的变量! 右边(推“外向”)的点大多是蓝色。Alone_ratio 越低(即越不爱独处)→ 越可能是外向者。Outside_index、Social_score、Post_frequency 也重要 它们都体现了“社交活跃度”:
- 外出频率 × 活动频率(Outside_index)
- 朋友圈人数 × 发帖频率(Social_score)
- 红色点往右说明:值高 → 趋向外向
❗挑战4:公榜压缩效应严重
- 初期使用 sklearn 的 feature importance 输出权重,发现排序缺乏直观解释。
- 引入 SHAP 值分析后,生成 summary_plot 可视化重要特征并标注正负方向。发现 Alone_ratio 是模型影响最大的变量! 右边(推“外向”)的点大多是蓝色。Alone_ratio 越低(即越不爱独处)→ 越可能是外向者。Outside_index、Social_score、Post_frequency 也重要 它们都体现了“社交活跃度”:
- 外出频率 × 活动频率(Outside_index)
- 朋友圈人数 × 发帖频率(Social_score)
- 红色点往右说明:值高 → 趋向外向
- 同时对
Drained_after_socializing
使用 dependence_plot,发现其与 Post_frequency 存在一定交互。
📈 最终结果
- CV F1-score:0.9788
- Kaggle 公榜得分:0.974089
- 排名:546 / 841
- 提升策略:模型融合 + 阈值优化 + 特征构造 + SHAP可解释性分析
📚 项目收获
- 理解结构化建模任务的完整流程
- 掌握 F1-score 指标优化思路
- 熟悉 LightGBM/XGBoost/VotingClassifier 的融合方式
- 掌握 SHAP 分析的实际使用和解释方法
- 感受到实际项目中千分之一级别的精度优化与调参策略的重要性
📌 后续展望
- 计划将此项目整理为可复用的建模模板
- 将项目思路迁移应用到企业用户行为预测或市场分析任务中
- 继续提升在特征交叉、自动特征构造、模型解释方向的能力