从sklearn开始机器学习 3泰坦尼克号多种算法

2023/1/4回来翻旧账了,突然发现这边挖了个坑 没有填,很难受,数据处理咱就是说也没有那么容易,奈何我三天打鱼两天晒网,进度奇慢无比。于是下面的东西也咕咕咕,重新改一个很简单的教学notebook。

说明

咱就是说这个坑该填了,参考文章为kaggle上一个点赞很高的教学方案,这里再次贴一下网址,要用一个比较新的url按钮,哈哈哈。

很详细English

环境的话,可以使用自己搭的jupyter notebook,好像kaggle也提供了运行代码的环境,或者现在好多云平台也有jupyter notebook的环境可以使用。

搭建很简单的,直接pip install就行了,我之前写过怎么安装。

准备工作

下载数据文件

下载数据地址(我是从kaggle下载的)(有三个文件分别是train.csv训练数据,test.csv测试数据,gender_submission.csv提交数据案例可忽略

三个文件简单介绍一下:

  • train.csv:训练用的数据文件,包含了待会下面显示的所有字段信息,用于训练模型。
  • test.csv:预测集,通过使用训练出来的模型预测乘客是否存活,包含了除Survived的所有字段。
  • gender_submission.csv:上传的预测结果的文件示例,为什么带gender因为里面的是否存活是按照乘客性别是否是女性来决定的(只是一个示例文件,男的死了,女的没死)。
字段 描述
Passengerld 乘客编号
Survived 是否幸存
Pclass 船票等级
Name 乘客姓名
Sex 乘客性别
SibSp 亲戚数量(兄妹、配偶数)
Parch 亲戚数量(父母、子女数)
Ticket 船票号码
Fare 船票价格
Cabin 船舱
Embarked 登陆港口

这边贴上了翻译过后的数据字段。

安装需要的库

本方法所需要的库仅有三个,但是正常数据处理需要的库我也写了下来。

1
2
3
4
5
6
pip install numpy
pip install pandas
pip install scikit-learn
#以上三个是本实验需要的,然后正常还会使用
pip install scipy
pip install matplotlib

这个有个坑就是,sklearn的库名字不叫sklearn,但是你直接pip install会装另一个东西而不会保错就很坑。

正式开始数据处理

这里就直接贴python代码了,因为实在notebook里面运行的,所以。。。有啥所以。

1
2
3
4
5
6
7
8
9
import numpy as np    #导入numpy库,数值运算的一个库,具体可以百度
import pandas as pd #导入pandas库,这个库是基于numpy的数据分析的库,这里用来读取CSV文件很方便。

import os
for dirname, _, filenames in os.walk('F:/Py/jupyter/ML/titanic'):
for filename in filenames:
print(os.path.join(dirname, filename))
#这一段是用来打印指定目录下有什么文件的,调用了os库
#运行结果如下,可以看到我的数据文件存放路径

F:/Py/jupyter/ML/titanic\gender_submission.csv
F:/Py/jupyter/ML/titanic\solution.ipynb
F:/Py/jupyter/ML/titanic\test.csv
F:/Py/jupyter/ML/titanic\train.csv
F:/Py/jupyter/ML/titanic.ipynb_checkpoints\solution-checkpoint.ipynb

1
2
3
train_data = pd.read_csv("F:/Py/jupyter/ML/titanic/train.csv")
train_data.head()
# 这里用pandas库的read_csv方法读取指定路径的文件,然后使用head()方法默认查看文件的前五条数据,实际上891条训练数据已经导入python了。

1
2
3
test_data = pd.read_csv("F:/Py/jupyter/ML/titanic/test.csv")
test_data.head()
# 这里读取预测集,可以看出预测集比训练集少了一个Survived字段,即是否存活。

这里提出了一个猜想,因为给的提交文件实例的名称为gender_submission.csv,里面的有两个字段,一个是PassengerId,还有一个就是Survived。 里面的结果就是男的都死了,女的都没死,那么就仅根据男的都死了,女的都没死,猜测一下示例预测文件的准确度。

1
2
3
4
5
women = train_data.loc[train_data.Sex == 'female']["Survived"]
rate_women = sum(women)/len(women)

print("% of women who survived:", rate_women)
# 这里的操作是把训练文件中的,所有女性存活的数量除以女性总数的一个百分数。

% of women who survived: 0.7420382165605095

1
2
3
4
5
men = train_data.loc[train_data.Sex == 'male']["Survived"]
rate_men = sum(men)/len(men)

print("% of men who survived:", rate_men)
# 这里是把训练文件中男性存活的数量除以男性总数的一个结果。

% of men who survived: 0.18890814558058924

从上面的两个数据我们可以看出,其实实例文件的预测准确性还是蛮高的,因为在测试数据中大概有74%的女性存活了下来,而男性的存活率仅为将近19%。 从这里可以看出,性别是一个影响很大的因素,对于是否幸存来说。

下面有个小坑,就是如果没装sklearn的库会报错,但是包名居然不叫sklearn,坑死我了。 pip install scikit-learn 千万不要直接sklearn,装下来不知道什么沙雕玩意,就无语。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
from sklearn.ensemble import RandomForestClassifier  #导入随机森林分类器 这里如果报错就是sklearn的库没装。

y = train_data["Survived"] #选择y为是否幸存的标签

features = ["Pclass", "Sex", "SibSp", "Parch"] #特征选择了船票等级、性别、兄妹配偶数、子女数
X = pd.get_dummies(train_data[features]) #将训练集特征离散化,例如将性别转换成0和1
X_test = pd.get_dummies(test_data[features]) #将测试集的特征离散化

model = RandomForestClassifier(n_estimators=100, max_depth=5, random_state=1) #创建随机树模型,参数为树木数量,树的最大深度,随机数。
model.fit(X, y) #训练模型拟合数据
predictions = model.predict(X_test) #对测试集进行预测

output = pd.DataFrame({'PassengerId': test_data.PassengerId, 'Survived': predictions}) #使用pandas对结果进行输出
output.to_csv('submission.csv', index=False) #将结果输出为submission.csv
print("预测结果保存成功")

预测结果保存成功。

然后这个titanic的随机森林解决方案就出来了,没有经历过调参和数据清洗,但是作为新手代码运行起来才是最重要的。下次更新优化方案。


从sklearn开始机器学习 3泰坦尼克号多种算法
https://steammilk.com/2022/11/05/2022-all/titanic/
作者
蒸奶泡
发布于
2022年11月5日
更新于
2025年1月8日
许可协议