30天吃掉那只tensorflow之(1):泰坦尼克号沉船生还预测学习思路整理

1. 数据集获取、分割

kaggle 上有数据集,但是我只找到了训练集没有找到测试集合,所以我准备将训练集中的一部分拿出来当作测试集,以下是我分割训练集和测试集的代码。
下载网址: https://www.kaggle.com/chickgod/train-tatanic

  • 原文件叫 tatanic.csv
  • 训练集文件叫 tatanic_train.csv
  • 测试集文件叫 tatanic_test.csv
import csv
import pandas as pd

# 把全部的数据读进来
with open('tatanic.csv','r') as f:
    o_file = csv.reader(f)

# 每 8 个数据抽取一个做测试集
    counter = 0
    for row in o_file:
        if counter % 8 == 0:
            with open('tatanic_test.csv','a',newline='') as f2:
                writer = csv.writer(f2)
                writer.writerow(row)
        else:
            with open('tatanic_train.csv','a',newline='') as f3:
                writer = csv.writer(f3)
                writer.writerow(row)
        counter += 1

## 这样操作之后,原来 csv 的标题行会被写入 tatanic_test.csv 中,但是不会写入 tatanic_train.csv 中
## 所以这里需要在 tatanic_train.csv 文件中重新加上标头行

csv_file = pd.read_csv('tatanic.csv')
title_line = csv_file.columns


train_file = pd.read_csv('tatanic_train.csv', header=None)
train_file.columns = title_line
train_file.to_csv('tatanic_train.csv')

错误写法:

csv_file = pd.read_csv('tatanic.csv')
title_line = csv_file.columns

train_file = pd.read_csv('tatanic_train.csv', header=None)
train_file.to_csv('tatanic_train.csv',columns=title_line)

不可以直接在写入 csv 文件的时候指定 column,原因我也不知道是什么,总之大家注意一下

2. 数据的可视化

2.1 生还者和没生还者的比例

## 生还的人和没生还的比例
csv_doc = pd.read_csv('tatanic.csv')
df = pd.DataFrame(csv_doc)

survive = df['Survived']
static_data = survive.value_counts()
print(static_data)
x_axis = [str(i) for i in static_data.keys()]
y_axis = static_data.values
plt.bar(x_axis,y_axis)
plt.show()

在这里插入图片描述

2.2 年龄分布

#######年龄分布

age_info = df['Age']
plt.hist(age_info,bins=20,color='skyblue')
plt.show()

在这里插入图片描述

2.3 性别分布

#### 男女比例

sex_info = df['Sex']
statistic_data = sex_info.value_counts()
x_axis = [i for i in statistic_data.keys()]
y_axis = statistic_data.values
plt.bar(x_axis,y_axis)
plt.show()

在这里插入图片描述

2.3 所有变量的相关性

corr_metrix = df.corr(method='pearson')
print(corr_metrix)
sns.heatmap(corr_metrix,annot=True,cmap=palettable.cmocean.diverging.Curl_10.mpl_colors)
# sns.heatmap(corr_metrix,annot=True)
plt.show()

在这里插入图片描述

3. 数据预处理

import pandas as pd

# 有些特征没有用可以直接过滤掉,比如 passengerID,Name,Ticket


def processing(df_doc):

    df_result = pd.DataFrame()

    #### Pclass 转成one-hot编码
    df_doc_Pclass = pd.get_dummies(df_doc['Pclass'])
    df_doc_Pclass.columns = ['Pclass' + str(i) for i in df_doc_Pclass.columns]
    df_result = pd.concat((df_result,df_doc_Pclass),axis=1)


    #### Name 不要了

    #### sex 转换成独热码

    df_doc_Sex = pd.get_dummies(df_doc['Sex'])
    df_result = pd.concat((df_result,df_doc_Sex),axis=1)


    #### age 不需要转换直接添加, 因为存在空值,所以需要加一项辅助判断是否有空值

    df_result = pd.concat((df_result,df_doc['Age'].fillna(0)),axis=1)
    df_age_is_null = df_doc['Age'].isna().astype('int32')
    df_result['Age_is_null'] = df_age_is_null
    print(df_result)

    #### SibSp	Parch	Fare 作为数字特征直接搬过来  Ticket 不重要,直接舍去

    df_result = pd.concat((df_result,df_doc['SibSp'],df_doc['Parch'],df_doc['Fare']),axis=1)


    #### 对于 cabin 这一列的空值,我们不进行填充,但是增加辅助列 cabin_null 作为辅助特征
    df_result['Cabin_null'] = pd.isna(df_doc['Cabin']).astype('int32')

    #### embarked 一共分三类用独热编码处理

    df_doc_embarked = pd.get_dummies(df_doc['Embarked'])
    df_result = pd.concat((df_result,df_doc_embarked),axis=1)
    print(df_result)
    return df_result


