使用 Matplotlib 进行深度学习模型的数据可视化
介绍
对任何机器学习模型的性能进行可视化是一种简单的方法,可以理解从模型中输出的数据,并就影响机器学习模型的参数或超参数需要进行的更改做出明智的决定。在本指南中,我们将学习如何使用 Matplotlib 库可视化数据并将其与深度学习模型集成,以做出明智的决策并改进机器学习模型。
可视化的理由
评估欠拟合或过拟合:任何机器学习方法的主要困难之一是使模型具有通用性,以便能够很好地预测新数据(而不仅仅是已经训练过的数据)的合理结果。可视化多个时期的训练损失与验证损失或训练准确度与验证准确度是确定模型是否经过充分训练的好方法。这一点很重要,这样模型就不会训练不足或训练过度,以至于开始记忆训练数据,而这反过来会降低其准确预测的能力。
调整超参数:超参数(例如神经网络每层的节点数和网络中的层数)会对模型的性能产生重大影响。训练和验证集数据的适应度可视化有助于优化这些值并构建更好的模型。
Matplotlib 生成图形
我们将从 .csv 文件导入数据,然后将其分成三组:训练、验证和测试。训练数据将用于训练模型,而验证模型将用于测试模型的适应性。每次运行后,用户可以调整超参数,例如网络中的层数、每层的节点数、时期数等。这些调整主要用于反复试验,可视化工具(例如 Matplotlib 给出的图表)确实有助于获得理想的结果。测试集不得参与参数或超参数级别的训练练习。如果用户有意或无意地将测试数据用于训练目的,则测试数据将无法准确预测模型的泛化能力。
以下程序构建了二元分类的深度学习模型。数据分为三组:
- 训练集
- 验证集
- 测试集
原始数据集被分割,整个数据的 20% 被指定为测试集,其余的则作为训练集。训练集再次被分割,20% 被指定为验证集,其余的则用于训练目的。在整个数据集中,64% 被视为训练集,16% 被视为验证集,20% 被视为测试集。训练数据集被输入到三层神经网络;前两层各有四个节点,输出层只有一个节点。每个时期的模型损失和准确度数据存储在历史对象中。
import pandas as pd
import tensorflow as tf
from tensorflow import keras
from sklearn.model_selection import train_test_split
import numpy as np
import matplotlib.pyplot as plt
df = pd.read_csv('C:\\ml\\molecular_activity.csv')
properties = list(df.columns.values)
properties.remove('Activity')
print(properties)
X = df[properties]
y = df['Activity']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
X_train, X_val, y_train, y_val = train_test_split(X_train, y_train, test_size=0.2, random_state=1)
model = keras.Sequential([
keras.layers.Flatten(input_shape=(4,)),
keras.layers.Dense(4, activation=tf.nn.relu),
keras.layers.Dense(4, activation=tf.nn.relu),
keras.layers.Dense(1, activation=tf.nn.sigmoid),
])
model.compile(optimizer='adam',
loss='mse',
metrics=['accuracy'])
history = model.fit(X_train, y_train, epochs=34, batch_size=1, validation_data=(X_val, y_val))
以下代码片段绘制了训练损失与验证损失随周期数的变化图。这将有助于模型开发人员就需要做出的架构选择做出明智的决策。
loss_train = history.history['train_loss']
loss_val = history.history['val_loss']
epochs = range(1,35)
plt.plot(epochs, loss_train, 'g', label='Training loss')
plt.plot(epochs, loss_val, 'b', label='validation loss')
plt.title('Training and Validation loss')
plt.xlabel('Epochs')
plt.ylabel('Loss')
plt.legend()
plt.show()
输出
以下代码片段绘制了训练准确度与验证准确度随周期数的变化图。
loss_train = history.history['acc']
loss_val = history.history['val_acc']
epochs = range(1,11)
plt.plot(epochs, loss_train, 'g', label='Training accuracy')
plt.plot(epochs, loss_val, 'b', label='validation accuracy')
plt.title('Training and Validation accuracy')
plt.xlabel('Epochs')
plt.ylabel('Accuracy')
plt.legend()
plt.show()
输出
Epoch 1/10
345/345 [==============================] - 1s 2ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 2/10
345/345 [==============================] - 0s 1ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 3/10
345/345 [==============================] - 1s 2ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 4/10
345/345 [==============================] - 0s 1ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 5/10
345/345 [==============================] - 0s 1ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 6/10
345/345 [==============================] - 0s 1ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 7/10
345/345 [==============================] - 0s 1ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 8/10
345/345 [==============================] - 0s 1ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 9/10
345/345 [==============================] - 0s 1ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
Epoch 10/10
345/345 [==============================] - 1s 1ms/sample - loss: 0.3043 - acc: 0.6957 - val_loss: 0.3563 - val_acc: 0.6437
结论
可视化数据是使数据人性化的最佳方法之一,可以使其易于理解并从中获取相关趋势。当用户仍在尝试优化模型并使其投入生产时,此活动至关重要。Matplotlib 库提供了许多不同的工具来帮助完成此可视化过程。用户可以根据手头问题的需求选择创建图形,例如线图、直方图、三维图、蒸汽图、条形图、饼图、表格、散点图等。
附录
我已经编译了完整的数据集,可以在我的 GitHub上找到。
免责声明:本内容来源于第三方作者授权、网友推荐或互联网整理,旨在为广大用户提供学习与参考之用。所有文本和图片版权归原创网站或作者本人所有,其观点并不代表本站立场。如有任何版权侵犯或转载不当之情况,请与我们取得联系,我们将尽快进行相关处理与修改。感谢您的理解与支持!
请先 登录后发表评论 ~