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函数将预测结果转换为类别标签。

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

TensorFlow 回归模型的更多相关文章

  1. 手写数字识别 ----Softmax回归模型官方案例注释(基于Tensorflow,Python)

    # 手写数字识别 ----Softmax回归模型 # regression import os import tensorflow as tf from tensorflow.examples.tut ...

  2. 利用Tensorflow实现逻辑回归模型

    官方mnist代码: #下载Mnist数据集 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data.read ...

  3. 吴裕雄 python 神经网络——TensorFlow实现回归模型训练预测MNIST手写数据集

    import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_dat ...

  4. tensorflow之逻辑回归模型实现

    前面一篇介绍了用tensorflow实现线性回归模型预测sklearn内置的波士顿房价,现在这一篇就记一下用逻辑回归分类sklearn提供的乳腺癌数据集,该数据集有569个样本,每个样本有30维,为二 ...

  5. 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型

    MNIST 被喻为深度学习中的Hello World示例,由Yann LeCun等大神组织收集的一个手写数字的数据集,有60000个训练集和10000个验证集,是个非常适合初学者入门的训练集.这个网站 ...

  6. tensorflow机器学习模型的跨平台上线

    在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但是由于tensorflow模型往往较大,使用无法 ...

  7. Python之TensorFlow的模型训练保存与加载-3

    一.TensorFlow的模型保存和加载,使我们在训练和使用时的一种常用方式.我们把训练好的模型通过二次加载训练,或者独立加载模型训练.这基本上都是比较常用的方式. 二.模型的保存与加载类型有2种 1 ...

  8. 如何在R语言中使用Logistic回归模型

    在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...

  9. SPSS数据分析—Poisson回归模型

    在对数线性模型中,我们假设单元格频数分布为多项式分布,但是还有一类分类变量分布也是经常用到的,就是Poisson分布. Poisson分布是某件事发生次数的概率分布,用于描述单位时间.单位面积.单位空 ...

  10. SPSS数据分析—配对Logistic回归模型

    Lofistic回归模型也可以用于配对资料,但是其分析方法和操作方法均与之前介绍的不同,具体表现 在以下几个方面1.每个配对组共有同一个回归参数,也就是说协变量在不同配对组中的作用相同2.常数项随着配 ...

随机推荐

  1. 你知道css3渐变吗线性渐变和径向渐变

    线性渐变 #app { width: 200px; height: 200px; background: linear-gradient(to bottom, red, green); /*从顶部到底 ...

  2. conditional_t和enable_if_t的实现

      conditional_t和enable_if_t是元编程里面很相似却有有着一定区别的模板.形如conditional_t<_Cond, _If, _Else>是指如果_Cond表达式 ...

  3. PHP中目录操作函数

      PHP中目录操作函数 1.是否是目录 is_dir 判断给定文件名是否是一个目录 $path = dirname(__FILE___); echo is_dir($path) ? '目录' : ' ...

  4. vue 导出多页pdf, window.print()实现

    如果你对分页打印没思路,而网上的现成方案又不适合,不妨进来看看,也许会对你有帮助. 由于工作环境是局域网,对于插件的安装有限制,所以排除了jspdf + html2canvas的实现方式:采用wind ...

  5. TDBLookupComboboxEh 一些设置项,自己总结

    注意:如果top_seller_nick有重复的值的时候,keyfield 也为top_seller_nick的话,就会造成,选中最下面的那个阿里巴巴的,默认也是第一个天猫的各项值. 因为选后是根据k ...

  6. Linux-expect(以交互形式输入命令,实现交互通信)

    1.expect简介 expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信. 安装命令: yum install ex ...

  7. [JVM] CPU缓存一致性协议

    CPU缓存一致性协议 CPU高速缓存 CPU缓存是位于cpu和内存之间的临时数据交换器,它的容量比内存小的夺但是交换速度要比内存快得多,主要是为了解决cpu运行时的处理速度与内存读写速度不匹配的问题. ...

  8. CF1841

    A 题意:给一个长度为 \(n\) 的全是 \(1\) 的数列,Alice 先操作,Bob 交替.每次操作选择至少两个(可以更多)相等的数字,删除它们,在序列中加入它们的和.直到有人不能操作为止,这个 ...

  9. Python实现冒泡排序、选择排序、插入排序

    排序与搜索 排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法. 排序算法的稳定性 稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序.也就是如 ...

  10. NC208250 牛牛的最美味和最不美味的零食

    题目链接 题目 题目描述 牛牛为了减(吃)肥(好),希望对他的零食序列有更深刻的了解,所以他把他的零食排成一列,然后对每一个零食的美味程度都打了分,现在他有可能执行两种操作: eat k:吃掉当前的第 ...