Keras神经网络实现泰坦尼克号旅客生存预测

介绍

参考资料:
网易云课堂的深度学习应用开发TensorFlow实践(https://mooc.study.163.com/learn/2001396000?tid=2403007001#/learn/content?type=detail&id=2403345467&cid=2403363412)
https://blog.csdn.net/qq_36235046/article/details/80588465?utm_source=app
BP神经网络教学课件_图文_百度文库

数据集介绍

在这里插入图片描述
在这里插入图片描述
boat(船),body(身体),home(家庭地址)看起来没什么用,删去。

算法

应用多层神经网络实现:
在这里插入图片描述
采用6层神经网络,各层神经元都使用全连接的方式。

学习器

神经网络的前向传播公式:
在这里插入图片描述
w i j 表 示 上 一 层 的 第 j 个 神 经 元 到 这 一 层 第 i 个 神 经 元 的 权 值 ; w_{ij}表示上一层的第j个神经元到这一层第i个神经元的权值; wijji x j 为 上 一 层 第 j 个 神 经 元 的 输 出 , x_j为上一层第j个神经元的输出, xjj − θ i = 上 一 层 的 b 乘 以 它 到 这 一 层 的 第 i 个 神 经 元 的 权 值 -θ_i=上一层的b乘以它到这一层的第i个神经元的权值 θi=bi y = f ( x ) 为 激 活 函 数 y=f(x)为激活函数 y=f(x) y i 为 这 一 层 的 第 i 个 神 经 元 的 输 出 y_i为这一层的第i个神经元的输出 yii
输出层:
在这里插入图片描述
t l 为 输 出 期 望 值 , O l 为 神 经 网 络 输 出 层 的 真 实 值 。 t_l为输出期望值,O_l为神经网络输出层的真实值。 tlOl
误差反向传播:
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
权值更新:
在这里插入图片描述
这 里 的 T l i 是 最 后 一 层 隐 藏 层 到 输 出 层 的 权 值 这里的T_{li}是最后一层隐藏层到输出层的权值 Tli
总结:
在这里插入图片描述

分类器

分为两类:生存和遇难。
根据神经网络输出层输出的y,y>0.5,判断此旅客生存;否则,判断此旅客死亡。
y p r e d i c t = { 0 ( 遇 难 ) , y o u t > 0.5 1 ( 幸 存 ) , y o u t < = 0.5 y_{predict}=\begin{cases} 0(遇难), & {y_{out}>0.5} \\ 1(幸存), & {y_{out}<=0.5} \end{cases} ypredict={0(),1(),yout>0.5yout<=0.5

实现

数据下载与导入

#获取数据
data_url="http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.xls"#下载网址
data_file_path="data/titanic3.xls"
if not os.path.isfile(data_file_path):
    result=urllib.request.urlretrieve(data_url,data_file_path)
    print('downloaded',result)
else:
    print(data_file_path,'data file already exists.')
df_data=pd.read_excel(data_file_path)#读excel
selected_cols=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']#挑出需要的列
selected_df_data=df_data[selected_cols]

预处理

数据有缺失,需要估计填补(目前以平均值填补)。
文字数据需要转化为数字。
所有变量都要归一化处理。

    #数据处理
def prepare_data(df_data):
    df=df_data.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)#文字转化为数字表示
    df['embarked']=df['embarked'].fillna('S')#缺失值用最多的值取代
    df['embarked']=df['embarked'].map({'C':0,'Q':1,'S':2}).astype(int)#文字转化为数字表示
    ndarray_data=df.values
    features=ndarray_data[:,1:]#没有生存情况
    label=ndarray_data[:,0]#生存情况
    minmax_scale=preprocessing.MinMaxScaler(feature_range=(0,1))
    norm_features=minmax_scale.fit_transform(features)#归一化
    return norm_features,label

shuffled_df_data=selected_df_data.sample(frac=1)#打乱顺序
x_data,y_data=prepare_data(shuffled_df_data)
train_size=int(len(x_data)*0.8)#80%的数据训练,20%的数据测试
x_train=x_data[:train_size]#训练数集
y_train=y_data[:train_size]
x_test=x_data[train_size:]#测试数集
y_test=y_data[train_size:]

建立模型

Sequential模型:堆叠,通过堆叠许多层可以构建非常复杂的神经网络,包括全连接神经网络、卷积神经网络(CNN)、循环神经网络(RNN)、等等。
Dense就是常用的全连接层,所实现的运算是output = activation(dot(input, kernel)+bias)。其中activation是逐元素计算的激活函数,kernel是本层的权值矩阵,bias为偏置向量,只有当use_bias=True才会添加。
units:代表该层的输出维度;activation:激活函数;use_bias: 布尔值,是否使用偏置项;kernel_initializer:权值初始化方法;bias_initializer:偏置向量初始化方法。
Dropout将在训练过程中每次更新参数时按一定概率(rate)随机断开输入神经元,Dropout层用于防止过拟合。
compile:用来配置模型的学习过程,其参数optimizer:优化器;loss:字符串(预定义损失函数名)或目标函数;metrics:列表,包含评估模型在训练和测试时的网络性能的指标。
Sigmoid函数:
在这里插入图片描述
ReLU函数:
在这里插入图片描述
Adam 通过计算梯度的一阶矩估计和二阶矩估计而为不同的参数设计独立的自适应性学习率。
binary_crossentropy:;交叉熵损失函数,一般用于二分类。

model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=96,
                                input_dim=7,
                                use_bias=True,
                                kernel_initializer='uniform',
                                bias_initializer='zeros',
                                activation='relu'))
