赛事详情参考:https://www.kaggle.com/competitions/titanic
1912年4月15日,号称“永不沉没”的皇家邮轮 泰坦尼克号(RMS Titanic) 在其首次航行中撞上冰山后沉没。船上共有 2224 名乘客和船员,但因救生艇数量严重不足,最终导致 1502 人遇难。
虽然幸存有一定运气成分,但历史数据表明:某些人群的生存概率明显更高——例如女性、儿童、头等舱乘客等。
本竞赛的目标正是通过机器学习,回答一个核心问题:
==“哪些类型的人更有可能在泰坦尼克号沉没中幸存下来?”==
你需要利用提供的乘客信息(如姓名、年龄、性别、社会经济阶层等),构建一个预测模型,判断测试集中每位乘客是否:
这是一个典型的 二分类(Binary Classification) 问题,非常适合机器学习初学者入门。
你将获得两个结构相似的 CSV 文件:
train.csv(训练集)Survived 列为 0 或 1)。test.csv(测试集)Survived 标签。| 字段名 | 含义 |
|---|---|
PassengerId |
乘客唯一ID |
Survived |
是否生还(0=否,1=是)—仅训练集有 |
Pclass |
船票等级(1=头等舱,2=二等舱,3=三等舱) |
Name |
姓名 |
Sex |
性别 |
Age |
年龄(部分缺失) |
SibSp |
船上兄弟姐妹/配偶数量 |
Parch |
船上父母/子女数量 |
Ticket |
船票编号 |
Fare |
票价 |
Cabin |
客舱号(大量缺失) |
Embarked |
登船港口(C=瑟堡, Q=皇后镇, S=南安普顿) |
你需要提交一个 CSV 文件,格式如下:
PassengerId:必须与 test.csv 中的 ID 对应(顺序不限)。Survived:只能是 0 或 1。示例:
PassengerId,Survived
892,0
893,1
894,0
...
1309,1
⚠️ 多余列或行会导致提交失败!
Age)Sex, Embarked)SibSp + Parch + 1)# 导入必要库
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")
submission.csv 并提交,或直接点击 “Submit” 按钮💡 初始分数通常在 0.77~0.80 之间。后续可通过:
- 更精细的特征工程(如从
Name提取称谓 Title)- 超参数调优
- 集成多个模型 来进一步提升成绩。
Name 中提取 Title(如 Mr, Miss, Master)CabinKnown = Cabin.notna())LogisticRegression, XGBClassifier, SVC祝你在 Kaggle 的第一个竞赛中取得好成绩!🎉 如有需要,我可继续提供特征优化、模型调参或可视化分析的代码。