if __name__ == '__main__':

    df_doc_train = pd.read_csv('tatanic_train.csv')
    df_doc_train = pd.DataFrame(df_doc_train)

    df_doc_test = pd.read_csv('tatanic_test.csv')
    df_doc_test = pd.DataFrame(df_doc_test)

    df_train_data = processing(df_doc_train)
    df_train_label = df_doc_train['Survived'].values
    df_test_data = processing(df_doc_test)
    df_test_label = df_doc_test['Survived'].values

注释写的挺详细的,需要的自己看一下吧~

4. 建立模型

import tensorflow as tf
from tensorflow.keras import layers, models

def model(train_data,train_label):
    model = models.Sequential()
    model.add(layers.Dense(20, activation='relu', input_shape=(15,)))
    model.add(layers.Dense(40, activation='relu'))
    model.add(layers.Dense(80, activation='relu'))
    model.add(layers.Dense(40, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))

    model.compile(optimizer='adam', loss='binary_crossentropy', metrics=["AUC"])
    record = model.fit(train_data,train_label, batch_size=64, epochs=30, validation_split=0.2)
    return model, record

特别注意,这里一定要用 tensorflow.keras 而不要直接从 keras 里面import layer模块和models模块,否则会报以下错误:

    raise TypeError("Using a `tf.Tensor` as a Python `bool` is not allowed. "
TypeError: Using a `tf.Tensor` as a Python `bool` is not allowed. Use `if t is not None:` instead of `if t:` to test if a tensor is defined, and use TensorFlow ops such as tf.cond to execute subgraphs conditioned on the value of a tensor.
  • 模块导入的时候改成 from tensorflow.keras import models, layers 问题就解决了
  • 在训练模型 fit 的时候,我们用 record 变量来接受这个训练的过程,把所有的训练的信息都保存在了 record 里,可以方便后面用 record 里的数据来进行作图

5. 训练模型

model, record = model(df_train_data,df_train_label)

训练的部分是用 fit 函数来进行的,这里调用刚才定义的 model 进行训练 ,训练后返回 model 和 record;
在这里插入图片描述

6. 查看训练过程数据

    loss = record.history['loss']
    auc = record.history['auc']
    val_loss = record.history['val_loss']
    val_auc = record.history['val_auc']

    print(loss)
    print(auc)
    print(val_loss)
    print(val_auc)

在这里插入图片描述

注意!! 只有在 fit 函数里面设置了 validation_split 才会有 val_lossval_auc 否则只有 loss 和 auc

7. 训练数据可视化

  • 将要画的数据通过 pandas 进行结构化处理;
  • 这里把 lossval_loss 放在一个 dataframe
  • 使用 seaborn 这个库来进行图像绘制,是 matplotlib 的更高级封装,画出的图更好看,更强大
###### loss 曲线
    import matplotlib.pyplot as plt
    import seaborn as sns
    df = pd.DataFrame({'loss':loss,'val_loss':val_loss})
    sns.scatterplot(data=df)
    sns.lineplot(data=df)
    plt.show()

在这里插入图片描述


    ##### auc 曲线 #### val_auc 曲线

    df2 = pd.DataFrame({'auc':auc,'val_auc':val_auc})
    sns.scatterplot(data=df2)
    sns.lineplot(data=df2)
    plt.show()

在这里插入图片描述

8. 模型保存

8.1 Keras 的方式保存和读取

8.1 Keras 方式保存模型(不能跨平台,只能python使用)
    #### 整个模型保存

    model.save('./model.h5')

    #### 只保存权重

    model.save_weights('./model_weights.h5')

    #### 保存模型结构

    structure = model.to_json()
8.2 Keras 方式重新加载模型和参数
	#### 重新加载模型结构和参数
    model = models.load_model('./model.h5')
    evaluation = model.evaluate(df_test_data,df_test_label)


    #### 重新加载参数
    #(1) 需要先重新恢复模型的结构
    model_structure = models.model_from_json(json_string=structure)
    model_structure.compile(        # 重新把所有的模块连接起来并指定优化器、损失和 metrics
        optimizer='adam',
        loss='binary_crossentropy',
        metrics=['AUC']
    )

    #(2) 再载入模型的参数
    model_structure.load_weights('./model_weights.h5')
    # 用加载出来的模型进行评估测试
    evaluation = model_structure.evaluate(df_test_data,df_test_label)  		

8.2 Tensorflow 原生的方式保存和读取

在这里插入图片描述

  • 存储的时候,只是在后面多了个参数设置 save_format = 'tf'
  • tensorflow 存储权重的时候有后缀 ckpt 但是存储整个模型的时候是存到一个文件夹里面
  • 读取的时候还是用的 tensorflow 中的 keras 的模块来进行加载

9. 写在后面

以上所有模块都是在 30天吃掉那只 tensorflow 的源代码基础上进行重写,重新思考和添加或删减的,如果有错误或者不能精准实现功能,请自行进行调整,毕竟每个人的思路都不是一样的,有错误望指正

  • 1
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

暖仔会飞

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值