model.add(tf.keras.layers.Dropout(rate=0.2))#减少过拟合
model.add(tf.keras.layers.Dense(units=64,activation='relu'))
model.add(tf.keras.layers.Dropout(rate=0.2))
model.add(tf.keras.layers.Dense(units=32,activation='sigmoid'))
model.add(tf.keras.layers.Dropout(rate=0.2))
model.add(tf.keras.layers.Dense(units=16,activation='sigmoid'))
model.add(tf.keras.layers.Dropout(rate=0.2))
model.add(tf.keras.layers.Dense(units=1,activation='sigmoid'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss='binary_crossentropy',
              metrics=['accuracy'])

训练

fit:训练模型
x:输入数据;y:标签;batch_size:指定进行梯度下降时每个batch包含的样本数;nb_epoch:整数,训练的轮数;verbose:日志显示,0为不在标准输出流输出日志信息,1为输出进度条记录,2为每个epoch输出一行记录;validation_split:0~1之间的浮点数,用来指定训练集的一定比例数据作为验证集,验证集将不参与训练,并在每个epoch结束后测试的模型的指标,如损失函数、精确度等。

train_history=model.fit(x=x_train,
                        y=y_train,
                        validation_split=0.2,
                        epochs=100,
                        batch_size=40,
                        verbose=2)

可视化

画出准确度和损失率的变化

def visu_train_history(train_history,train_metric,validation_metric):
    plt.plot(train_history.history[train_metric])
    plt.plot(train_history.history[validation_metric])
    plt.title('Train History')
    plt.ylabel(train_metric)
    plt.xlabel('epoch')
    plt.legend(['train','validation'],loc='upper left')
    plt.show()
visu_train_history(train_history,'acc','val_acc')
visu_train_history(train_history,'loss','val_loss')

评估,预测

评估:


evaluate_result=model.evaluate(x=x_test,y=y_test)
print("自带评估:",evaluate_result)

y_pred=model.predict(x_test)
for i in range(len(y_pred)):
    if y_pred[i]>0.5:
        y_pred[i]=1
    else:
        y_pred[i]=0
print("评估:")
print(classification_report(y_test,y_pred))

预测:

#加入Jack和Rose
Jack_infor=[0,'Jack',3,'male',23,1,0,5.000,'S']
Rose_infor=[1,'Rose',1,'female',20,1,0,100.000,'S']
new_passenger_pd=pd.DataFrame([Jack_infor,Rose_infor],columns=selected_cols)#创建新旅客的表单
all_passenger_pd=selected_df_data.append(new_passenger_pd)#与旧的合成
x,y=prepare_data(all_passenger_pd)
y_pre=model.predict(x[-2:,:])
print("Jack与Rose,")
for i in range(len(y_pre)):
    print("生存概率:",y_pre[i])
elapsed = (time.clock() - start)
print("Time used:",elapsed)

结果

准确率
在这里插入图片描述
损失:
在这里插入图片描述
评估与预测:
在这里插入图片描述

代码

# -*- coding: utf-8 -*-


import urllib.request
import os
import numpy
import pandas as pd
from sklearn import preprocessing
import tensorflow as tf
import matplotlib.pyplot as plt
import time
from sklearn.metrics import classification_report
start = time.clock()

data_url="http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.xls"
data_file_path="data/titanic3.xls"
if not os.path.isfile(data_file_path):
    result=urllib.request.urlretrieve(data_url,data_file_path)
    print('downloaded',result)
else:
    print(data_file_path,'data file already exists.')
    
df_data=pd.read_excel(data_file_path)
selected_cols=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']
selected_df_data=df_data[selected_cols]

def prepare_data(df_data):
    df=df_data.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)
    df['embarked']=df['embarked'].fillna('S')
    df['embarked']=df['embarked'].map({'C':0,'Q':1,'S':2}).astype(int)
    ndarray_data=df.values
    features=ndarray_data[:,1:]
    label=ndarray_data[:,0]
    minmax_scale=preprocessing.MinMaxScaler(feature_range=(0,1))
    norm_features=minmax_scale.fit_transform(features)
    return norm_features,label

