指导教程: 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插件
结构化数据建模的流程
- 准备数据
- 定义模型
- 训练模型
- 评估模型
- 使用模型
- 保存模型
代码如下
代码中用的数据 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)