用tensorflow解决Kaggle上Titanic问题

用tensorflow 解决 Titanic v1

  • 库文件

import pandas as pd
from tensorflow import keras
import matplotlib.pyplot as plt
import os
  • 引入数据

PATH = './titanic'
train_data = pd.read_csv(os.path.join(PATH, 'train.csv'))
test_data = pd.read_csv(os.path.join(PATH, 'test.csv'))
print('训练集信息:')
train_data.info()
print('测试集信息:')
test_data.info()
predId = test_data['PassengerId']
  • 数据清洗

def arrange(df):
    df = df.drop('Name', axis=1)
    df['Age'] = df['Age'].fillna(df['Age'].mean())
    df['Embarked'] = df['Embarked'].fillna('S')
    df['Cabin'] = df['Cabin'].fillna('U')  # U表示未知,因为缺失过多
    df['Sex'] = df['Sex'].apply(lambda x: 1 if x == 'male' else 0)
    # 对登船港口(Embarked)进行独热编码,然后连接到原数据
    embarkedDf = pd.get_dummies(df['Embarked'], prefix='Embarked')
    df = pd.concat([df, embarkedDf], axis=1).drop('Embarked', axis=1)
    # 对客舱等级(Pclass)进行独热编码,然后连接
    pclassDf = pd.get_dummies(df['Pclass'], prefix='Pclass')
    df = pd.concat([df, pclassDf], axis=1).drop('Pclass', axis=1)
    # 提取客舱特征
    df['Cabin'] = df['Cabin'].apply(lambda x: ord(x[0]) - ord('A'))  # 取每个客舱的首字母作为客舱类别
    # cabinDf = pd.get_dummies(df['Cabin'], 'Cabin')
    # df = pd.concat([df, cabinDf], axis=1).drop('Cabin', axis=1)
    df = df.drop('PassengerId', axis=1).drop('Ticket', axis=1)
    return df
  • 整理训练集和预测集

train_data = arrange(train_data)
train_x = train_data.drop('Survived', axis=1)
train_y = train_data['Survived']
print('整理后训练集:')
print(train_x.head())
print(train_x.shape)
test_data = arrange(test_data)
  • 建立模型

model = keras.Sequential()
model.add(keras.layers.InputLayer(input_shape=(12)))
model.add(keras.layers.Dense(20, activation='relu'))
model.add(keras.layers.Dense(20, activation='relu'))
model.add(keras.layers.Dense(20, activation='relu'))
model.add(keras.layers.Dense(1, activation='sigmoid'))
model.compile(optimizer='adam', loss=keras.losses.binary_crossentropy, metrics=['accuracy'])
model.summary()
  • 开始训练

epochs = 100
history = model.fit(x=train_x, y=train_y, batch_size=32, epochs=epochs, validation_split=0.2)
  • 取得结果

loss = history.history['loss']
acc = history.history['accuracy']
val_loss = history.history['val_loss']
val_acc = history.history['val_accuracy']
  • 画趋势图

plt.figure(figsize=(16, 8))

plt.subplot(1, 2, 1)
plt.plot(range(epochs), acc, label='Train acc')
plt.plot(range(epochs), val_acc, label='Val acc')
plt.legend(loc='lower right')
plt.title('Train and Val accuracy')

plt.subplot(1, 2, 2)
plt.plot(range(epochs), loss, label='Train loss')
plt.plot(range(epochs), val_loss, label='Val loss')
plt.legend(loc='lower right')
plt.title('Train and Val loss')

plt.show()

趋势图

  • 保存模型并进行预测

  • 保存模型
model.save('model_v1.h5')
  • 进行预测
pred_y = model.predict_classes(test_data)
pred_y = pred_y.astype(int)
pred_y = pd.Series(map(lambda x: x[0], pred_y))
  • 整理预测结果

predDf = pd.DataFrame(
    {'PassengerId': predId,
     'Survived': pred_y})
print('测试结果预览:', predDf.head())
  • 保存结果

predDf.to_csv('pred_v1.csv')
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值