def visu_train_history(train_history,train_metric,validation_metric):
    plt.plot(train_history.history[train_metric])
    plt.plot(train_history.history[validation_metric])
    plt.title('Train History')
    plt.ylabel(train_metric)
    plt.xlabel('epoch')
    plt.legend(['train','validation'],loc='upper left')
    plt.show()

shuffled_df_data=selected_df_data.sample(frac=1)
x_data,y_data=prepare_data(shuffled_df_data)
train_size=int(len(x_data)*0.8)
x_train=x_data[:train_size]
y_train=y_data[:train_size]
x_test=x_data[train_size:]
y_test=y_data[train_size:]

model=tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=96,
                                input_dim=7,
                                use_bias=True,
                                kernel_initializer='uniform',
                                bias_initializer='zeros',
                                activation='relu'))
model.add(tf.keras.layers.Dropout(rate=0.2))#减少过拟合,概率为0.2
model.add(tf.keras.layers.Dense(units=64,activation='relu'))
model.add(tf.keras.layers.Dropout(rate=0.2))
model.add(tf.keras.layers.Dense(units=32,activation='sigmoid'))
model.add(tf.keras.layers.Dropout(rate=0.2))
model.add(tf.keras.layers.Dense(units=16,activation='sigmoid'))
model.add(tf.keras.layers.Dropout(rate=0.2))
model.add(tf.keras.layers.Dense(units=1,activation='sigmoid'))
model.compile(optimizer=tf.keras.optimizers.Adam(0.001),
              loss='binary_crossentropy',
              metrics=['accuracy'])#交叉熵损失函数,一般用于二分类

train_history=model.fit(x=x_train,
                        y=y_train,
                        validation_split=0.2,
                        epochs=100,
                        batch_size=40,
                        verbose=2)

visu_train_history(train_history,'acc','val_acc')
visu_train_history(train_history,'loss','val_loss')

evaluate_result=model.evaluate(x=x_test,y=y_test)
print("自带评估:",evaluate_result)

y_pred=model.predict(x_test)
for i in range(len(y_pred)):
    if y_pred[i]>0.5:
        y_pred[i]=1
    else:
        y_pred[i]=0
print("评估:")
print(classification_report(y_test,y_pred))

#加入Jack和Rose
Jack_infor=[0,'Jack',3,'male',23,1,0,5.000,'S']
Rose_infor=[1,'Rose',1,'female',20,1,0,100.000,'S']
new_passenger_pd=pd.DataFrame([Jack_infor,Rose_infor],columns=selected_cols)#创建新旅客的表单
all_passenger_pd=selected_df_data.append(new_passenger_pd)#与旧的合成
x,y=prepare_data(all_passenger_pd)
y_pre=model.predict(x[-2:,:])
print("Jack与Rose,")
for i in range(len(y_pre)):
    print("生存概率:",y_pre[i])
elapsed = (time.clock() - start)
print("Time used:",elapsed)

  • 5
    点赞
  • 48
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
好的,下面是一个使用神经网络模型实现泰坦尼克号生存分类的示例代码。这个模型将使用 TensorFlow 框架实现。 首先,我们需要导入必要的库和数据集: ```python import tensorflow as tf import pandas as pd import numpy as np # 加载训练集和测试集 train_data = pd.read_csv('train.csv') test_data = pd.read_csv('test.csv') # 取出特征和标签 train_x = train_data.drop(['Survived'], axis=1) train_y = train_data['Survived'] test_x = test_data ``` 接下来,我们需要对数据进行预处理。我们将使用 One-hot 编码将分类特征转换为数字特征,并将缺失值替换为平均值: ```python # 对分类特征进行 One-hot 编码 train_x = pd.get_dummies(train_x) test_x = pd.get_dummies(test_x) # 替换缺失值为平均值 train_x = train_x.fillna(train_x.mean()) test_x = test_x.fillna(test_x.mean()) ``` 然后,我们需要构建神经网络模型。我们将使用 3 个全连接层和一个输出层: ```python # 定义神经网络模型 model = tf.keras.Sequential([ tf.keras.layers.Dense(64, activation='relu', input_shape=(train_x.shape[1],)), tf.keras.layers.Dense(32, activation='relu'), tf.keras.layers.Dense(16, activation='relu'), tf.keras.layers.Dense(1, activation='sigmoid') ]) # 编译模型 model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy']) ``` 接下来,我们可以训练模型并进行预测: ```python # 训练模型 model.fit(train_x, train_y, epochs=50, batch_size=64) # 进行预测 predictions = model.predict(test_x) predictions = np.round(predictions).astype(int) # 将预测结果保存到文件中 submission = pd.DataFrame({'PassengerId': test_data['PassengerId'], 'Survived': predictions.reshape(-1)}) submission.to_csv('submission.csv', index=False) ``` 最后,我们将预测结果保存到文件中,以便提交到 Kaggle 竞赛中进行评估。 这就是一个使用神经网络模型实现泰坦尼克号生存分类的示例代码。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值