zzbcoder

  博客园  :: 首页  :: 新随笔  :: 联系 :: 订阅 订阅  :: 管理

TensorFlow 回归模型

首先,导入所需的库和模块。代码中使用了numpy进行数值计算,matplotlib进行数据可视化,tensorflow进行机器学习模型的构建和训练,sklearn进行多项式特征转换。dataset()函数用于生成模拟数据集。在这里,使用np.arange()生成了从-25到25的一组输入数据X,然后根据公式X**3 + 20计算对应的输出数据y,并添加了随机噪声。可选参数show用于控制是否绘制数据散点图。对生成的数据进行归一化处理。将X和y分别除以它们的最大值,以将它们缩放到0和1之间,以便更好地适应模型训练。创建一个Sequential模型,它是一个线性堆叠模型,只包含一个全连接层。全连接层的单元数为1,输入形状为[1],表示接受一个特征。

模型使用Adam优化器和均方误差损失函数进行编译。使用归一化后的数据X和y进行模型训练。训练过程使用了500个epochs,通过调用model.fit()方法来实现。训练过程中会输出每个epoch的训练损失。绘制训练过程中损失的变化情况。使用plt.plot()函数绘制损失曲线,横坐标表示epochs,纵坐标表示均方误差损失值。计算最终训练得到的模型在训练数据上的均方误差。获取训练历史中的最后一个损失值作为均方误差。使用训练得到的模型对归一化后的数据X进行预测,得到预测结果y_hat。绘制原始数据和模型预测结果的散点图和拟合线。使用plt.scatter()函数绘制原始数据散点图,使用plt.plot()函数绘制拟合线。添加合适的标签和标题,以及均方误差的文本显示。使用PolynomialFeatures进行多项式特征转换。通过调用poly.fit_transform()方法,将一维的X数据转换为二次、三次和四次多项式的特征矩阵。转换后的特征矩阵将作为新的输入数据进行模型训练。创建新的Sequential模型,输入形状根据不同的多项式次数选择合适的值。使用相同的优化器和损失函数进行编译。使用转换后的特征矩阵进行模型训练,过程与之前的训练过程相同。绘制多项式拟合的训练损失曲线和拟合结果。与之前的步骤相似,使用plt.plot()函数和plt.scatter()函数进行绘制。

1. 单变量线性回归 代码以及运行结果

电脑萤幕的截图

描述已自动生成

电脑萤幕的截图

描述已自动生成

import tensorflow as tf

import matplotlib.pyplot as plt

import os

os.environ['TF_CPP_MIN_LOG_LEVEL'] = '2'

# 输入数据

x = [0.0, 1.0, 2.0, 3.0, 4.0, 5.0, 6.0, 7.0, 8.0, 9.0]

y = [5.1, 7.9, 11.1, 13.9, 17.2, 19.9, 22.8, 26.1, 29.1, 31.9]

# 定义层

layer0 = tf.keras.layers.Dense(units=1, input_shape=[1])

model = tf.keras.Sequential([layer0])

# 编译模型

model.compile(loss='mean_squared_error', optimizer=tf.keras.optimizers.Adam(1))

# 训练模型

history = model.fit(x, y, epochs=200, verbose=False) # type: ignore

# 预测

print('Prediction: {}'.format(model.predict([10])))

# 获取权重和偏置

weights = layer0.get_weights()

print('weight: {} bias: {}'.format(weights[0], weights[1]))

# 绘制损失图像

plt.figure(1)

plt.xlabel('Epoch Number')

plt.ylabel("Loss Magnitude")

plt.plot(history.history['loss'])

plt.show()

# 绘制拟合曲线

plt.figure()

weights = layer0.get_weights()

weight = weights[0][0]

bias = weights[1]

print('weight: {} bias: {}'.format(weight, bias))

y_learned = x * weight + bias

plt.scatter(x, y, label='Training Data')

plt.plot(x, y_learned, color='orangered', label='Fit Line')

plt.legend()

plt.show()

2. 多变量线性回归 代码以及运行结果

图形用户界面, 应用程序

描述已自动生成

3. 单变量多项式回归:

图表

描述已自动生成电脑软件截图

描述已自动生成

电脑萤幕的截图

描述已自动生成图表, 散点图

描述已自动生成电脑萤幕的截图

描述已自动生成

电脑萤幕的截图

描述已自动生成

图表

描述已自动生成

实验结果图像分析:

清晰可见的是一次多项式是一条直线 拟合效果最差 而其他高次多项式都可以简单拟合这个曲线,具体分析:

