FNN泰塔尼克旅客数据集–预处理

1.下载数据集

import urllib.request
import os

url = 'http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.xls'
filepath = 'titanic3.xls'

if not os.path.isfile(filepath):
    result = urllib.request.urlretrieve(url,filepath)
    print('download:',result)
2.使用pandas dataframe读取数据并进行预处理
(1)导入所需模块

import numpy
import pandas as pd
(2)读取excel
下面的程序使用pandas所提供的read_excel方法把xls文件读取到all_df

all_df = pd.read_excel(filepath)
(3)查看前两项数据

pclass               ...                                       home.dest
0       1               ...                                    St Louis, MO
1       1               ...                 Montreal, PQ / Chesterville, ON
 
[2 rows x 14 columns]
(4)把需要的字段选取到DataFrame中
以上字段中的ticket(船票号码),cabin(舱位号码),我们认为与要预测的结果survived(是否生存)关联不大,所以我们将其忽略,只选择下列字段到DataFrame中

cols = ['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']
all_df = all_df[cols]
(5)显示筛选后的数据

   survived                            name   ...         fare embarked
0         1   Allen, Miss. Elisabeth Walton   ...     211.3375        S
1         1  Allison, Master. Hudson Trevor   ...     151.5500        S
[2 rows x 9 columns]
还需要处理的问题
name 姓名字段在预测阶段会使用,但训练时不需要,必须先删除
age 有几项数据的age字段是null,所以必须将null改为平均值
fare有几项数据的fare字段是null,所以必须将null改为平均值
sex性别字段是文字,我们必须将其转换为0或1
embarked分类特征字段有3个分类,C,Q,S,必须使用one-hot encoding进行转换
3.使用pandas dataframe 进行数据预处理
(1)将name字段删除

df = all_df.drop(['name'],axis=1)
(2)找出含有null值的字段
我们可以使用下列指令找出含有null值得字段

print(df.isnull().sum())
 
survived      0
pclass        0
sex           0
age         263
sibsp         0
parch         0
fare          1
embarked      2
dtype: int64
(3)将age字段为null的数据替换成平均值
下面的程序代码先使用df[‘age’].mean()方法计算age字段的平均值age_mean,然后使用df[‘age’].fillna(age_mean)将null值替换成平均值

age_mean = df['age'].mean()
df['age'] = df['age'].fillna(age_mean)
(4)将fare字段为null的数据替换成平均值

fare_mean = df['fare'].mean()
df['fare'] = df['fare'].fillna(fare_mean)
(5)转换性别字段为0或1
原本性别字段是文字,我们必须转换为0与1,这样后续才能进行机器学习训练。以下程序代码使用map方法将female转换为0,male转换为1

df['sex'] = df['sex'].map({'female':0,'male':1}).astype(int)
(6)将embarked字段进行一位有效编码转换
pandas提供了一个很方便的方法进行一位有效编码转换,使用get_dummies()传入下列参数
data:要转换的DataFrame,在此输入df
columns:要转换的字段,在此输入[‘embarked’]

x_OneHot_df = pd.get_dummies(data=df,columns=['embarked’])
 
   survived  pclass  sex     ...      embarked_C  embarked_Q  embarked_S
0         1       1    0     ...               0           0           1
1         1       1    1     ...               0           0           1
 
[2 rows x 10 columns]
4.将DataFrame转换为Array
因为后续要进行深度学习训练,所以必须先将DataFrame转换为Array
(1)DataFrame转换为Array

ndarray = x_OneHot_df.values
(2)查看ndarray的shape
print(ndarray.shape)
(1309, 10)
(3)查看ndarray的前两项数据
可以使用下列指令来查看ndarray的前两项字段

[[   1.        1.        0.       29.        0.        0.      211.3375
     0.        0.        1.    ]
[   1.        1.        1.        0.9167    1.        2.      151.55      0.
     0.        1.    ]]
(4)提取feature和label
可以使用下列python slice语句来提取feature和label
Label = ndarray[:,0]
Features = ndarray[:,1:]
以上程序代码说明,ndarray共有二维,第一维是项数,第二维是字段。
(5)查看前两项label标签特征字段
[ 1.  1.]
(6)查看前两项feature特征字段

[[   1.        0.       29.        0.        0.      211.3375    0.        0.
     1.    ]
[   1.        1.        0.9167    1.        2.      151.55      0.        0.
     1.    ]]
从以上执行结果可知,因为数值特征字段不同,例如年龄29岁,运费211元等,数字差异很大,没有一个共同的标准。这时就要使用标准化让所有数值都在0与1之间,使数值特征字段有共同标准,进行标准化可以提高训练后模型的准确率。
5.将ndarray特征字段进行标准化
我们将使用sklearn提供的preprocessing数据预处理模块进行标准化
(1)导入sklearn的数据预处理模块

from sklearn import preprocessing
(2)建立MinMaxScaler标准化刻度minmax_scale
我们将使用preprocessing.MinMaxScaler来进行标准化,需输入参数feature_range设置标准化之后的范围0-1之间

minmax_scale = preprocessing.MinMaxScaler(feature_range=(0,1))
(3)使用minmax_scaler.fit_transform进行标准化
然后使用minmax_scale.fit_transform传入参数Feature进行标准化。程序代码如下:

scaledFeatures = minmax_scale.fit_transform(Features)
(4)查看标准化之后的特征字段前两项数据

[[ 0.          0.          0.36116884  0.          0.          0.41250333
   0.          0.          1.        ]
[ 0.          1.          0.00939458  0.125       0.22222222  0.2958059
   0.          0.          1.        ]]
6.将数据分为训练数据与测试数据
因为后面要进行深度学习模型的训练,所以必须将数据分为训练数据与测试数据
(1)将数据以随机方式分为训练数据和测试数据

msk = numpy.random.rand(len(all_df)) < 0.8
train_df = all_df[msk]
test_df = all_df[~msk]
(2)显示训练数据与测试数据项数

total: 1309 train: 1042 test: 267