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 |