使用tensorflow构建泰坦尼克生存率预测模型(代码)

import urllib.request
import os
import numpy
import pandas as pd
from sklearn import preprocessing
import matplotlib.pyplot as plt
import keras

print(os.getcwd())
os.chdir(‘D:/Anaconda3/user’)
print(os.getcwd())

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.’)

#读取数据文件,结果为DataFrame格式
df_data=pd.read_excel(data_file_path)

print(df_data.describe())

print(df_data)

#筛选提取需要的特征字段,去掉ticket,cabin等
selected_cols=[‘survived’,‘name’,‘pclass’,‘sex’,‘age’,‘sibsp’,‘parch’,‘fare’,‘embarked’]

selected_df_data=df_data[selected_cols]
print(selected_df_data)

#有空值的特征会显示True
print(selected_df_data.isnull())

#有空值的到底有多少条记录
print(selected_df_data.isnull().sum())

#显示所有含空值的具体记录
print(selected_df_data[selected_df_data.isnull().values==True])

def prepare_data(df_data):
df=df_data.drop([‘name’],axis=1) #删除姓名列,留下8列
age_mean=df[‘age’].mean()
df[‘age’]=df[‘age’].fillna(age_mean) #为缺失age记录填充值
fare_mean=df[‘fare’].mean()
df[‘fare’]=df[‘fare’].fillna(fare_mean) #为缺失fare记录填充值
df[‘sex’]=df[‘sex’].map({‘female’:0,‘male’:1}).astype(int) #把sex值由字符串转换为数值
df[‘embarked’]=df[‘embarked’].fillna(‘S’) #为缺失embarked记录填充值
df[‘embarked’]=df[‘embarked’].map({‘C’:0,‘Q’:1,‘S’:2}).astype(int) #把embarked值由字符串转换为数值

ndarray_data=df.values #转换为ndarray数组
features=ndarray_data[:,1:] #后7列是特征值
label=ndarray_data[:,0]  #第0列是标签值

#特征值标准化
minmax_scale=preprocessing.MinMaxScaler(feature_range=(0,1))
norm_features=minmax_scale.fit_transform(features)

return norm_features,label

#打乱顺序,frac为抽取百分比
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:]

#建立Keras序列模型
model=keras.models.Sequential()

#加入第一层,输出神经元是64,输入特征数据是7列,是否使用偏置,权重的初始化方式,偏置初始化为零
model.add(keras.layers.Dense(units=64, input_dim=7, use_bias=True,kernel_initializer=‘uniform’,bias_initializer=‘zeros’, activation=‘relu’))

#加入第二层
model.add(keras.layers.Dense(units=32,activation=‘sigmoid’))

#输出层
model.add(keras.layers.Dense(units=1,activation=‘sigmoid’))

#模型摘要
print(model.summary())

#模型设置,sigmid激活函数一般选binary_crossentropy,而softmax激活函数一般选categorical_crossentropy
model.compile(optimizer=keras.optimizers.Adam(0.003), loss=‘binary_crossentropy’, metrics=[‘accuracy’])

#模型回调,保持最佳权重, 每5个周期保存一次
logdir=’./logs’
checkpoint_path = ‘./checkpoint/Titanic.{epoch:02d}.ckpt’
callbacks = [keras.callbacks.TensorBoard(log_dir=logdir,histogram_freq=2),
keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,save_weights_only=True,verbose=1,period=5)]

#模型训练,x是输入的特征数据,y是标签数据,validation_split验证集所占比例,verbose训练过程显示模式,返回值为训练过程的历史,包括loss和acc
train_history=model.fit(x=x_train,y=y_train,validation_split=0.2,epochs=100,callbacks=callbacks,batch_size=40,verbose=2)

#history存储训练过程所有状态
print(train_history.history)
print(train_history.history.keys())

#定义过程显示函数
#训练过程可视化
def visu_train_history(train_hostory,train_metric,validation_metric):
plt.plot(train_history.history[train_metric])
plt.plot(train_history.history[validation_metric])
plt.title(“Train history”)
plt.xlabel(‘epoch’)
plt.ylabel(train_metric)
plt.legend([‘train’,‘validation’],loc=‘upper left’)
plt.show()

visu_train_history(train_history,‘accuracy’,‘val_accuracy’)
visu_train_history(train_history,‘loss’,‘val_loss’)

#模型评估
print(‘evaluate:’)
evaluate_result=model.evaluate(x=x_test,y=y_test)
for i in range(len(evaluate_result)):
print(model.metrics_names[i],‘is’,evaluate_result[i])
print(model.metrics_names)

#模型应用
#Jack和Rose的旅客信息
print(“prediction:”)
Jack_info=[0,‘Jack’,3,‘male’,23,1,0,5.000,‘S’]
Rose_info=[1,‘Rose’,1,‘female’,20,1,0,100.000,‘S’]

#创建新的旅客DataFrame
new_passenger_pd=pd.DataFrame([Jack_info,Rose_info],columns=selected_cols)

#在老的DataFrame中加入新的旅客信息
all_passenger_pd=selected_df_data.append(new_passenger_pd)

#显示三个旅客的信息,包括Jack和Rose,以及最后一个旅客
print(all_passenger_pd[-3:])

#数据准备
x_features,y_label=prepare_data(all_passenger_pd)

#利用模型计算旅客生存概率
surv_probability=model.predict(x_features)

#显示五个旅客的生存概率
print(surv_probability[:5])

#在数据表最后一列插入生存概率
all_passenger_pd.insert(len(all_passenger_pd.columns),‘surv_probability’,surv_probability)

#显示五个旅客的信息,包括Jack和Rose,以及最后三个旅客
print(all_passenger_pd[-5:])

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值