最近一段时间因为比赛的原因,接触了一下深度学习的内容,真的勾起了我的兴趣,因为Python和机器学习的基础比较薄弱,在学习的时候也遇到了一些困难,不过我相信任何一个成功的案例都是从模仿开始的,所以开始的时候我按照书上的方法写了一些,中间也出了一些bug,但是最后还是有惊无险的运行出来了,写一篇纯属是为了巩固一下,没有误人子弟的意思哈。
案例的全称就是:Keras多层感知器预测泰坦尼克号上旅客的生存概率
其实无论多么复杂的问题,都是万变不离其宗,在深度学习方面更是这样,就是模拟人类的神经网络,通过多层的处理和优化,进一步达到与真实值相近的程度。
步骤:
1、数据预处理
2、建立模型
3、开始训练
4、评估模型准确率
因为图形编辑器还不是很会用,先用张图片吧,草台班子一样。
发现图片也不好用,直接键盘打吧
1、数据预处理
此次用的数据不再是常见的图片数据集,而是一个标准的Excel表格,所以在数据预处理进行数据的相应转换的时候,应该采取不同的处理方法。
这个阶段是在输入层之前进行操作,将产生的9个特征字段作为输入传进输入层中去。代码部分氛围两部分:一部分是数据的转化和处理,一部分是数据的分类和比例的划分。
直接粘上数据处理字段的代码了,不多说了:
from keras.models import Sequential
from keras.layers import Dense,Dropout
import urllib.request
import os
import tarfile
import pandas as pd
import numpy
from sklearn import preprocessing
file_path="E:\深度学习\Dataes/titanic3.xls"
all_df=pd.read_excel(file_path)
cols=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']
all_df=all_df[cols]
msk=numpy.random.rand(len(all_df))<0.8
train_df=all_df[msk]
test_df=all_df[~msk]
def PreprocessData(raw_df):
df = raw_df.drop(['name'], axis=1)
age_mean = df['age'].mean()
df['age'] = df['age'].fillna(age_mean)
fare_mean = df['fare'].mean()
df['fare'] = df['fare'].fillna(fare_mean)
df['sex'] = df['sex'].map({'female': 0, 'male': 1}).astype(int)
x_OneHot_df = pd.get_dummies(data=df, columns=["embarked"])
ndarray = x_OneHot_df.values
Features = ndarray[:, 1:]
Label = ndarray[:, 0]
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0, 1))
scaledFeatures = minmax_scale.fit_transform(Features)
return scaledFeatures, Label
train_Features,train_Label=PreprocessData(train_df)
test_Features,test_Label=PreprocessData(test_df)
这一段代码是最长的,页数最难理解的,其中导库的部分就不说了,后期画图以及数据的标准化都得用到相应的库,有关库的API就不是我现在需要详细掌握的了,为了能够直观的看出来,我把代码分一下:
file_path="E:\深度学习\Dataes/titanic3.xls"
all_df=pd.read_excel(file_path)
cols=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']
all_df=all_df[cols]
msk=numpy.random.rand(len(all_df))<0.8
train_df=all_df[msk]
test_df=all_df[~msk]
这几句代码实现了:首先将你的下载好的数据集通过pd.read_excel()进行读取,因为在预测生还概率的时候有一些数据是没有用处的,所以这里使用cols进行有效元素的筛检,删减完成后再将数据的项数返回。因为数据的总数一定,但是要拿出一部分来进行训练,一部分进行测试,所以利用msk将数据分为两部分,训练数据占了80%,测试数据占了20%,这就是将数据集进行了简单的分类和处理。
def PreprocessData(raw_df):
df = raw_df.drop(['name'], axis=1)
age_mean = df['age'].mean()
df['age'] = df['age'].fillna(age_mean)
fare_mean = df['fare'].mean()
df['fare'] = df['fare'].fillna(fare_mean)
df['sex'] = df['sex'].map({'female': 0, 'male': 1}).astype(int)
x_OneHot_df = pd.get_dummies(data=df, columns=["embarked"])
ndarray = x_OneHot_df.values
Features = ndarray[:, 1:]
Label = ndarray[:, 0]
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0, 1))
scaledFeatures = minmax_scale.fit_transform(Features)
return scaledFeatures, Label
以上的代码是数据处理的核心,已经用函数进行了封装
第一行是将那么字段进行删除,因为名字不会影响你的生还率。
第二、三行先使用df['age'.mean()的方法计算age字段的平均值age_mean,然后使用df['age'].fillna(age_mean)将null的值替换成平均值,说白了就是不能有null值。
第四、五行的原理与上面的相同,只不过是这里讲fare存在null值得字段替换成了平均值,其他的没有什么不同。
第六行,因为在后期进行训练的时候,不能出现单词或者字符,所以要将性别进行0和1的转换,这一句代码就是进行转换,“female”转换成0,“male”转换成1。
第七行,是将embarked(职业)进行一位有效编码(这个是常用的方法,在图像处理的时候,对有数字的Label进行这个操作),将embarked转换为三个字段。
第八行,为了后续的训练,必须将DataFrame转换为Array(也不是很明白)
第九、十行,进行features和label的提取,从代码中可以发现,label是一维的,其中冒号代表是提取所有项数,后面的数字才是label的标签字段,features的冒号也是代表提取所有项数,后面的1:代表提取1至后面所有的字段。
第十一行,使用preprocessing.MinMaxScaler进行标准化,输入参数设置标准化后的范围是0~1。
第十二行,使用minmax_scale.fit_transform对传入的Features进行标准化(不是很明白与上面的区别),反正经过两部的标准化后,字段全部都介于0~1之间。
这就是数据处理的最核心的部分。
2、建立模型
模型的整体框架:9个特征字段->输入层(9)->隐藏层1(40)->隐藏层2(30)->输出层(1)
每一层的的建立就是先搭好蛋糕架,然后再一层一层的想蛋糕架上放蛋糕,后面的操作相比数据处理上就好理解的多了。
model.add(Dense(units=40,input_dim=9,
kernel_initializer='uniform',
activation='relu'))
model.add(Dense(units=30,
kernel_initializer='uniform',
activation='relu'))
model.add(Dense(units=1,
kernel_initializer='uniform',
activation='sigmoid'))
代表了模型中的三个层次,其实是四个层次,但是输入层和第一隐藏层放在了一起,直接将数据放入隐藏层,代码中的三个层次分别代表了,输入层+隐藏层1、隐藏层2、输出层。
units:包含的神经元的数量。
input_dim:输入神经元的数量。
kernel_initializer:使用的正态分布的类型
activation:使用的激活函数(sigmoid函数代表的是以百分比显示)
3、开始训练
在开始之前,我们必须使用compile方法对模型进行设置
model.compile(loss='binary_crossentropy',
optimizer='adam',metrics=['accuracy'])
compile方法设置
loss:损失函数,在这里使用交叉熵的方法。
optimizer:设置优化器,使得训练更加快捷和高效
metrics:评估模型的方式是准确度。
然后开始训练:
train_history=model.fit(x=train_Features,
y=train_Label,
validation_split=0.1,
epochs=30,
batch_size=30,verbose=2)
输入训练的参数值,x,y分别代表的是特征值和真实值。
validation_split=0.表示分配的比例,训练数据占比90%。
epoch代表的是训练的周数。
batch_size代表得是每一周期训练的数据的数量
verbose=2表示显示训练过程
4评估模型准确率
scores=model.evaluate(x=test_Features,
y=test_Label)
两行代码,用evaluate方法进行评估,这样进基本的学习模型就已经完成了。
PS:后面还有有关电影中两位主角信息的加入的问题,和上面的是一样的,就不在赘述了,有点累了,后面附上完整的代码,参考一下吧,可能代码上和局部分析的有些出入,一局部的为准。
代码:
#使用多层感知预测泰坦尼克号生存概率
#导入神经网络层建立的函数
from keras.models import Sequential
from keras.layers import Dense,Dropout
import urllib.request
import os
import tarfile
import pandas as pd
import numpy
from sklearn import preprocessing
file_path="E:\深度学习\Dataes/titanic3.xls"
all_df=pd.read_excel(file_path)
cols=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']
all_df=all_df[cols]
msk=numpy.random.rand(len(all_df))<0.8
train_df=all_df[msk]
test_df=all_df[~msk]
def PreprocessData(raw_df):
df = raw_df.drop(['name'], axis=1)
age_mean = df['age'].mean()
df['age'] = df['age'].fillna(age_mean)
fare_mean = df['fare'].mean()
df['fare'] = df['fare'].fillna(fare_mean)
df['sex'] = df['sex'].map({'female': 0, 'male': 1}).astype(int)
x_OneHot_df = pd.get_dummies(data=df, columns=["embarked"])
ndarray = x_OneHot_df.values
Features = ndarray[:, 1:]
Label = ndarray[:, 0]
minmax_scale = preprocessing.MinMaxScaler(feature_range=(0, 1))
scaledFeatures = minmax_scale.fit_transform(Features)
return scaledFeatures, Label
train_Features,train_Label=PreprocessData(train_df)
test_Features,test_Label=PreprocessData(test_df)
model=Sequential()
model.add(Dense(units=40,input_dim=9,
kernel_initializer='uniform',
activation='relu'))
model.add(Dense(units=30,
kernel_initializer='uniform',
activation='relu'))
model.add(Dense(units=1,
kernel_initializer='uniform',
activation='sigmoid'))
model.compile(loss='binary_crossentropy',
optimizer='adam',metrics=['accuracy'])
train_history=model.fit(x=train_Features,
y=train_Label,
validation_split=0.1,
epochs=30,
batch_size=30,verbose=2)
#show_train_history(train_history,'acc','val_acc')
#show_train_history(train_history,'loss','val_loss')
scores=model.evaluate(x=test_Features,
y=test_Label)
jack=pd.Series([0,'jack',3,'male',23,1,0,5.0000,'S'])
rose=pd.Series([1,'rose',1,'female',20,1,0,100.0000,'S'])
jr_df=pd.DataFrame([list(jack),list(rose)],
columns=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked'])
all_df=pd.concat([all_df,jr_df])
all_Features,Label=PreprocessData(all_df)
all_probability=model.predict(all_Features)
print(all_probability[:10])
pd=all_df
pd.insert(len(all_df.columns),
'probability',all_probability)
print(pd[-2:])
print(pd[(pd['survived']==0)&(pd['probability']>0.9)])