7.4泰坦尼克号生存预测

7.4泰坦尼克号生存预测

接下来几节,我们来做一个实际的例子,用逻辑回归对真实的泰坦尼克号乘客数据进行建模。你可以去这个地址下载数据。

在机器学习领域,数据清洗,数据准备是非常重要的一步。但这不是我们这门课的重点,今天我们针对这个示例数据,做一些简单的数据准备工作。

7.4.1查看数据

数据准备的第一步工作,是对数据进行探索,观察你要进行建模分析的数据。

打开其中的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 0 0 330877 8.4583 Q
7 0 1 McCarthy, Mr. Timothy J male 54 0 0 17463 51.8625 E46 S
8 0 3 Palsson, Master. Gosta Leonard male 2 3 1 349909 21.075 S
9 1 3 Johnson, Mrs. Oscar W (Elisabeth Vilhelmina Berg) female 27 0 2 347742 11.1333 S
10 1 2 Nasser, Mrs. Nicholas (Adele Achem) female 14 1 0 237736 30.0708 C

其中列的含义如下:

列名 含义说明
PassengerId 乘客的唯一编号(标识符),每位乘客对应一个 ID
Survived 是否生还(0 = 没有生还,1 = 生还)
Pclass 舱位等级(1 = 一等舱,2 = 二等舱,3 = 三等舱)
Name 乘客姓名
Sex 性别(male = 男,female = 女)
Age 年龄(单位:岁,部分为空表示未知)
SibSp 同船的兄弟姐妹或配偶的数量(Siblings/Spouses Aboard)
Parch 同船的父母或子女的数量(Parents/Children Aboard)
Ticket 船票号码
Fare 船票价格(单位:英镑)
Cabin 舱位号(可能缺失)
Embarked 登船港口(C = Cherbourg,Q = Queenstown,S = Southampton)

7.4.2去除列

首先我们识别哪些列对我们预测乘客是否存活无关,然后将它们从数据集中去除。其中PassengerId列,Name列,Ticket列这三列和乘客生存没有明显关系,可以去除。另外仓位号(Cabin)有大量缺失值,也从数据中去除。

7.4.3去除行

有很少部分的乘客的年龄是缺失的,我们去除这些数据样本,删除缺失年龄数据的样本。

7.4.4独热编码

根据我们之前学习的逻辑回归,它只能处理连续变量。但是我们数据中的Sex(性别)和Embarked(登陆港口)两个特征列的取值都是从一组字符串中进行选择的。比如Sex是从[“male”,“female”]中选择的。这种特征,我们叫做离散特征。

我们今天介绍一种将离散特征转变成连续特征的编码方式,这就是独热编码。

独热编码的原理比较简单,原始离散特征有几个离散取值,就生成几个列。每个样本在这几个列的取值,只能是0或者1。比如原始Sex列,就转化为Sex_male和Sex_female两列,如果某个乘客是男性,则Sex_male列的值就是1,Sex_female列的值就是0。

同样对于Embarked列,就新生成Embarked_C,Embarked_Q,Embarked_S列。如果一个乘客是从Cherbourg登船的,则Embarked_C列值为1,Embarked_Q,Embarked_S列取值为0。

可以发现对于独热编码而言,每个离散列,假如有N个可能的取值,就新生成N列。而且对于每个样本,在这N个列里,只有一列取值为1,其他列取值都为0,这也是为什么它被叫做独热编码的原因。

7.4.5处理代码

使用pandas库可以方便的处理数据,你需要在你使用的conda env里安装pandas库。
处理的代码如下:

import pandas as pd

pd.set_option('display.max_columns', None)#打印时显示所有列。

# 从CSV文件读取数据(确保你有正确的路径)
df = pd.read_csv(r"<YOUR_DATA_PATH>\titanic\train.csv")

# 去除不需要的列
df = df.drop(columns=["PassengerId", "Name", "Ticket", "Cabin"])

# 去除 Age 缺失的样本
df = df.dropna(subset=["Age"])

# 对 Sex 和 Embarked 做独热编码
df = pd.get_dummies(df, columns=["Sex", "Embarked"],dtype=int)

print(df.head(10))

7.4.6处理后的数据

处理后的示例数据如下:

Survived Pclass Age SibSp Parch Fare Sex_female Sex_male Embarked_C Embarked_Q Embarked_S
0 3 22.0 1 0 7.2500 0 1 0 0 1
1 1 38.0 1 0 71.2833 1 0 1 0 0
1 3 26.0 0 0 7.9250 1 0 0 0 1
1 1 35.0 1 0 53.1000 1 0 0 0 1
0 3 35.0 0 0 8.0500 0 1 0 0 1
0 1 54.0 0 0 51.8625 0 1 0 0 1
0 3 2.0 3 1 21.0750 0 1 0 0 1
1 3 27.0 0 2 11.1333 1 0 0 0 1
1 2 14.0 1 0 30.0708 1 0 1 0 0
1 3 4.0 1 1 16.7000 1 0 0 0 1
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容