目录
1. 引言
在数据科学领域,Titanic 数据集是一个非常经典的入门练习题。它是基于 1912 年著名的泰坦尼克号沉船事件的实际数据,目标是通过已知的乘客信息预测某位乘客是否能够在灾难中幸存下来。这不仅是一个有趣的历史案例,也为初学者提供了一个很好的机会来学习如何处理分类问题,应用机器学习算法并进行模型评估。
在这篇博客中,将带你一步一步地完成 Titanic 生还预测任务,主要涵盖以下几个方面:
- 理解数据的基本结构。
- 如何处理数据中的缺失值和类别型特征。
- 通过特征工程来提高模型的表现。
- 使用多个常见的机器学习模型来进行预测,包括逻辑回归、随机森林和梯度提升树(XGBoost、LightGBM)。
- 通过准确率、F1 分数和 AUC-ROC 等指标对模型进行评估,并解释这些指标的意义。
无论是刚接触机器学习,还是正在寻找提升模型表现的方法,希望这篇博客能帮助你顺利完成 Titanic 生还预测的初学者任务。
2. 理解 Titanic 数据集
在开始构建模型之前,我们首先需要深入理解 Titanic 数据集的结构。这个数据集包含了泰坦尼克号乘客的相关信息,包括他们的基本背景、船舱信息以及是否幸存(Survived
)。以下是一些主要的特征:
- PassengerId:乘客编号(无关特征,可以删除)。
- Pclass:客舱等级(1, 2, 3),代表社会经济地位。
- Name:乘客姓名,可以从中提取称谓(如 Mr., Mrs. 等),为后续特征工程提供信息。
- Sex:乘客的性别,幸存率与性别高度相关。
- Age:乘客的年龄,有些年龄值缺失,需要进行填充。
- SibSp:兄弟姐妹/配偶人数,表示乘客随行家人数量。
- Parch:父母/子女人数,表示乘客随行的父母或子女数量。
- Ticket:票号,可能不是直接有用的特征,但可以探索。
- Fare:票价,可以进行分段处理以便更好地进行建模。
- Cabin:船舱号码,大部分缺失,可以进行分组处理。
- Embarked:登船港口(C = Cherbourg, Q = Queenstown, S = Southampton),部分缺失,需要填充。
目标变量
- Survived:生还情况(0 = 未生还, 1 = 生还),这是我们的目标变量。
数据的初步探索
在机器学习项目的早期阶段,初步的数据探索(EDA, Exploratory Data Analysis)非常重要。通过 EDA,我们可以发现数据中的模式、不平衡、缺失值等问题。可以用以下方式简单检查数据:
import pandas as pd
# 读取数据
data = pd.read_csv('train.csv')
# 查看数据前几行
print(data.head())
# 检查数据的总体信息,缺失值和数据类型
print(data.info())
# 查看每个特征的基本统计信息
print(data.describe())
data.head()的打印结果
data.info()的打印结果
data.describe()的打印结果
通过上述代码,你可以清楚地了解数据中的每个特征,特别是它们的类型、缺失值情况和数值分布。这是我们接下来要进行数据预处理和特征工程的基础。
在接下来的部分,我们将介绍如何处理这些数据问题,为建模做好准备。
3. 数据预处理
在我们正式开始构建模型之前,需要对 Titanic 数据集进行数据预处理。这一步是非常关键的,因为原始数据通常包含缺失值、不平衡特征或非数值型特征,这些都会影响模型的表现。
3.1 处理缺失值
在 Titanic 数据集中,部分特征(如 Age
、Cabin
、Embarked
)存在缺失值。如果不处理这些缺失值,模型训练时会报错或表现不佳。
- Age:这是一个重要的特征,但存在较多缺失值。一个常见的处理方法是用乘客所在
Pclass
(客舱等级)的中位数年龄来填充缺失值。 - Embarked:表示乘客登船港口,缺失值较少,可以用出现频率最高的港口(众数)来填充。
- Cabin:此特征的缺失值很多,通常选择删除该列,或者只提取出有用的信息(如提取首字母代表船舱的分布)。
-
# 填充 Age 缺失值,按 Pclass 的中位数年龄填充 data['Age'] = data.groupby('Pclass')['Age'].transform(lambda x: x.fillna(x.median())) # 填充 Embarked 缺失值,使用出现频率最高的值 data['Embarked'].fillna(data['Embarked'].mode()[0], inplace=True) # 删除 Cabin 列,因其缺失值过多 data.drop(columns=['Cabin'], inplace=True)
3.2 处理类别型特征
机器学习算法无法直接处理类别型特征,因此我们需要将其转换为数值型特征。常见的做法是 独热编码(One-Hot Encoding),它将类别型变量转换为多个二进制特征。
- Sex:
Male
和Female
转换为 0 和 1。 - Embarked:将登船港口转换为独热编码。
- Pclass:客舱等级也是一个类别型特征,可以保留原数值形式,或者转换为独热编码。
# 独热编码处理 Sex 和 Embarked 特征 data = pd.get_dummies(data, columns=['Sex', 'Embarked'], drop_first=True) # Pclass 可以保留原数值,不需要处理
3.3 创建新特征
为了提高模型的预测能力,特征工程可以帮助我们从现有数据中创建更多有用的特征。
- FamilySize:通过
SibSp
和Parch
计算乘客的家庭规模。 - IsAlone:当
FamilySize
为 1 时,表示乘客独自一人。 - Title:从乘客的姓名中提取称谓(如 Mr., Mrs., Miss. 等)。
# 创建 FamilySize 特征 data['FamilySize'] = data['SibSp'] + data['Parch'] + 1 # 创建 IsAlone 特征 data['IsAlone'] = (data['FamilySize'] == 1).astype(int) # 从姓名中提取称谓(Title),并简化为常见的类别 data['Title'] = data['Name'].str.extract(r' ([A-Za-z]+)\.', expand=False) data['Title'] = data['Title'].replace(['Lady', 'Countess', 'Capt', 'Col', 'Don', 'Dr', 'Major', 'Rev', 'Sir', 'Jonkheer', 'Dona'], 'Rare') data['Title'] = data['Title'].replace('Mlle', 'Mi