🚢 泰坦尼克号生存预测竞赛指南
赛事详情参考:https://www.kaggle.com/competitions/titanic
📜 背景
1912年4月15日,号称“永不沉没”的皇家邮轮 泰坦尼克号(RMS Titanic) 在其首次航行中撞上冰山后沉没。船上共有 2224 名乘客和船员,但因救生艇数量严重不足,最终导致 1502 人遇难。
虽然幸存有一定运气成分,但历史数据表明:某些人群的生存概率明显更高——例如女性、儿童、头等舱乘客等。
本竞赛的目标正是通过机器学习,回答一个核心问题:
==“哪些类型的人更有可能在泰坦尼克号沉没中幸存下来?”==
🎯 任务
你需要利用提供的乘客信息(如姓名、年龄、性别、社会经济阶层等),构建一个预测模型,判断测试集中每位乘客是否:
- 生还(Survived = 1)
- 遇难(Survived = 0)
这是一个典型的 二分类(Binary Classification) 问题,非常适合机器学习初学者入门。
📁 数据集说明
你将获得两个结构相似的 CSV 文件:
1. train.csv(训练集)
- 包含 891 名乘客 的详细信息。
- 包含标签(Ground Truth):即每位乘客是否生还(
Survived列为 0 或 1)。 - 用于训练和验证你的模型。
2. test.csv(测试集)
- 包含 418 名乘客 的信息。
- 不包含
Survived标签。 - 你需要用训练好的模型对这 418 人进行预测,并提交结果。
🧾 字段说明
| 字段名 | 含义 |
|---|---|
PassengerId |
乘客唯一ID |
Survived |
是否生还(0=否,1=是)—仅训练集有 |
Pclass |
船票等级(1=头等舱,2=二等舱,3=三等舱) |
Name |
姓名 |
Sex |
性别 |
Age |
年龄(部分缺失) |
SibSp |
船上兄弟姐妹/配偶数量 |
Parch |
船上父母/子女数量 |
Ticket |
船票编号 |
Fare |
票价 |
Cabin |
客舱号(大量缺失) |
Embarked |
登船港口(C=瑟堡, Q=皇后镇, S=南安普顿) |
📤 提交结果说明
你需要提交一个 CSV 文件,格式如下:
- 必须包含 418 行预测结果 + 1 行表头。
- 仅包含以下两列:
PassengerId:必须与test.csv中的 ID 对应(顺序不限)。Survived:只能是0或1。
示例:
PassengerId,Survived
892,0
893,1
894,0
...
1309,1
⚠️ 多余列或行会导致提交失败!
🔧 主要工作流程
一、特征工程
- 数据分析:探索缺失值、分布、相关性
- 特征选取:选择对预测有帮助的字段
- 特征加工:
- 处理缺失值(如用中位数填充
Age) - 编码分类变量(如
Sex,Embarked) - 构造新特征(如家庭规模 =
SibSp + Parch + 1)
- 处理缺失值(如用中位数填充
二、模型工程
- 模型选型:逻辑回归、随机森林、XGBoost 等
- 训练模型:使用训练集拟合
- 验证评估:交叉验证、准确率(Accuracy)
✅ 代码
# 导入必要库
import pandas as pd
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score
# 1. 加载数据
train_data = pd.read_csv("/kaggle/input/titanic/train.csv")
test_data = pd.read_csv("/kaggle/input/titanic/test.csv")
# 2. 特征工程:处理缺失值 & 构造特征
# 填充 Age 缺失值(用中位数)
train_data["Age"].fillna(train_data["Age"].median(), inplace=True)
test_data["Age"].fillna(test_data["Age"].median(), inplace=True)
# 填充 Embarked(用众数)
train_data["Embarked"].fillna(train_data["Embarked"].mode()[0], inplace=True)
test_data["Embarked"].fillna(test_data["Embarked"].mode()[0], inplace=True)
# 填充 Fare(测试集中可能缺失)
test_data["Fare"].fillna(test_data["Fare"].median(), inplace=True)
# 构造新特征:家庭规模
train_data["FamilySize"] = train_data["SibSp"] + train_data["Parch"] + 1
test_data["FamilySize"] = test_data["SibSp"] + test_data["Parch"] + 1
# 3. 选择特征
features = ["Pclass", "Sex", "Age", "Fare", "Embarked", "FamilySize"]
# 4. 转换分类变量为哑变量(One-Hot Encoding)
X_train = pd.get_dummies(train_data[features])
X_test = pd.get_dummies(test_data[features])
# 确保训练集和测试集列一致(避免 Embarked_Q 等缺失)
X_train, X_test = X_train.align(X_test, join='left', axis=1)
# 5. 获取标签
y_train = train_data["Survived"]
# 6. 训练模型(随机森林)
model = RandomForestClassifier(
n_estimators=100,
max_depth=5,
random_state=42
)
# 可选:交叉验证评估
scores = cross_val_score(model, X_train, y_train, cv=5, scoring='accuracy')
print(f"平均交叉验证准确率: {scores.mean():.4f} ± {scores.std():.4f}")
# 7. 拟合并预测
model.fit(X_train, y_train)
predictions = model.predict(X_test)
# 8. 生成提交文件
output = pd.DataFrame({
"PassengerId": test_data["PassengerId"],
"Survived": predictions
})
output.to_csv("submission.csv", index=False)
print("✅ 提交文件已保存为 submission.csv")
📌 使用说明
- 在 Kaggle 上创建新 Notebook(Python 类型)
- 将上述代码粘贴到第一个 cell 中
- 点击 “Run All” 运行
- 下载
submission.csv并提交,或直接点击 “Submit” 按钮
💡 初始分数通常在 0.77~0.80 之间。后续可通过:
- 更精细的特征工程(如从
Name提取称谓 Title)- 超参数调优
- 集成多个模型
来进一步提升成绩。
📘 延伸建议
- 进阶特征:从
Name中提取Title(如 Mr, Miss, Master) - 处理 Cabin:可用是否缺失作为特征(
CabinKnown = Cabin.notna()) - 尝试其他模型:
LogisticRegression,XGBClassifier,SVC - 学习资源:
- Alexis Cook 官方教程
- Kaggle 课程:Intro to Machine Learning
祝你在 Kaggle 的第一个竞赛中取得好成绩!🎉
如有需要,我可继续提供特征优化、模型调参或可视化分析的代码。