深度学习可视化:从数据生成到神经网络训练,基于make_moons、make_circles、make_blobs
一、代码分块解释🎯
1.1 导入库
import matplotlib.pyplot as plt
from sklearn.datasets import make_moons, make_circles, make_blobs
import numpy as np
import tensorflow as tf
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
import matplotlib.font_manager as fm
matplotlib.pyplot
: 用于绘制图形。sklearn.datasets
: 包含了生成各种数据集的函数,如make_moons
,make_circles
, 和make_blobs
。numpy
: 一个用于数组操作的库。tensorflow
: 一个用于构建和训练机器学习模型的库。tensorflow.keras.models.Sequential
: 用于构建神经网络模型。tensorflow.keras.layers.Dense
: 用于构建全连接层。sklearn.model_selection.train_test_split
: 用于划分数据集为训练集和测试集。sklearn.preprocessing.StandardScaler
: 用于标准化数据。matplotlib.font_manager
: 用于管理字体。
1.2 数据生成和可视化
def generate_and_plot_data():
# 使用 make_moons 生成两类数据并绘制散点图
X_moons, y_moons = make_moons(n_samples=400, noise=0.1, random_state=42)
plt.figure(figsize=(8, 6))
plt.scatter(X_moons[:, 0], X_moons[:, 1], c=y_moons, cmap=plt.cm.Paired, edgecolor='k')
plt.title("Two Moons Dataset")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
# 使用 make_circles 生成三类数据并绘制散点图
X_circles, y_circles = make_circles(n_samples=300, noise=0.2, factor=0.5, random_state=42)
y_circles = np.where((X_circles[:, 0] ** 2 + X_circles[:, 1] ** 2) > 0.7, 2, y_circles)
plt.figure(figsize=(8, 6))
plt.scatter(X_circles[:, 0], X_circles[:, 1], c=y_circles, cmap=plt.cm.Paired, edgecolor='k')
plt.title("Three Circles Dataset")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
# 使用 make_blobs 生成四类数据并绘制散点图
X_blobs, y_blobs = make_blobs(n_samples=400, centers=4, random_state=42)
plt.figure(figsize=(8, 6))
plt.scatter(X_blobs[:, 0], X_blobs[:, 1], c=y_blobs, cmap=plt.cm.Paired, edgecolor='k')
plt.title("Four Blobs Dataset")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
return X_moons, y_moons
make_moons
,make_circles
, 和make_blobs
: 用于生成不同类型的二维数据集。make_moons
生成两个交错半圆的数据集。make_circles
生成同心圆数据集。make_blobs
生成高斯分布的点簇。
plt.scatter
: 绘制散点图。plt.figure
,plt.title
,plt.xlabel
,plt.ylabel
,plt.show
: 用于设置和显示图形。
1.3 构建和训练神经网络分类器
def train_neural_network(X, y):
# 标准化数据
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.3, random_state=42)
# 构建神经网络模型
model = Sequential([
Dense(10, activation='relu', input_shape=(2,)),
Dense(10, activation='relu'),
Dense(1, activation='sigmoid')
])
# 编译模型
model.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
# 训练模型
history = model.fit(X_train, y_train, epochs=50, validation_split=0.2, verbose=0)
# 评估模型
train_accuracy = model.evaluate(X_train, y_train, verbose=0)[1]
test_accuracy = model.evaluate(X_test, y_test, verbose=0)[1]
print(f"训练准确率: {train_accuracy:.2f}")
print(f"测试准确率: {test_accuracy:.2f}")
# 绘制训练过程中的损失和准确率变化
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.title('训练和验证损失')
plt.xlabel('轮次')
plt.ylabel('损失')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('训练和验证准确率')
plt.xlabel('轮次')
plt.ylabel('准确率')
plt.legend()
plt.show()
-
标准化数据:
StandardScaler
用于将数据的均值调整为0,方差调整为1。fit_transform
方法应用于训练数据来学习缩放参数,并且将这些参数应用于数据。
-
划分数据集:
train_test_split
将数据分为训练集和测试集,通常以 70:30 的比例。
-
构建神经网络模型:
Sequential
构建一个顺序模型。Dense
构建全连接层:- 第一层:10个神经元,激活函数为 ReLU,输入形状为2(因为我们的数据是二维的)。
- 第二层:10个神经元,激活函数为 ReLU。
- 输出层:1个神经元,激活函数为 sigmoid(因为这是一个二分类问题)。
-
编译模型:
compile
方法设置优化器(Adam),损失函数(二分类交叉熵),以及评估指标(准确率)。
-
训练模型:
fit
方法用于训练模型,训练50个epochs,并将20%的训练数据用作验证集。
-
评估模型:
evaluate
方法用于计算训练集和测试集的准确率。
-
绘制训练过程中的损失和准确率变化:
plt.plot
用于绘制训练和验证损失、准确率随训练轮次的变化情况。
1.4 主函数
if __name__ == "__main__":
X_moons, y_moons = generate_and_plot_data()
train_neural_network(X_moons, y_moons)
- 这是程序的入口点。调用
generate_and_plot_data
函数生成数据并绘制散点图,然后调用train_neural_network
函数使用生成的数据训练神经网络模型。
二、生成结果图片详细解释🧬
2.1 Two Moons Dataset (两个月亮数据集)
X_moons, y_moons = make_moons(n_samples=400, noise=0.1, random_state=42)
plt.figure(figsize=(8, 6))
plt.scatter(X_moons[:, 0], X_moons[:, 1], c=y_moons, cmap=plt.cm.Paired, edgecolor='k')
plt.title("Two Moons Dataset")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
含义与代表内容:
- Two Moons Dataset:生成了两类数据点,每类数据点的分布类似于一个半圆形状,两个半圆相互交错,形成两个月亮的形状。
- 可视化:散点图展示了每个数据点的位置和类别(用不同的颜色表示)。
- 应用场景:常用于测试分类算法在非线性可分问题上的表现。
2.2 Three Circles Dataset (三个同心圆数据集)
X_circles, y_circles = make_circles(n_samples=300, noise=0.2, factor=0.5, random_state=42)
y_circles = np.where((X_circles[:, 0] ** 2 + X_circles[:, 1] ** 2) > 0.7, 2, y_circles)
plt.figure(figsize=(8, 6))
plt.scatter(X_circles[:, 0], X_circles[:, 1], c=y_circles, cmap=plt.cm.Paired, edgecolor='k')
plt.title("Three Circles Dataset")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
含义与代表内容:
- Three Circles Dataset:生成了三个类别的数据点,其中两个类别的数据点分布在同心圆上,第三个类别的数据点分布在内圆外部。
- 可视化:散点图展示了每个数据点的位置和类别(用不同的颜色表示)。
- 应用场景:用于测试分类算法在同心圆形状分布数据上的表现。
2.3 Four Blobs Dataset (四个高斯簇数据集)
X_blobs, y_blobs = make_blobs(n_samples=400, centers=4, random_state=42)
plt.figure(figsize=(8, 6))
plt.scatter(X_blobs[:, 0], X_blobs[:, 1], c=y_blobs, cmap=plt.cm.Paired, edgecolor='k')
plt.title("Four Blobs Dataset")
plt.xlabel("Feature 1")
plt.ylabel("Feature 2")
plt.show()
含义与代表内容:
- Four Blobs Dataset:生成了四类数据点,每类数据点都围绕一个中心点呈现高斯分布。
- 可视化:散点图展示了每个数据点的位置和类别(用不同的颜色表示)。
- 应用场景:常用于测试分类算法在多个高斯分布数据上的表现。
2.4 训练过程中的损失和准确率变化
plt.figure(figsize=(12, 4))
plt.subplot(1, 2, 1)
plt.plot(history.history['loss'], label='训练损失')
plt.plot(history.history['val_loss'], label='验证损失')
plt.title('训练和验证损失')
plt.xlabel('轮次')
plt.ylabel('损失')
plt.legend()
plt.subplot(1, 2, 2)
plt.plot(history.history['accuracy'], label='训练准确率')
plt.plot(history.history['val_accuracy'], label='验证准确率')
plt.title('训练和验证准确率')
plt.xlabel('轮次')
plt.ylabel('准确率')
plt.legend()
plt.show()
含义与代表内容:
- 训练损失和验证损失:
- 训练损失:显示模型在训练数据上的损失(即误差),随着训练轮次的增加,损失应逐渐减小,表明模型在训练数据上的拟合程度提高。
- 验证损失:显示模型在验证数据上的损失,这可以帮助观察模型是否过拟合。如果训练损失继续下降而验证损失开始上升,则可能发生了过拟合。
- 可视化:损失曲线用于评估模型训练的进展和泛化能力。
- 训练准确率和验证准确率:
- 训练准确率:显示模型在训练数据上的分类准确率,应该随着训练轮次的增加而提高,表明模型对训练数据的分类能力增强。
- 验证准确率:显示模型在验证数据上的分类准确率,评估模型在未见数据上的表现。验证准确率的增加表明模型对未见数据的分类能力在提升。
- 可视化:准确率曲线用于跟踪模型在训练和验证数据上的表现,帮助确定训练是否有效。
2.5 总结
-
数据集的可视化:
Two Moons Dataset
:非线性可分数据,适合测试处理非线性分类问题的模型。Three Circles Dataset
:有不同类别的同心圆,适合测试对复杂形状的分类能力。Four Blobs Dataset
:高斯簇分布的数据,适合测试多类分类问题。
-
神经网络训练过程的可视化:
- 损失曲线:帮助识别模型的训练和验证过程中的问题,例如过拟合或欠拟合。
- 准确率曲线:帮助评估模型在训练和验证数据上的性能和进展。
三、知识点🌟
3.1 数据生成
make_moons
:生成两个交错的半圆形状数据集,通常用于测试分类算法在非线性可分数据上的表现。make_circles
:生成同心圆数据集,包含三个类别,内圈和外圈的点属于不同的类别,中间的点属于第三个类别。通过调整noise
参数可以控制数据点的随机噪声,factor
参数控制圆的相对大小。make_blobs
:生成围绕中心点的高斯分布数据集,可以生成多个类别的数据点,每个类别的数据点围绕一个中心点分布。
3.2 数据预处理
- 标准化(StandardScaler):通过减去均值并除以标准差的方式,将数据转换为具有零均值和单位方差的分布。这有助于提高某些机器学习算法的性能和收敛速度。
- 划分数据集(train_test_split):将数据集分为训练集和测试集,通常按照70:30的比例。训练集用于模型训练,测试集用于评估模型的泛化能力。
3.3 神经网络构建与训练
- Sequential模型:Keras中的一个模型类,用于构建顺序的神经网络。通过按顺序添加层来构建模型。
- Dense层:全连接层,是神经网络中的基本单元。第一层需要指定输入形状,后续层自动推断输入形状。激活函数如ReLU用于引入非线性,输出层使用Sigmoid激活函数适用于二分类问题。
- 编译模型:在训练前需要编译模型,指定优化器(如Adam)、损失函数(如二元交叉熵
binary_crossentropy
)、评估指标(如准确率accuracy
)。 - 训练模型:使用
fit
方法训练模型,指定训练轮次(epochs)和验证集比例。训练过程中会不断调整模型参数以最小化损失函数。
3.4 模型评估
- 训练准确率和测试准确率:评估模型在训练集和测试集上的分类性能。训练准确率显示模型对训练数据的拟合程度,测试准确率显示模型对未见数据的泛化能力。
- 绘制训练过程中的损失和准确率变化:通过绘制损失和准确率曲线,可以观察模型在训练过程中的表现。训练损失和验证损失曲线帮助识别模型是否过拟合或欠拟合,训练准确率和验证准确率曲线则显示模型在训练和验证数据上的表现。
3.5 结果可视化
- 散点图:使用Matplotlib绘制数据点的散点图,展示数据的分布和类别。不同的颜色代表不同的类别。
- 损失曲线和准确率曲线:绘制模型在训练过程中的损失和准确率变化,帮助分析模型的训练效果和泛化能力。
3.6 数学和机器学习理论
- 特征空间:数据点在多维特征中的表示,每个维度代表一个特征。
- 激活函数:如ReLU和Sigmoid,用于在神经网络中引入非线性,帮助模型学习复杂的函数映射。
- 优化算法:如Adam,用于在训练过程中更新模型参数,优化损失函数。
- 二元交叉熵:用于二分类问题的损失函数,衡量预测概率分布与真实标签之间的差异。
- 过拟合和欠拟合:模型在训练数据上表现很好或很差,但在测试数据上表现不佳的情况。