news 2026/9/10 10:38:03

泰坦尼克号生存预测:从数据清洗到模型优化的完整指南

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
泰坦尼克号生存预测:从数据清洗到模型优化的完整指南

1. 项目背景与核心目标

泰坦尼克号生存预测是机器学习领域最经典的入门项目之一,它基于1912年泰坦尼克号沉船事件中的乘客数据,要求我们构建模型预测每位乘客的生存概率。这个项目之所以成为机器学习教学的"Hello World",是因为它完美涵盖了数据科学项目的完整流程:

  • 数据获取与清洗(缺失值/异常值处理)
  • 探索性数据分析(EDA)
  • 特征工程(特征提取/转换/选择)
  • 模型选择与训练
  • 模型评估与优化

提示:虽然数据集规模不大(约891条训练数据),但特征维度丰富(12个原始特征),非常适合练习特征工程技巧。

2. 数据理解与预处理

2.1 数据集字段解析

原始数据包含以下关键特征:

字段名类型说明缺失比例
PassengerIdint乘客ID0%
Survivedint生存标签(0=否,1=是)0%
Pclassint舱位等级(1/2/3)0%
Namestring乘客姓名0%
Sexstring性别0%
Agefloat年龄19.87%
SibSpint同船兄弟姐妹/配偶数量0%
Parchint同船父母/子女数量0%
Ticketstring船票编号0%
Farefloat船票价格0%
Cabinstring船舱编号77.10%
Embarkedstring登船港口(C/Q/S)0.22%

2.2 数据清洗实战

缺失值处理方案:

  1. Age:采用"Title+性别+Pclass"分组中位数填充

    # 从Name提取Title(Mr/Miss/Mrs等) df['Title'] = df.Name.str.extract(' ([A-Za-z]+)\.', expand=False) # 按分组计算中位数 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'], axis=1)
  2. Cabin:由于缺失率过高,直接删除该列,但先提取首字母作为新特征

    df['Cabin_Letter'] = df['Cabin'].str[0] # 提取船舱首字母 df = df.drop('Cabin', axis=1)
  3. Embarked:仅2条缺失,用众数填充

    df['Embarked'].fillna(df['Embarked'].mode()[0], inplace=True)

3. 特征工程深度解析

3.1 特征构造技巧

  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)
  2. 家庭特征组合

    • 家庭规模 = SibSp + Parch + 1
    • 是否独自旅行 = (家庭规模 == 1)
    df['FamilySize'] = df['SibSp'] + df['Parch'] + 1 df['IsAlone'] = (df['FamilySize'] == 1).astype(int)
  3. 票价特征优化

    • 人均票价 = Fare / FamilySize
    df['FarePerPerson'] = df['Fare'] / df['FamilySize']

3.2 特征编码方案

  1. 有序类别特征(Pclass)直接保留数值

  2. 名义类别特征(Sex/Embarked/Title)使用独热编码:

    df = pd.get_dummies(df, columns=['Sex','Embarked','Title'], drop_first=True)
  3. 连续特征(Age/Fare)分箱处理:

    df['AgeBin'] = pd.qcut(df['Age'], q=5, labels=False) df['FareBin'] = pd.qcut(df['Fare'], q=4, labels=False)

4. 模型构建与优化

4.1 基准模型对比

我们测试5种经典算法(使用5折交叉验证):

模型平均准确率训练时间(s)
Logistic回归0.8210.12
随机森林0.8300.45
梯度提升树(XGBoost)0.8360.78
SVM(rbf核)0.8281.23
KNN(k=5)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_state=42) grid_search = GridSearchCV(rf, param_grid, cv=5, scoring='accuracy', 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.042

5. 项目进阶技巧

5.1 集成模型方案

结合XGBoost和随机森林的Stacking集成:

from sklearn.ensemble import StackingClassifier from xgboost import XGBClassifier base_models = [ ('rf', RandomForestClassifier(n_estimators=200, max_depth=5, random_state=42)), ('xgb', XGBClassifier(n_estimators=100, learning_rate=0.1, random_state=42)) ] stacking = StackingClassifier( estimators=base_models, final_estimator=LogisticRegression(), cv=5 ) stacking.fit(X_train, y_train)

5.2 常见问题排查

  1. 准确率卡在0.78-0.82无法提升

    • 检查特征相关性:删除冗余特征(如同时存在FamilySize和SibSp+Parch)
    • 尝试非线性特征组合(如Age*Pclass)
  2. 过拟合问题

    • 增加早停机制(early_stopping_rounds)
    • 添加正则化参数(XGBoost的reg_alpha/reg_lambda)
  3. 类别不平衡处理

    • 使用class_weight参数(sklearn)或scale_pos_weight(XGBoost)
    • 尝试过采样(SMOTE)或欠采样

6. 项目扩展方向

  1. 模型解释性增强

    • 使用SHAP值分析个体预测
    import shap explainer = shap.TreeExplainer(model) shap_values = explainer.shap_values(X_test) shap.summary_plot(shap_values, X_test)
  2. 部署为Web应用

    • 使用Flask构建预测API
    • 前端展示预测结果和特征影响
  3. 数据增强实验

    • 生成合成数据(使用CTGAN等生成模型)
    • 半监督学习(利用测试集数据)

这个项目最值得关注的是特征工程环节——好的特征设计往往比模型选择影响更大。在实际操作中,我通常会先花70%时间在EDA和特征工程上,这比盲目调参效果提升更明显。另外,建议保存每个版本的预处理流水线(使用sklearn Pipeline),方便后续复现和部署。

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/10 10:35:33

CANN/ge捕获张量API

CaptureTensor 【免费下载链接】ge GE(Graph Engine)是面向昇腾的图编译器和执行器,提供了计算图优化、多流并行、内存复用和模型下沉等技术手段,加速模型执行效率,减少模型内存占用。 GE 提供对 PyTorch、TensorFlow …

作者头像 李华
网站建设 2026/9/10 10:30:12

企业IT管理半成熟阶段突破与实践路径

1. 企业IT管理"半成熟阶段"现象解析 第一次接触企业IT管理的人常会困惑:为什么很多公司明明投入了大量资源,IT系统却始终处于"能用但不好用"的状态?这种既不是完全混乱、又达不到高效运转的中间状态,我称之为…

作者头像 李华
网站建设 2026/9/10 10:28:54

基于Hadoop+Spark+Hive的智慧交通客流量预测系统设计与实现

1. 项目概述:基于HadoopSparkHive的智慧交通客流量预测系统这个毕业设计项目构建了一个完整的智慧交通大数据分析平台,核心功能是通过多源交通数据预测未来时段内的客流量变化。我在实际交通大数据项目中验证过,这种架构能有效处理日均10GB以…

作者头像 李华