参考资料:

https:///AaronJny/simple_titanic

https://zhuanlan.zhihu.com/p/30538352

https://www.jianshu.com/p/9a5bce0de13f


1. 查看数据集

import pandas as pd

# 读取数据集
train_data = pd.read_csv('Data/train.csv')
test_data = pd.read_csv('Data/test.csv')
# 打印信息
train_data.info()

python泰坦尼克号数据预处理 泰坦尼克号 数据挖掘_缺失值

   以上特征含义为:

  1. PassengerId 乘客编号
  2. Survived 是否幸存
  3. Pclass 船票等级
  4. Name 乘客姓名
  5. Sex 乘客性别
  6. SibSp、Parch 亲戚数量
  7. Ticket 船票号码
  8. Fare 船票价格
  9. Cabin 船舱
  10. Embarked 登录港口

2. 特征选择

根据经验,认为乘客编号、乘客姓名、船票号码、船舱跟逃生几率无关,所以初步选择 ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked'] 作为训练特征。从打印出来的数据可以发现,序号是891个,但是并不是所有的特征都满足891,所以某些特征存在缺失值。

# 选择用于训练的特征
features = ['Pclass', 'Sex', 'Age', 'SibSp', 'Parch', 'Fare', 'Embarked']
x_train = train_data[features]
x_test = test_data[features]

y_train=train_data['Survived']

# 检查缺失值
x_train.info()
print('-'*100)
x_test.info()

 

python泰坦尼克号数据预处理 泰坦尼克号 数据挖掘_数据_02


3. 特征缺失值处理

所以我们发现,训练数据中的Age,Embarked,测试数据 Age,Fare,Embarked。送入模型中的标签和特征要可以一一对应,所以要么丢掉特征不完整的样本,要么填充。秉着尽可能使用样本的态度,我们选择填充特征。

如何补全数据集呢?最简单的方法:对于数值型数据,可以使用其平均值/中位数填补空值,尽量减小填补值对结果的影响。对于类别数据,可以使用众数来填补。稍微进阶一些的,可以借助其他辅助特征:例如测试数据中Fare缺失的数据,每个乘客的Ticket是唯一的,无法通过查找相同的票号加个来填补,但是,船票价格往往跟 Pclass (客舱等级)及 Cabin(客舱号)有关的,因此使用具有相同PclassCabin的中位数或着众数来填补。 

这里先采用最简单的方法进行填补。

# 使用平均年龄来填充年龄中的nan值
x_train['Age'].fillna(x_train['Age'].mean(), inplace=True)
x_test['Age'].fillna(x_test['Age'].mean(),inplace=True)

# 使用票价的均值填充票价中的nan值
x_test['Fare'].fillna(x_test['Fare'].mean(),inplace=True)

# 使用登录最多的港口来填充登录港口的nan值
print x_train['Embarked'].value_counts()
x_train['Embarked'].fillna('S', inplace=True)
x_test['Embarked'].fillna('S',inplace=True)

4. 特征值转换为特征向量

机器学习中,送入模型的是矩阵,而上述特征中并不是所有的特征都是数值型的,需要把一些非数值型的特征转为数值。例如性别,我们可以简单的想到“0”,“1”来代表,那么“Embarked”的"C","Q","S" 要选择用“0”,“1”,“2”来代替吗?若两个特征之间的距离是,d(C, Q) = 1, d(Q, S) = 1, d(C, S) = 2。那么C和S工作之间就越不相似吗?显然这样的表示,计算出来的特征的距离是不合理。那如果使用one-hot编码,则得到C = (1, 0, 0), Q= (0, 1, 0), S = (0, 0, 1),那么两个工作之间的距离就都是sqrt(2).即每两个特征之间的距离是一样的,显得更合理。因此,我们使用 one-hot编码。

# 将特征值转换成特征向量
dvec=DictVectorizer(sparse=False)

x_train=dvec.fit_transform(x_train.to_dict(orient='record'))
x_test=dvec.transform(x_test.to_dict(orient='record'))

# 打印特征向量格式
print (dvec.feature_names_)

因此,将特征值转换为特征向量后的格式:

python泰坦尼克号数据预处理 泰坦尼克号 数据挖掘_python泰坦尼克号数据预处理_03

例如打印一条数据,具体内容:

print (x_train[100])

python泰坦尼克号数据预处理 泰坦尼克号 数据挖掘_缺失值_04

特征向量的值与上面的名称一一对应。