MachineLearning入门---第3章---TensorFlow的结构化数据建模流程

指导教程: https://github.com/lyhue1991/eat_tensorflow2_in_30_days

python版本 3.7.5  下载地址 https://www.python.org/ftp/python/3.7.5/python-3.7.5-amd64.exe
tensorflow 2.7.0 cpu版 : pip install tensorflow-cpu==2.7.0
开发环境: Idea + python插件

结构化数据建模的流程

  1. 准备数据
  2. 定义模型
  3. 训练模型
  4. 评估模型
  5. 使用模型
  6. 保存模型

代码如下
代码中用的数据 https://github.com/lyhue1991/eat_tensorflow2_in_30_days/tree/master/data/titanic

# -*- coding: utf-8 -*-

import pandas as pd
import matplotlib.pyplot as plt
from tensorflow.keras import models, layers
import tensorflow as tf


# 获取训练数据
def get_train_data():
    dftrain_raw = pd.read_csv('./data/titanic/train.csv')
    return dftrain_raw


# 测试数据
def get_test_data():
    dftest_raw = pd.read_csv('./data/titanic/test.csv')
    return dftest_raw


# 数据预处理
def preprocessing(dfdata):
    dfresult = pd.DataFrame()
    # Pclass 票类别  get_dummies函数的作用 one hot encode
    # 即: 独热编码,又称一位有效编码,其方法是使用N位状态寄存器来对N个状态进行编码,每个状态都有它独立的寄存器位,并且在任意时候,其中只有一位有效。
    dfPclass = pd.get_dummies(dfdata['Pclass'])
    dfPclass.columns = ['Pclass_' + str(x) for x in dfPclass.columns]
    # 数据拼接 axis: 需要合并链接的轴,0是行,1是列
    dfresult = pd.concat([dfresult, dfPclass], axis=1)
    # Sex 性别
    dfSex = pd.get_dummies(dfdata['Sex'])
    dfresult = pd.concat([dfresult, dfSex], axis=1)
    # Age
    dfresult['Age'] = dfdata['Age'].fillna(0)
    dfresult['Age_null'] = pd.isna(dfdata['Age']).astype('int32')
    # SibSp(配偶个数),Parch(父母/孩子个数),Fare(票价)
    dfresult['SibSp'] = dfdata['SibSp']
    dfresult['Parch'] = dfdata['Parch']
    dfresult['Fare'] = dfdata['Fare']
    # Carbin(所在船舱)
    dfresult['Cabin_null'] = pd.isna(dfdata['Cabin']).astype('int32')
    # Embarked(登船港⼝)
    dfEmbarked = pd.get_dummies(dfdata['Embarked'], dummy_na=True)
    dfEmbarked.columns = ['Embarked_' + str(x) for x in dfEmbarked.columns]
    dfresult = pd.concat([dfresult, dfEmbarked], axis=1)
    return dfresult


# 显示评估模型
def plot_metric(history, metric):
    train_metrics = history.history[metric]
    val_metrics = history.history['val_' + metric]
    epochs = range(1, len(train_metrics) + 1)
    plt.plot(epochs, train_metrics, 'bo--')
    plt.plot(epochs, val_metrics, 'ro-')
    plt.title('Training and validation ' + metric)
    plt.xlabel("Epochs")
    plt.ylabel(metric)
    plt.legend(["train_" + metric, 'val_' + metric])
    plt.show()


if __name__ == '__main__':
    # 获取训练数据
    dftrain_raw = get_train_data()
    x_train = preprocessing(dftrain_raw)
    y_train = dftrain_raw['Survived'].values

    # 定义模型  使⽤Sequential按层顺序构建模型
    # 销毁当前的TF图并创建一个新图 有助于避免旧模型/图层混乱。
    tf.keras.backend.clear_session()
    # Sequential()方法是一个容器,描述了神经网络的网络结构
    model = models.Sequential()
    # 添加全连接层  输出维度20   激活函数 relu   输入模型  input_shape是指输入张量的shape
    model.add(layers.Dense(20, activation='relu', input_shape=(15,)))
    model.add(layers.Dense(10, activation='relu'))
    model.add(layers.Dense(1, activation='sigmoid'))
    # 输出模型各层的参数状况
    model.summary()

    # 配置训练方法
    # model.compile()方法用于在配置训练方法时,告知训练时用的优化器、损失函数和准确率评测标准
    # optimizer = 优化器 , loss = 损失函数 , metrics = ["准确率”]
    model.compile(optimizer='adam',
                  loss='binary_crossentropy',
                  metrics=['AUC'])

    # 使用model.fit()方法来执行训练过程,
    history = model.fit(x_train, y_train,  # 输入和标签
                        batch_size=64,  # 进行梯度下降时每个batch包含的样本数64
                        epochs=30,  # 迭代次数 30
                        validation_split=0.2  # 分割⼀部分训练数据⽤于验证
                        )

    # 显示评估模型
    plot_metric(history, "loss")


    # 使用测试数据进行验证
    dftest_raw = get_test_data()
    x_test = preprocessing(dftest_raw)
    y_test = dftest_raw['Survived'].values
    # 验证数据
    evaluate = model.evaluate(x=x_test, y=y_test)
    print("验证结果: ")
    print(evaluate)

    # 使用模型预测概率
    predict = model.predict(x_test[0:10])
    print("使用模型预测概率")
    print(predict)

    #
    #  保存模型: TensorFlow原⽣⽅式保存
    #
    # 保存模型结构与模型参数到⽂件,该⽅式保存的模型具有跨平台性便于部署
    model.save('./data/tf_model_savedmodel', save_format="tf")
    del model  # 删除现有模型
    print('重新加载模型')
    model_loaded = tf.keras.models.load_model('./data/tf_model_savedmodel')
    # 使用测试数据 验证
    loaded_evaluate = model_loaded.evaluate(x_test, y_test)
    print('重新加载模型 验证数据结果')
    print(loaded_evaluate)

猜你喜欢

转载自blog.csdn.net/xy3233/article/details/121685006