用Titanic数据集搞懂机器学习分类:从Pandas数据清洗到Scikit-learn建模的保姆级实战

泰坦尼克号的故事早已超越历史事件本身,成为数据科学入门的经典案例。这个包含乘客年龄、性别、舱位等特征的数据集,为初学者提供了一个绝佳的实战沙盒——它足够复杂以涵盖真实数据处理的典型挑战,又足够简单让新手能够完整走完从数据清洗到建模预测的全流程。本文将带你用Python中最流行的Pandas和Scikit-learn工具包,亲手完成一个端到端的机器学习项目。

1. 环境准备与数据初探

在开始前,确保已安装以下Python库(推荐使用Anaconda发行版):

pip install pandas scikit-learn matplotlib seaborn

加载数据集并快速浏览结构:

import pandas as pd
train_df = pd.read_csv('train.csv')
print(f"数据集维度:{train_df.shape}")
print(train_df.head(3))

你会看到这些关键字段:

  • Survived :目标变量(0=遇难,1=生还)
  • Pclass :舱位等级(1/2/3等舱)
  • Sex :性别
  • Age :年龄
  • Fare :船票价格

注意:实际数据中常存在各种"脏数据",比如Age字段有约20%的缺失值,这是我们需要处理的第一个挑战。

2. 数据清洗实战技巧

2.1 处理缺失值的艺术

缺失值处理没有标准答案,不同策略会影响最终模型效果。以下是常用方法对比:

字段 缺失比例 推荐处理方式 代码示例
Age ~20% 按性别分组填充中位数 train_df['Age'] = train_df.groupby('Sex')['Age'].apply(lambda x: x.fillna(x.median()))
Cabin ~77% 直接删除 train_df.drop('Cabin', axis=1, inplace=True)
Embarked 0.2% 填充众数 train_df['Embarked'].fillna(train_df['Embarked'].mode()[0], inplace=True)

2.2 特征类型转换

机器学习模型只能处理数值,所以需要将文本特征编码:

# 性别转换为0/1
train_df['Sex'] = train_df['Sex'].map({'female': 0, 'male': 1})

# 登船港口做one-hot编码
embarked_dummies = pd.get_dummies(train_df['Embarked'], prefix='Embarked')
train_df = pd.concat([train_df, embarked_dummies], axis=1)

3. 特征工程深度解析

3.1 创造有意义的衍生特征

原始特征可以组合出更有预测力的新特征:

# 家庭规模 = 兄弟姐妹数 + 父母子女数 + 1(自己)
train_df['FamilySize'] = train_df['SibSp'] + train_df['Parch'] + 1

# 是否独自乘船
train_df['IsAlone'] = 0
train_df.loc[train_df['FamilySize'] == 1, 'IsAlone'] = 1

3.2 连续特征分桶处理

将年龄分段能捕捉非线性关系:

bins = [0, 5, 12, 18, 25, 35, 60, 100]
labels = ['婴儿', '儿童', '少年', '青年', '壮年', '中年', '老年']
train_df['AgeGroup'] = pd.cut(train_df['Age'], bins=bins, labels=labels)

4. 建模与评估全流程

4.1 数据集划分

永远不要在训练集上测试模型:

from sklearn.model_selection import train_test_split

features = ['Pclass', 'Sex', 'Age', 'Fare', 'IsAlone', 'FamilySize']
X = train_df[features]
y = train_df['Survived']

X_train, X_val, y_train, y_val = train_test_split(
    X, y, test_size=0.2, random_state=42)

4.2 模型训练与比较

测试不同算法的基准表现:

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.svm import SVC

models = {
    "逻辑回归": LogisticRegression(max_iter=1000),
    "随机森林": RandomForestClassifier(n_estimators=100),
    "支持向量机": SVC()
}

for name, model in models.items():
    model.fit(X_train, y_train)
    score = model.score(X_val, y_val)
    print(f"{name}验证集准确率: {score:.3f}")

典型输出结果:

  • 逻辑回归验证集准确率: 0.799
  • 随机森林验证集准确率: 0.816
  • 支持向量机验证集准确率: 0.682

4.3 模型优化实战

以随机森林为例进行调参:

from sklearn.model_selection import GridSearchCV

param_grid = {
    'n_estimators': [50, 100, 200],
    'max_depth': [None, 5, 10],
    'min_samples_split': [2, 5, 10]
}

grid_search = GridSearchCV(
    estimator=RandomForestClassifier(),
    param_grid=param_grid,
    cv=5,
    scoring='accuracy'
)
grid_search.fit(X_train, y_train)

print(f"最佳参数: {grid_search.best_params_}")
print(f"最佳分数: {grid_search.best_score_:.3f}")

5. 项目进阶建议

完成基础流程后,可以尝试这些提升方向:

  • 尝试XGBoost等更先进的算法
  • 加入交叉验证确保结果稳定性
  • 绘制特征重要性图表
  • 用Seaborn制作更专业的可视化
  • 在Kaggle上提交预测结果测试排名

这个项目虽然基于历史数据,但其中包含的数据处理技巧和建模思路完全适用于现代商业场景,比如客户流失预测、信用评分建模等分类问题。记住,好的数据科学家不是记住所有算法,而是培养出解决数据问题的系统性思维。

更多推荐