15.4 泰坦尼克号幸存者预测

titanic.zip 这是训练用到的csv文件


import tensorflow as tf
import numpy as np
import pandas as pd
#from tensorflow.keras import models, layers
import json
def dataPreProcess(df_data_in):
    # 创建一个新的DataFrame对象,用于存储清洗后的数据
    dfdata_process = pd.DataFrame()
    # Age属性处理----缺失值填充
    # dfdata_in['Aga']表示取出DataFrame中Age这一列
    dfdata_process['Age'] = df_data_in['Age'].fillna(df_data_in['Age'].mean())
    # Fare属性处理,取平均值
    dfdata_process['Fare'] = df_data_in['Fare'].fillna(df_data_in['Fare'].mean())
    # Embarked属性处理 one-hot编码
    embarked_onehot = pd.get_dummies(df_train_raw['Embarked'])
    # 替换为Embarked_C,Embarked_Q,Embarked_S
    embarked_onehot.columns = ['Embarked_' + str(x) for x in embarked_onehot.columns]
    dfdata_process = pd.concat([dfdata_process, embarked_onehot], axis=1)
    # sex属性处理 one-hot编码
    sex_onehot = pd.get_dummies(df_train_raw['Sex'])
    # 替换为Embarked_C,Embarked_Q,Embarked_S
    sex_onehot.columns = ['Embarked_' + str(x) for x in sex_onehot.columns]
    dfdata_process = pd.concat([dfdata_process, sex_onehot], axis=1)
    selected_cols = ['Pclass''SibSp''Parch']
    dfdata_process = pd.concat([dfdata_process, df_data_in[selected_cols].copy()], axis=1)
    return dfdata_process
# 文件位置自行修改
TRAIN_DATA_PATH = "D:/train.csv"
TEST_DATA_PATH = "D:/test.csv"
df_train_raw = pd.read_csv(TRAIN_DATA_PATH)
df_test_raw = pd.read_csv(TEST_DATA_PATH)
dftrain_process = dataPreProcess(df_train_raw)
print(dftrain_process)
dftest_process = dataPreProcess(df_test_raw)
models = tf.keras.models
layers = tf.keras.layers
model = models.Sequential()
model.add(layers.Dense(15, activation="relu", input_shape=(10,)))
model.add(layers.Dense(15, activation="relu"))
model.add(layers.Dense(1, activation='sigmoid'))
model.summary()
# 编译模式
model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.SGD(learning_rate=1e-3), metrics=['AUC'])
# 得到训练集中是否获救的数据,用于损失函数计算误差
dftrain_Serviced = df_train_raw['Survived']
history = model.fit(x=dftrain_process, y=dftrain_Serviced, batch_size=32, epochs=50, validation_split=0.2)
# 用训练模型计算测试集中乘客的生还概率
predict_result = model.predict(dftest_process)
# 将predict_result这个array中每个大于0.5的元素替换为1,否则为0
predict_result = np.where(predict_result >= 0.5, 1, 0)
pd_result = pd.DataFrame()
# predict_result原本是[418,1]的二维数组,降维为一维数组再赋值为列
pd_result['Survived'] = predict_result.reshape(-1)
pd_result['PassengerId'] = df_test_raw['PassengerId'].astype('Int32')
pd_result = pd_result[0:418]
# 把结果写入文件
pd_result.to_csv("predict_result.csv", index=False)
# 加载验证结果
pd_groundtrue = pd.read_csv('D:/gender_submission.csv')
print(np.mean(np.equal(pd_result['Survived'].to_numpy(), pd_groundtrue['Survived'].to_numpy())))
model.save('titanic_model.h5')
json.dump(history.history, open('history.json''w'))