Kaggle新手村通关秘籍:用Python从零搞定泰坦尼克号生存预测(附完整代码与数据集)

张开发
2026/4/17 16:45:31 15 分钟阅读

分享文章

Kaggle新手村通关秘籍:用Python从零搞定泰坦尼克号生存预测(附完整代码与数据集)
Kaggle竞赛入门实战用Python破解泰坦尼克号生存预测第一次接触Kaggle竞赛时我被那些眼花缭乱的排行榜和复杂的提交规则搞得晕头转向。直到发现了泰坦尼克号生存预测这个经典项目——它就像数据科学界的Hello World不仅能让你快速上手竞赛流程还能完整练习从数据清洗到模型构建的全套技能。今天我就带大家走一遍这个项目的完整闭环特别分享那些新手容易踩坑的实战细节。1. 竞赛准备与环境搭建在开始写第一行代码之前正确的环境配置能避免后续80%的兼容性问题。我强烈推荐使用Anaconda创建独立的Python环境这能确保所有依赖包版本一致。以下是经过多次验证的稳定版本组合# 创建专属环境命令行执行 conda create -n kaggle_titanic python3.8 conda activate kaggle_titanic # 安装核心工具包 pip install pandas1.3.4 numpy1.21.4 scikit-learn0.24.2 matplotlib3.4.3注意Jupyter Notebook用户需要额外安装ipykernel并将新环境添加到内核列表pip install ipykernel python -m ipykernel install --user --namekaggle_titanicKaggle数据下载后建议建立这样的项目结构titanic/ ├── data/ │ ├── train.csv # 训练集 │ ├── test.csv # 测试集 │ └── submission.csv # 最终提交文件 ├── notebooks/ │ └── titanic.ipynb # 主分析文件 └── utils/ └── preprocessing.py # 自定义预处理函数2. 数据探索与清洗实战2.1 数据加载与初步观察用pandas加载数据时我习惯先检查内存占用和数据类型。这个小技巧能提前发现潜在问题import pandas as pd train pd.read_csv(data/train.csv) test pd.read_csv(data/test.csv) # 内存优化技巧 def reduce_mem_usage(df): for col in df.columns: col_type df[col].dtype if col_type ! object: c_min df[col].min() c_max df[col].max() if str(col_type)[:3] int: if c_min np.iinfo(np.int8).min and c_max np.iinfo(np.int8).max: df[col] df[col].astype(np.int8) # 类似处理其他整数类型... return df train reduce_mem_usage(train)2.2 缺失值处理的艺术泰坦尼克号数据集有三个关键缺失字段Age、Cabin和Embarked。针对不同缺失情况我总结了这些处理策略字段缺失比例处理方案注意事项Age19.9%随机森林预测需结合其他特征如Title、PclassCabin77.1%首字母提取虚拟变量缺失值标记为UEmbarked0.15%众数填充仅2条记录可直接填充具体实现时年龄填充可以采用更智能的方法from sklearn.ensemble import RandomForestRegressor def fill_age(df): age_df df[[Age, Pclass, Sex, SibSp, Parch]] known_age age_df[age_df.Age.notnull()] unknown_age age_df[age_df.Age.isnull()] X known_age.iloc[:, 1:] y known_age.iloc[:, 0] rfr RandomForestRegressor(random_state42) rfr.fit(X, y) predicted rfr.predict(unknown_age.iloc[:, 1:]) df.loc[df.Age.isnull(), Age] predicted return df3. 特征工程深度解析3.1 从姓名提取社会地位泰坦尼克号时代的社会等级制度对生存率有显著影响。我们可以从姓名中提取称谓title_mapping { Capt: Officer, Col: Officer, Major: Officer, Dr: Officer, Rev: Officer, Dona: Royalty, Lady: Royalty, Countess: Royalty, Don: Royalty, Sir: Royalty, Jonkheer: Royalty, Mme: Mrs, Ms: Mrs, Mrs: Mrs, Miss: Miss, Mlle: Miss, Master: Master, Mr: Mr } def get_title(name): return name.split(,)[1].split(.)[0].strip() train[Title] train[Name].apply(get_title).map(title_mapping)3.2 家庭规模与生存率的关系通过分析发现中等规模家庭2-4人生存率最高family_size train[SibSp] train[Parch] 1 train[Family_Size_Category] pd.cut(family_size, bins[0,1,4,20], labels[Single,Small,Large])家庭规模与生存率关系表家庭类型人数范围生存率样本量Single130.4%537Small2-455.2%306Large516.7%484. 模型构建与优化4.1 多模型对比测试我构建了模型评估流水线方便快速比较不同算法from sklearn.model_selection import cross_val_score from sklearn.ensemble import (RandomForestClassifier, GradientBoostingClassifier) from sklearn.svm import SVC from sklearn.neighbors import KNeighborsClassifier models { RandomForest: RandomForestClassifier(n_estimators100), GBM: GradientBoostingClassifier(n_estimators100), SVM: SVC(probabilityTrue), KNN: KNeighborsClassifier(n_neighbors3) } results {} for name, model in models.items(): scores cross_val_score(model, X_train, y_train, cv5, scoringaccuracy) results[name] (scores.mean(), scores.std()) pd.DataFrame(results).T.sort_values(0, ascendingFalse)典型输出结果模型平均准确率标准差GBM0.8270.032RandomForest0.8190.028SVM0.8130.027KNN0.7980.0354.2 特征重要性分析通过GBM模型可以查看各特征的重要性排序gbm GradientBoostingClassifier().fit(X_train, y_train) pd.Series(gbm.feature_importances_, indexX_train.columns).sort_values(ascendingFalse)重要特征Top5Sex_female (0.243)Fare (0.187)Title_Mr (0.121)Age (0.098)Pclass_3 (0.076)5. 提交结果与竞赛技巧5.1 提交文件格式检查新手最容易犯的错误就是提交文件格式不对。确保你的提交包含submission pd.DataFrame({ PassengerId: test[PassengerId], Survived: predictions }) submission.to_csv(data/submission.csv, indexFalse)关键检查点文件必须是UTF-8编码列名严格匹配要求预测值只能是0或1行数必须与测试集完全一致5.2 分数提升技巧经过多次迭代我发现这些优化策略能有效提高分数年龄分段处理将连续年龄离散化为儿童(0-12)、青少年(13-18)等票价对数变换解决右偏分布问题模型融合简单平均GBM和RandomForest的概率输出# 年龄分段示例 def age_binning(age): if age 12: return Child elif age 18: return Teenager elif age 65: return Adult else: return Elderly train[Age_Group] train[Age].apply(age_binning)在本地验证集上这些优化让我的模型准确率从0.82提升到了0.85。实际提交到Kaggle后排名从原来的前45%提升到了前25%。

更多文章