用Titanic数据集搞懂机器学习分类:从Pandas数据清洗到Scikit-learn建模的保姆级实战
·
用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上提交预测结果测试排名
这个项目虽然基于历史数据,但其中包含的数据处理技巧和建模思路完全适用于现代商业场景,比如客户流失预测、信用评分建模等分类问题。记住,好的数据科学家不是记住所有算法,而是培养出解决数据问题的系统性思维。
更多推荐
所有评论(0)