Kaggle机器学习入门挑战:泰坦尼克号生存预测(Titanic - Machine Learning from Disaster)

在这篇博客中,我们将通过使用 随机森林分类器 (RandomForestClassifier) 来解决经典的 Kaggle 泰坦尼克号生存预测问题。我们的目标是使用机器学习模型来预测泰坦尼克号上的乘客是否能够生还。为了实现这一目标,我们将首先对数据进行处理,包括缺失值填充、类别变量编码等,然后训练一个分类模型,最后对测试集进行预测并保存结果。

目录

  1. 项目背景
  2. 数据加载与预处理
  3. 构建随机森林分类模型
  4. 评估模型性能
  5. 处理测试数据
  6. 生成预测结果并保存
  7. 总结与展望

1.项目背景

泰坦尼克号是历史上最著名的沉船之一。该数据集包含了泰坦尼克号乘客的相关信息,并且目标是预测每个乘客是否能够生还。数据集中的特征包括乘客的基本信息(如姓名、年龄、性别等)和与生还情况相关的信息(如船舱、票价等)。通过这些特征,我们可以训练一个机器学习模型,来对每个乘客的生还情况进行预测。


2.数据加载与预处理

首先,我们需要加载数据并进行一些初步的预处理。数据预处理是机器学习中非常重要的一步,特别是对缺失值和类别变量的处理。
train.csv数据集示例如下所示:

PassengerIdSurvivedPclassNameSexAgeSibSpParchTicketFareCabinEmbarked
103Braund, Mr. Owen Harrismale2210A/5 211717.25S
211Cumings, Mrs. John Bradley (Florence Briggs Thayer)female3810PC 1759971.2833C85C
313Heikkinen, Miss. Lainafemale2600STON/O2. 31012827.925S
411Futrelle, Mrs. Jacques Heath (Lily May Peel)female351011380353.1C123S
503Allen, Mr. William Henrymale35003734508.05S
603Moran, Mr. JamesmaleNaN003308778.4583Q

官方对于数据集的解释:

对于这份数据集,我们应该重点关注以下几点数据:

  1. 乘客姓名
  2. 船票仓位
  3. 票价

当然了,这是一个入门的挑战,我们只需要用上这些数据去构建我们的模型就可以。

2.1 数据加载

我们使用 pandas 库来加载训练集和测试集数据,并删除 Cabin 列,因为这一列数据较为稀疏,对模型预测效果的贡献不大。

import pandas as pd

# 加载训练集数据
datasets = pd.read_csv('train.csv')
datasets = datasets.drop(['Cabin'], axis=1)  # 删除不需要的列

# 特征矩阵 X 和目标变量 Y
x_train = datasets.iloc[:, 2:].values  # 特征矩阵
y_train = datasets.iloc[:, 1].values   # 目标变量

2.2 处理缺失值

数据中的 Age 列包含缺失值。为了不丢失数据,我们使用 均值填充 的方法来填补这些缺失值。SimpleImputer 类可以用来填补缺失值。

from sklearn.impute import SimpleImputer
import numpy as np

# 使用均值填充 'Age' 列的缺失值
imputer = SimpleImputer(missing_values=np.nan, strategy='mean')
x_train[:, 3:4] = imputer.fit_transform(x_train[:, 3:4])

2.3 类别变量处理

数据中还包含一些类别变量,如 SexEmbarkedPclass。机器学习模型无法直接处理这些非数值型数据,因此我们需要使用 OneHotEncoder 对这些类别变量进行编码。当然,也可以选择LabelEncoder对性别和登船港口进行标签。

from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder

# 对类别特征进行 OneHot 编码
encoder = OneHotEncoder(handle_unknown='ignore')
ctr = ColumnTransformer([('encoder', encoder, [1, 2, 6, -1])], remainder='passthrough')
x_train = ctr.fit_transform(x_train)

在此,我们通过 ColumnTransformer 对选定的列进行编码。handle_unknown='ignore' 表示处理未知类别时不出错。


3.构建随机森林分类模型

数据预处理完成后,接下来我们使用 随机森林分类器 (RandomForestClassifier) 来构建预测模型。随机森林是一种集成学习方法,通过结合多个决策树来进行预测。

from sklearn.ensemble import RandomForestClassifier

# 初始化并训练随机森林模型
rfr = RandomForestClassifier()
rfr.fit(x_train, y_train)

此时,我们已经将模型拟合到处理过的训练集数据中。


4.评估模型性能

训练完成后,我们对训练集数据进行预测,并使用 R²(决定系数) 来评估模型的性能。R² 的值越接近 1,表示模型的拟合效果越好。

from sklearn.metrics import r2_score

# 预测训练集数据
y_pred = rfr.predict(x_train)

# 将预测结果四舍五入
y_pred = np.round(y_pred)

# 评估模型拟合效果
print("R² score:", r2_score(y_train, y_pred))

R² 值能够反映出模型对训练数据的拟合程度。在本例中,我们主要通过它来了解模型的效果。


5.处理测试数据

一旦训练完成并且模型评估良好,接下来我们需要对测试数据进行类似的预处理,包括缺失值处理和类别变量编码。

5.1 加载测试数据

# 加载测试集数据
datasets_test = pd.read_csv('test.csv')
datasets_test = datasets_test.drop(['Cabin'], axis=1)
x_test = datasets_test.iloc[:, 1:].values  # 特征矩阵

5.2 填补缺失值

我们为测试数据中的缺失值使用均值和频繁值填充策略。对于 Age 列,使用均值填充;而对于其他缺失值,我们选择使用 出现频率最多的值 进行填补。

# 填补 'Age' 列的缺失值
imputer_1 = SimpleImputer(missing_values=np.nan, strategy='mean')
x_test[:, 3:4] = imputer_1.fit_transform(x_test[:, 3:4])

# 对其他缺失值使用频繁值填充
imputer_2 = SimpleImputer(missing_values=np.nan, strategy='most_frequent')
x_test[:, :] = imputer_2.fit_transform(x_test[:, :])

# 对测试数据进行编码
x_test = ctr.transform(x_test)

6.生成预测结果并保存

在对测试数据进行预处理后,我们使用训练好的模型对测试数据进行预测。最终,我们将预测结果保存到 result.csv 文件中。

# 使用训练好的模型进行预测
y_test_pred = rfr.predict(x_test)

# 四舍五入预测结果
y_test_pred = np.round(y_test_pred)

# 读取 result.csv 文件并更新 'Survived' 列
data = pd.read_csv('result.csv')
for i in range(len(data['Survived'])):
    data.loc[i, 'Survived'] = y_test_pred[i]

# 保存更新后的结果
data.to_csv('result.csv', index=False)

最后,将保存好的csv文件提交到Kaggele即可获得预测率
这里我们只是通过简单的构建和处理,因此准确率还有待提升。
在这里插入图片描述


7.总结与展望

通过以上步骤,我们成功完成了泰坦尼克号生存预测模型的构建和测试数据的预测。本文主要使用了 随机森林分类器 和常见的数据预处理方法(如缺失值填充、类别变量编码等)。模型的预测效果依赖于数据的质量以及特征的选择,未来可以通过进一步优化特征工程或尝试其他机器学习算法来提升模型的表现。

此外,模型评估和超参数调优(如调整随机森林的树木数量、深度等)也是优化模型性能的关键步骤。希望这篇博客能帮助大家更好地理解数据预处理、模型构建及预测过程。如果你有任何问题,欢迎留言交流!

希望这篇博客对你理解线性回归和其应用有所帮助!
如有错误或笔误,请及时指出!😄
一起交流,一起学习,enjoy machine learning!🚀💡

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值