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