泰坦尼克号预测

  • 数据集下载
import urllib.request
import os

data_url="http://biostat.mc.vanderbilt.edu/wiki/pub/Main/DataSets/titanic3.xls"
data_file_path="data/titanic3.xls"#当前路径下需要存在data文件夹
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.")
  • 数据处理
import numpy
import pandas as pd
# 结果为DataFrame格式
df_data=pd.read_excel(data_file_path)
#数据摘要
df_data.describe()
#筛选有用的列
selected_cols=['survived','name','pclass','sex','age','sibsp','parch','fare','embarked']
selected_df_data=df_data[selected_cols]
#打乱顺序
selected_df_data=selected_df_data.sample(frac=1)
#缺失值填充
selected_df_data.isnull().sum()#或者isnull().any() #缺失值摘要
#将缺失值填充上平均值
age_mean_value=selected_df_data['age'].mean()
selected_df_data['age']=selected_df_data['age'].fillna(age_mean_value)

fare_mean_value=selected_df_data['fare'].mean()
selected_df_data['fare']=selected_df_data['fare'].fillna(fare_mean_value)

selected_df_data['embarked']=selected_df_data['embarked'].fillna('S')
#类别转换为编码
selected_df_data['sex']=selected_df_data['sex'].map({'female':0,'male':1}).astype(int)
selected_df_data['embarked']=selected_df_data['embarked'].map({'C':0,'Q':1,'S':2}).astype(int)
#删除表格中的name列
selected_df_data=selected_df_data.drop(['name'],axis=1)
selected_df_data[:3]
#将DataFrame转换为ndarray分离特征值和标签值
ndarray_data=selected_df_data.values
features = ndarray_data[:,1:]
label = ndarray_data[:,0]
  • 训练集划分
#特征值标准化处理
from sklearn import preprocessing

minmax_scale=preprocessing.MinMaxScaler(feature_range=(0,1))
norm_features=minmax_scale.fit_transform(features) #训练集和测试集都需要归一化
#划分训练集和测试集
train_size=int(len(norm_features)*0.8)
x_train = norm_features[:train_size]
y_train = label[:train_size]

x_test = norm_features[train_size:]
y_test = label[train_size:]
  • 模型构建与训练
import tensorflow as tf

model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units=64,
                               input_dim=7,
                               use_bias=True,
                               kernel_initializer='uniform',
                               bias_initializer='zeros',
                               activation='relu'))
#model.add(tf.keras.layers.Dropout(rate=0.3)) #随机丢弃
model.add(tf.keras.layers.Dense(units=32,
                               activation='relu'))
model.add(tf.keras.layers.Dense(units=16,
                               activation='sigmoid'))
#model.add(tf.keras.layers.Dropout(rate=0.3))
model.add(tf.keras.layers.Dense(units=1,
                               activation='sigmoid'))
model.summary()       

model.compile(optimizer=tf.keras.optimizers.Adam(0.003),
             loss='binary_crossentropy',
             metrics=['accuracy'])
#一个分类:sigmoid激活函数,配合损失函数binaty_crossentropy
#多个分类:softmax激活函数,配合损失函数categorical_crossentropy

#日志记录以及模型数据保存
logdir=os.path.join("logs")
#logdir='./logs'  # 坑:tensoeflow2.0.0回调时需要包装路径,否者无法训练模型
checkpoint_path='./checkpoint/Titanic.{epoch:02d}-{val_loss:.2f}.ckpt'

callbacks=[
    tf.keras.callbacks.TensorBoard(log_dir=logdir,
                                  histogram_freq=2),#直方图存储频率
    tf.keras.callbacks.ModelCheckpoint(filepath=checkpoint_path,
                                      save_weights_only=True,#只保存模型的参数,不保存模型结构
                                      verbose=1,
                                      period=5)#每5个epoch保存一次
] 
#模型训练
train_history=model.fit(x=x_train,
                       y=y_train,
                       validation_split=0.2,
                       epochs=100,
                       batch_size=40,
                       callbacks=callbacks, #回调
                       verbose=2)
#validation_split验证集所占比例
#verbose:
#        0:不显示 1:带进度条模式 2:每个epoch显示一行
#返回值
#返回值中存储的历史数据
train_history.history.keys()
#输出:dict_keys(['loss', 'accuracy', 'val_loss', 'val_accuracy'])
  • 数据可视化
#可视化
import matplotlib.pyplot as plt

def visu_tain_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'])
    plt.show()

visu_tain_history(train_history,'accuracy','val_accuracy')
visu_tain_history(train_history,'loss','val_loss')
  • 模型评估
#模型评估
evaluate_result=model.evaluate(x=x_test,y=y_test)
evaluate_result
#输出:[0.48514689630224506, 0.79389316]
#评估返回值含义
model.metrics_names
#输出:['loss', 'accuracy']
  • 模型应用
#模型应用
#surv_probability=model.predict(x_feature)
  • 模型恢复
#模型恢复
"""
#保存时的路径
logdir='./logs' 
checkpoint_path='./checkpoint/Titanic.{epoch:02d}-{val_loss:.2f}.ckpt'
checkpoint_dir=os.path.dirname(checkpoint_path)

latest=tf.train.latest_checkpoint(checkpoint_dir)

model.load_weights(latest)

#之后相当于训练完成的模型

#模型评估
loss,acc=model.evaluate(x_test,y_test)
.....
"""
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值