二次多项式拟合:

二次多项式拟合使用了具有3个特征的输入数据X_2进行训练。每个样本的特征是原始输入X的幂次项和交叉项的组合。

二次多项式模型的训练损失曲线下降较快,在较少的epochs后就能达到较低的损失值。

二次多项式模型在训练数据上能够比较好地拟合,并且损失较小。拟合曲线在数据点附近能够较好地捕捉到曲线的形状。

在拟合曲线的远离数据点的区域,二次多项式模型可能存在过拟合的问题,导致曲线与真实曲线有较大偏差。

三次多项式拟合:

三次多项式拟合使用了具有4个特征的输入数据X_3进行训练。每个样本的特征是原始输入X的幂次项和交叉项的组合。

三次多项式模型的训练损失曲线下降较慢,需要更多的epochs才能达到较低的损失值。

三次多项式模型在训练数据上能够更好地拟合,损失较小。拟合曲线能够更好地适应数据的曲线形状。

与二次多项式相比,三次多项式模型在远离数据点的区域有更好的拟合能力,捕捉到了曲线更多的细节。

四次多项式拟合:

四次多项式拟合使用了具有5个特征的输入数据X_4进行训练。每个样本的特征是原始输入X的幂次项和交叉项的组合。

四次多项式模型的训练损失曲线下降更慢,需要更多的epochs才能达到较低的损失值。

四次多项式模型在训练数据上能够更好地拟合,损失较小。拟合曲线能够更好地适应数据的曲线形状,甚至在曲线的起伏处也有较好的拟合能力。

与三次多项式相比,四次多项式模型在远离数据点的区域继续增加了拟合的能力,更好地捕捉到了曲线的细微变化。

综上所述,随着多项式次数的增加,模型的拟合能力和灵活性也增加,可以更好地适应复杂的数据模式。然而,高次多项式模型也更容易出现过拟合的问题,尤其是在远离数据点的区域。因此,在选择多项式次数时需要权衡模型的复杂性和过拟合的风险,以及对训练数据和未知数据的拟合效果的要求。

4. 逻辑回归

鸢尾花分类是机器学习中一个经典的问题!这个分类问题通常使用鸢尾花数据集进行研究和讨论。

鸢尾花数据集是一个经典的机器学习数据集,由统计学家和植物学家R.A. Fisher在30年代收集整理。该数据集包含150个样本,分为三种不同的鸢尾花:山鸢尾(Setosa)、变色鸢尾(Versicolor)和维吉尼亚鸢尾(Virginica)。

鸢尾花分类问题的目标是根据鸢尾花的测量特征(如花瓣长度、花瓣宽度、萼片长度和萼片宽度)来预测鸢尾花的类型。通过机器学习算法和模型,可以利用这些特征对鸢尾花进行准确的分类。

鸢尾花分类问题在机器学习和模式识别领域被广泛应用,常用来解释和演示各种分类算法的性能和效果。它是一个相对简单而又有挑战性的问题,适合初学者学习和实践。

电脑萤幕的截图

描述已自动生成图表, 散点图

描述已自动生成

电脑萤幕的截图

描述已自动生成

图表, 散点图

描述已自动生成

电脑萤幕的截图

描述已自动生成电脑萤幕的截图

描述已自动生成

import numpy as np

import pandas as pd

import seaborn as sns

import matplotlib.pyplot as plt

from sklearn.datasets import load_iris

from sklearn.model_selection import train_test_split

from tensorflow.keras.utils import to_categorical

import tensorflow as tf

# 读取鸢尾花数据集

iris = load_iris()

print(iris.DESCR)

print(iris.feature_names)

print(iris.target_names)

print(iris.data[0])

print(iris.target[0])

# 将数据集转换为DataFrame,并进行数据处理

df_iris = pd.DataFrame(iris.data, columns=iris.feature_names)

df_species = pd.DataFrame(iris.target, columns=['species'])

df_iris = pd.concat([df_iris, df_species], axis=1, join='outer')

df_iris['species'].replace([0, 1, 2], ['setosa', 'versicolor', 'virginica'], inplace=True)

# 绘制特征间的关系图

sns.pairplot(df_iris, hue='species', markers=["o", "s", "D"])

plt.savefig('pairplot.png')

plt.show()

# 划分训练集和测试集

data_X = iris.data

data_y = to_categorical(iris.target)  # 进行one-hot编码

train_X, test_X, train_y, test_y = train_test_split(data_X, data_y, test_size=0.3, random_state=0)

# 构建模型

