泰坦尼克号生存预测:从数据清洗到模型优化的完整指南 1. 项目背景与核心目标泰坦尼克号生存预测是机器学习领域最经典的入门项目之一它基于1912年泰坦尼克号沉船事件中的乘客数据要求我们构建模型预测每位乘客的生存概率。这个项目之所以成为机器学习教学的Hello World是因为它完美涵盖了数据科学项目的完整流程数据获取与清洗缺失值/异常值处理探索性数据分析EDA特征工程特征提取/转换/选择模型选择与训练模型评估与优化提示虽然数据集规模不大约891条训练数据但特征维度丰富12个原始特征非常适合练习特征工程技巧。2. 数据理解与预处理2.1 数据集字段解析原始数据包含以下关键特征字段名类型说明缺失比例PassengerIdint乘客ID0%Survivedint生存标签0否1是0%Pclassint舱位等级1/2/30%Namestring乘客姓名0%Sexstring性别0%Agefloat年龄19.87%SibSpint同船兄弟姐妹/配偶数量0%Parchint同船父母/子女数量0%Ticketstring船票编号0%Farefloat船票价格0%Cabinstring船舱编号77.10%Embarkedstring登船港口C/Q/S0.22%2.2 数据清洗实战缺失值处理方案Age采用Title性别Pclass分组中位数填充# 从Name提取TitleMr/Miss/Mrs等 df[Title] df.Name.str.extract( ([A-Za-z])\., expandFalse) # 按分组计算中位数 age_median df.groupby([Title,Sex,Pclass])[Age].median() # 填充缺失值 df[Age] df.apply(lambda x: age_median[x[Title],x[Sex],x[Pclass]] if pd.isnull(x[Age]) else x[Age], axis1)Cabin由于缺失率过高直接删除该列但先提取首字母作为新特征df[Cabin_Letter] df[Cabin].str[0] # 提取船舱首字母 df df.drop(Cabin, axis1)Embarked仅2条缺失用众数填充df[Embarked].fillna(df[Embarked].mode()[0], inplaceTrue)3. 特征工程深度解析3.1 特征构造技巧姓名特征挖掘提取称呼Title反映社会地位title_mapping { Capt: Officer, Col: Officer, Major: Officer, Dr: Officer, Rev: Officer, Jonkheer: Royalty, Don: Royalty, Sir: Royalty, Lady: Royalty, Countess: Royalty, Dona: Royalty, Mme: Mrs, Ms: Mrs, Mrs: Mrs, Miss: Miss, Mlle: Miss, Master: Master, Mr: Mr } df[Title] df[Title].map(title_mapping)家庭特征组合家庭规模 SibSp Parch 1是否独自旅行 (家庭规模 1)df[FamilySize] df[SibSp] df[Parch] 1 df[IsAlone] (df[FamilySize] 1).astype(int)票价特征优化人均票价 Fare / FamilySizedf[FarePerPerson] df[Fare] / df[FamilySize]3.2 特征编码方案有序类别特征Pclass直接保留数值名义类别特征Sex/Embarked/Title使用独热编码df pd.get_dummies(df, columns[Sex,Embarked,Title], drop_firstTrue)连续特征Age/Fare分箱处理df[AgeBin] pd.qcut(df[Age], q5, labelsFalse) df[FareBin] pd.qcut(df[Fare], q4, labelsFalse)4. 模型构建与优化4.1 基准模型对比我们测试5种经典算法使用5折交叉验证模型平均准确率训练时间(s)Logistic回归0.8210.12随机森林0.8300.45梯度提升树(XGBoost)0.8360.78SVM(rbf核)0.8281.23KNN(k5)0.7980.34注意XGBoost表现最佳但随机森林与之接近且训练更快适合作为基线模型。4.2 随机森林调优实战from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import GridSearchCV param_grid { n_estimators: [100, 200, 300], max_depth: [3, 5, 7, None], min_samples_split: [2, 5, 10], min_samples_leaf: [1, 2, 4] } rf RandomForestClassifier(random_state42) grid_search GridSearchCV(rf, param_grid, cv5, scoringaccuracy, n_jobs-1) grid_search.fit(X_train, y_train) print(f最佳参数{grid_search.best_params_}) print(f最佳得分{grid_search.best_score_:.3f})调优后特征重要性分析Age 0.214 Fare 0.183 Sex_male 0.162 Pclass 0.141 IsAlone 0.089 FamilySize 0.072 Embarked_Q 0.058 Embarked_S 0.051 Title_Mr 0.048 SibSp 0.0425. 项目进阶技巧5.1 集成模型方案结合XGBoost和随机森林的Stacking集成from sklearn.ensemble import StackingClassifier from xgboost import XGBClassifier base_models [ (rf, RandomForestClassifier(n_estimators200, max_depth5, random_state42)), (xgb, XGBClassifier(n_estimators100, learning_rate0.1, random_state42)) ] stacking StackingClassifier( estimatorsbase_models, final_estimatorLogisticRegression(), cv5 ) stacking.fit(X_train, y_train)5.2 常见问题排查准确率卡在0.78-0.82无法提升检查特征相关性删除冗余特征如同时存在FamilySize和SibSpParch尝试非线性特征组合如Age*Pclass过拟合问题增加早停机制early_stopping_rounds添加正则化参数XGBoost的reg_alpha/reg_lambda类别不平衡处理使用class_weight参数sklearn或scale_pos_weightXGBoost尝试过采样SMOTE或欠采样6. 项目扩展方向模型解释性增强使用SHAP值分析个体预测import shap explainer shap.TreeExplainer(model) shap_values explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test)部署为Web应用使用Flask构建预测API前端展示预测结果和特征影响数据增强实验生成合成数据使用CTGAN等生成模型半监督学习利用测试集数据这个项目最值得关注的是特征工程环节——好的特征设计往往比模型选择影响更大。在实际操作中我通常会先花70%时间在EDA和特征工程上这比盲目调参效果提升更明显。另外建议保存每个版本的预处理流水线使用sklearn Pipeline方便后续复现和部署。