深度学习实现案例一:预测泰坦尼克号上旅客生还概率

最近一段时间因为比赛的原因,接触了一下深度学习的内容,真的勾起了我的兴趣,因为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)])
发布了47 篇原创文章 · 获赞 6 · 访问量 5213

猜你喜欢

转载自blog.csdn.net/qq_41705207/article/details/89481265
今日推荐