泰坦尼克号生存预测是数据挖掘和机器学习领域的经典入门项目。这个项目通过分析乘客数据(如年龄、性别、舱位等)来预测他们在海难中的生存概率。作为数据科学领域的"Hello World",它完美涵盖了数据预处理、特征工程、模型训练和评估等完整流程。
我在最近的教学实践中,带领学生用Jupyter Notebook完整复现了这个项目。与常见的简单实现不同,我们深入探索了传统机器学习模型与深度学习模型的对比,并创新性地引入了注意力机制来提升预测效果。整个项目包含超过1万字的详细技术报告、完整的设计源文件以及配套讲解资料。
泰坦尼克号数据集包含以下关键特征:
初始探索性分析(EDA)显示数据存在几个关键问题:
针对这些问题,我们实施了以下处理:
缺失值处理:
异常值处理:
特征转换:
注意:在填充年龄时,我们发现头等舱乘客的平均年龄显著高于其他舱位,因此必须分舱位进行填充,避免引入偏差。
家庭规模:
python复制df['FamilySize'] = df['SibSp'] + df['Parch'] + 1
通过分析发现,中等规模家庭(2-4人)生存率最高,独身乘客和超大家庭生存率较低。
称呼提取:
python复制df['Title'] = df.Name.str.extract(' ([A-Za-z]+)\.', expand=False)
将非常见称呼归类为"Rare",发现"Mrs"和"Miss"生存率显著高于"Mr"。
年龄段分组:
将连续年龄离散化为:
票价/舱位交互特征:
创建"票价与舱位中位数比"特征,反映乘客在其舱位中的相对消费水平。
家庭生存率编码:
计算每个姓氏在训练集中的平均生存率,作为新特征。这需要小心处理数据泄漏问题。
客舱位置推断:
对已知客舱,根据首字母推断甲板位置(A-G),未知的统一编码。
使用递归特征消除(RFE)和基于重要性的方法,最终保留以下特征:
随机森林实现:
python复制from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(
n_estimators=500,
max_depth=6,
min_samples_leaf=4,
class_weight='balanced',
random_state=42
)
关键参数选择依据:
SVM实现要点:
BP神经网络架构:
基础LSTM模型:
注意力机制增强:
python复制class AttentionLayer(tf.keras.layers.Layer):
def call(self, inputs):
query = tf.keras.layers.Dense(64)(inputs)
key = tf.keras.layers.Dense(64)(inputs)
value = tf.keras.layers.Dense(64)(inputs)
attention_scores = tf.matmul(query, key, transpose_b=True)
attention_scores = tf.nn.softmax(attention_scores, axis=-1)
return tf.matmul(attention_scores, value)
多头注意力LSTM(MHA-LSTM):
除常规准确率外,我们更关注:
| 模型 | 准确率 | 召回率 | 精确率 | F1分数 | AUC |
|---|---|---|---|---|---|
| 随机森林 | 82.1% | 75.3% | 80.2% | 77.6% | 0.872 |
| SVM | 79.8% | 70.1% | 78.9% | 74.2% | 0.843 |
| BP神经网络 | 81.5% | 73.8% | 79.6% | 76.6% | 0.861 |
| 基础LSTM | 82.3% | 76.1% | 80.9% | 78.4% | 0.879 |
| MHA-LSTM | 84.7% | 79.2% | 83.1% | 81.1% | 0.901 |
推荐使用Anaconda创建专用环境:
bash复制conda create -n titanic python=3.8
conda activate titanic
pip install jupyter pandas scikit-learn tensorflow matplotlib seaborn
code复制titanic-project/
├── data/
│ ├── train.csv
│ └── test.csv
├── notebooks/
│ ├── 1_eda_preprocessing.ipynb
│ ├── 2_feature_engineering.ipynb
│ ├── 3_model_training.ipynb
│ └── 4_evaluation.ipynb
├── models/
│ ├── random_forest.pkl
│ └── mha_lstm.h5
└── reports/
└── final_report.pdf
现象: 生存率仅约38%
解决方案:
现象: 训练集准确率95%但测试集仅80%
解决方法:
挑战: 姓名、客舱等非结构化数据
最佳实践:
在实际教学中发现,让学生先实现基础版本(随机森林),再逐步添加复杂组件(如注意力机制),学习曲线最为平缓。特征工程环节往往能带来最直接的性能提升,这强调了数据理解的重要性。