在这篇博客中,我们将通过使用 随机森林分类器 (RandomForestClassifier) 来解决经典的 Kaggle 泰坦尼克号生存预测问题。我们的目标是使用机器学习模型来预测泰坦尼克号上的乘客是否能够生还。为了实现这一目标,我们将首先对数据进行处理,包括缺失值填充、类别变量编码等,然后训练一个分类模型,最后对测试集进行预测并保存结果。
目录
1.项目背景
泰坦尼克号是历史上最著名的沉船之一。该数据集包含了泰坦尼克号乘客的相关信息,并且目标是预测每个乘客是否能够生还。数据集中的特征包括乘客的基本信息(如姓名、年龄、性别等)和与生还情况相关的信息(如船舱、票价等)。通过这些特征,我们可以训练一个机器学习模型,来对每个乘客的生还情况进行预测。
2.数据加载与预处理
首先,我们需要加载数据并进行一些初步的预处理。数据预处理是机器学习中非常重要的一步,特别是对缺失值和类别变量的处理。
train.csv
数据集示例如下所示:
PassengerId | Survived | Pclass | Name | Sex | Age | SibSp | Parch | Ticket | Fare | Cabin | Embarked |
---|---|---|---|---|---|---|---|---|---|---|---|
1 | 0 | 3 | Braund, Mr. Owen Harris | male | 22 | 1 | 0 | A/5 21171 | 7.25 | S | |
2 | 1 | 1 | Cumings, Mrs. John Bradley (Florence Briggs Thayer) | female | 38 | 1 | 0 | PC 17599 | 71.2833 | C85 | C |
3 | 1 | 3 | Heikkinen, Miss. Laina | female | 26 | 0 | 0 | STON/O2. 3101282 | 7.925 | S | |
4 | 1 | 1 | Futrelle, Mrs. Jacques Heath (Lily May Peel) | female | 35 | 1 | 0 | 113803 | 53.1 | C123 | S |
5 | 0 | 3 | Allen, Mr. William Henry | male | 35 | 0 | 0 | 373450 | 8.05 | S | |
6 | 0 | 3 | Moran, Mr. James | male | NaN | 0 | 0 | 330877 | 8.4583 | Q |
官方对于数据集的解释:
对于这份数据集,我们应该重点关注以下几点数据:
- 乘客姓名
- 船票仓位
- 票价
当然了,这是一个入门的挑战,我们只需要用上这些数据去构建我们的模型就可以。
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 类别变量处理
数据中还包含一些类别变量,如 Sex
、Embarked
和 Pclass
。机器学习模型无法直接处理这些非数值型数据,因此我们需要使用 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!🚀💡