model = tf.keras.models.Sequential([

    tf.keras.layers.Input(4),

    tf.keras.layers.Dense(100, activation='relu'),

    tf.keras.layers.Dense(3, activation='softmax')

])

# 编译模型

model.compile(optimizer=tf.keras.optimizers.Adam(learning_rate=0.01),

              loss='categorical_crossentropy',

              metrics=['accuracy'])

# 模型训练

result = model.fit(train_X, train_y, batch_size=32, epochs=50, validation_data=(test_X, test_y), verbose=1)

# 绘制准确率曲线

plt.figure()

plt.title('Accuracy')

plt.xlabel('Epoch')

plt.ylabel('Accuracy')

plt.plot(result.history['accuracy'], label='Train')

plt.plot(result.history['val_accuracy'], label='Test')

plt.legend()

plt.show()

# 绘制损失函数曲线

plt.figure()

plt.title('Categorical Crossentropy Loss')

plt.xlabel('Epoch')

plt.ylabel('Loss')

plt.plot(result.history['loss'], label='Train')

plt.plot(result.history['val_loss'], label='Test')

plt.legend()

plt.show()

# 使用evaluate函数评估模型在训练集和测试集上的表现

train_score = model.evaluate(train_X, train_y)

test_score = model.evaluate(test_X, test_y)

print('Train loss:', train_score[0])

print('Train accuracy:', train_score[1])

print('Test loss:', test_score[0])

print('Test accuracy:', test_score[1])

# 预测结果

pred_train = model.predict(train_X)

pred_test = model.predict(test_X)

pred_train = np.argmax(pred_train, axis=1)

pred_test = np.argmax(pred_test, axis=1)

print(pred_train)

print(np.argmax(train_y, axis=1))

print(pred_test)

print(np.argmax(test_y, axis=1))

下面是对代码的详细分析:

导入所需的库和模块:

numpy:用于处理数值计算。

sklearn.datasets.load_iris:用于加载鸢尾花数据集。

sklearn.model_selection.train_test_split:用于划分训练集和测试集。

tensorflow.keras.utils.to_categorical:用于进行one-hot编码。

tensorflow:用于构建和训练神经网络模型。

matplotlib.pyplot:用于绘制图表。

pandas:用于数据处理和分析。

seaborn:用于绘制数据关系图。

读取鸢尾花数据集:

使用load_iris()函数加载鸢尾花数据集,并将数据存储在iris变量中。

打印数据集的描述信息、特征列的名称、目标列的类别名称以及第一个样本的特征值和目标值。

数据处理和可视化:

将特征数据转换为pandas的DataFrame格式,并添加特征列的名称。

创建一个新的列species,将目标列的数值标签替换为相应的类别名称。

使用seaborn库的pairplot函数绘制特征间的关系图,并设置不同类别的标记样式。

将图表保存为文件pairplot.png并显示出来。

划分训练集和测试集:

将特征数据和目标数据分别赋值给data_X和data_y变量。

使用train_test_split函数将数据划分为训练集和测试集,其中测试集占总数据的30%。

train_X和test_X为划分后的特征数据,train_y和test_y为划分后的目标数据。

构建神经网络模型:

使用tf.keras.models.Sequential顺序模型创建一个序列化的模型对象。

添加输入层和两个全连接层,其中输入层的大小为4(特征的维度),第一个全连接层有100个神经元,使用ReLU激活函数,第二个全连接层有3个神经元,使用softmax激活函数。

编译模型:

使用model.compile方法对模型进行编译。

设置优化器为Adam,并指定学习率为0.01。

设置损失函数为分类交叉熵(categorical_crossentropy)。

设置评估指标为准确率(accuracy)。

训练模型:

使用model.fit方法训练模型。

设置批处理大小为32,迭代训练数据50次(epochs=50)。

设置验证集为测试集,并打印训练过程中的指标信息。

绘制准确率和损失图表:

使用matplotlib.pyplot库绘制训练过程中准确率和损失的变化曲线。

绘制训练集和测试集的准确率曲线。

绘制训练集和测试集的损失曲线。

评估模型:

使用model.evaluate方法评估训练集和测试集的损失和准确率。

打印训练集的损失和准确率。

打印测试集的损失和准确率。

模型预测:

使用训练好的模型对训练集和测试集进行预测。

使用np.argmax函数将预测结果转换为类别标签。

打印训练集的预测结果、真实标签和测试集的预测结果、真实标签。

posted on 2023-10-12 23:48  码dao成功  阅读(36)  评论(0编辑  收藏  举报