
1. 初识泰坦尼克号数据集第一次接触Kaggle的泰坦尼克号数据集时我被这个经典案例的丰富性所吸引。这个数据集包含了891名乘客的详细信息从姓名、年龄到船票等级甚至包括他们最终是否生还。作为机器学习入门项目它完美涵盖了数据清洗、特征工程、模型训练等全流程。用Python加载数据后我习惯先用pandas快速浏览数据全貌import pandas as pd train_df pd.read_csv(train.csv) print(train_df.info()) print(train_df.describe())输出结果显示Age列有177个缺失值Cabin缺失更多达687个。这提醒我需要先处理数据质量问题。有趣的是通过简单的train_df.head()就能看到那个时代的船票价格差异——头等舱票价高达512美元而三等舱最低仅7.65美元这暗示着社会阶层可能与生存率存在关联。2. 数据清洗的艺术2.1 缺失值处理实战面对缺失的年龄数据我尝试了三种方法对比直接删除缺失行损失30%数据用均值填充受异常值影响大用中位数填充最终选择# 可视化年龄分布 import matplotlib.pyplot as plt plt.figure(figsize(10,4)) plt.subplot(121) train_df[Age].hist(bins30) plt.subplot(122) train_df[Age].plot.box() plt.show() # 中位数填充 train_df[Age].fillna(train_df[Age].median(), inplaceTrue)对于Cabin字段我创造性地提取了甲板信息作为新特征。即使原始数据缺失通过标记为UUnknown仍保留了数据价值train_df[Deck] train_df[Cabin].apply(lambda x: x[0] if pd.notna(x) else U)2.2 异常值处理技巧票价(Fare)字段存在极端值我使用IQR方法识别异常值Q1 train_df[Fare].quantile(0.25) Q3 train_df[Fare].quantile(0.75) IQR Q3 - Q1 outliers train_df[(train_df[Fare] Q1-1.5*IQR) | (train_df[Fare] Q31.5*IQR)]处理时没有简单删除而是结合Pclass船舱等级进行分组替换因为头等舱的高票价本身具有实际意义。3. 特征工程的魔法3.1 从姓名挖掘社会地位原始Name字段看似无用但提取出的称谓(Title)却成为关键特征titles train_df[Name].apply(lambda name: name.split(,)[1].split(.)[0].strip()) print(titles.value_counts()) # 将稀有称谓归类 rare_titles [Lady, Countess,Capt, Col, Don, Dr, Major, Rev, Sir, Jonkheer, Dona] train_df[Title] train_df[Title].replace(rare_titles, Rare)3.2 构建家庭特征将SibSp和Parch组合成新特征后发现了有趣的模式train_df[FamilySize] train_df[SibSp] train_df[Parch] 1 train_df[IsAlone] (train_df[FamilySize] 1).astype(int) # 可视化家庭规模与生存率 import seaborn as sns sns.barplot(xFamilySize, ySurvived, datatrain_df)结果显示2-4人家庭的生存率最高而独行旅客或大家庭生存率较低这符合妇女儿童优先的救援原则。3.3 票价分级处理原始Fare值跨度大我将其离散化为5个等级train_df[FareBand] pd.qcut(train_df[Fare], 5, labels[1,2,3,4,5]) test_df[FareBand] pd.qcut(test_df[Fare], 5, labels[1,2,3,4,5])4. 模型构建与优化4.1 基础模型对比我测试了五种常见算法的baseline表现模型验证集准确率训练时间(s)逻辑回归0.7930.15随机森林0.8210.82梯度提升树0.8311.23SVM0.7980.76KNN0.7790.05from sklearn.ensemble import RandomForestClassifier from sklearn.model_selection import cross_val_score rf RandomForestClassifier(n_estimators100, random_state42) scores cross_val_score(rf, X_train, y_train, cv5) print(f交叉验证准确率: {scores.mean():.3f} ± {scores.std():.3f})4.2 超参数调优实战使用GridSearchCV进行精细调参param_grid { n_estimators: [100, 200, 300], max_depth: [3, 5, 7], min_samples_split: [2, 5, 10] } grid_search GridSearchCV(RandomForestClassifier(random_state42), param_grid, cv5, scoringaccuracy) grid_search.fit(X_train, y_train) print(f最佳参数: {grid_search.best_params_}) print(f最佳分数: {grid_search.best_score_:.3f})调优后的随机森林在验证集准确率提升到0.86关键参数显示适度的树深度(max_depth5)能更好防止过拟合。4.3 特征重要性分析可视化特征重要性帮助理解模型决策importances grid_search.best_estimator_.feature_importances_ features X_train.columns indices np.argsort(importances)[::-1] plt.figure(figsize(12,6)) plt.title(特征重要性) plt.bar(range(X_train.shape[1]), importances[indices]) plt.xticks(range(X_train.shape[1]), features[indices], rotation90) plt.show()结果显示性别(Sex)、票价等级(FareBand)和称谓(Title)是最具预测力的特征这与历史记载的救援优先级一致。5. 模型集成与提交5.1 集成学习策略尝试了三种集成方法提升效果投票集成结合逻辑回归、随机森林和SVM的预测堆叠集成用随机森林作为元模型Bagging扩展使用ExtraTrees算法from sklearn.ensemble import VotingClassifier estimators [ (rf, RandomForestClassifier(n_estimators300, max_depth5, random_state42)), (gb, GradientBoostingClassifier(n_estimators100, learning_rate0.1, random_state42)) ] voting VotingClassifier(estimators, votingsoft) voting.fit(X_train, y_train)5.2 Kaggle提交技巧最终提交时我发现了几个关键点测试集预处理必须与训练集完全一致需要处理测试集中出现的训练集未见的类别多次提交取平均能提升稳定性# 最终提交管道 pipeline Pipeline([ (preprocessor, preprocessor), (classifier, voting) ]) pipeline.fit(X_train, y_train) predictions pipeline.predict(test_df) submission pd.DataFrame({ PassengerId: test_df[PassengerId], Survived: predictions }) submission.to_csv(final_submission.csv, indexFalse)经过多次迭代我的最佳提交在Kaggle上达到了0.813的准确率进入前8%。这个过程中最宝贵的不是分数而是学会如何通过特征工程揭示数据背后的故事。比如发现头等舱中年女士的生存率高达96%而三等舱男性的生存率不足17%这些洞察比模型参数更有价值。