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. 【我在京东做研发】揭秘支撑京东万人规模技术人员协作的行云DevOps平台

    分享人:孙长虹 京东云DevOps解决方案架构师 复旦大学计算机系毕业,并拥有人民大学心理学硕士学位.曾任职于Alcatel-Lucent,IBM和惠普,具有丰富的大型复杂产品研发及项目管理经验,擅长 ...

  2. 分布式事务和Spanner分布式数据库

    一.分布式事务 首先事务可以这么理解:程序员有一些不同的操作,或许针对数据库不同的记录,他们希望所有这些操作作为一个整体,不会因为失败而被分割,也不会被其他活动看到中间状态.事务处理系统要求程序员对这 ...

  3. click与addEventListener和removeEventListener事件与移除正确的移除事件详解

    1. onclick事件 es5 普通事件就是直接触发事件,相同的事件会被覆盖掉.代码如下: let demoDiv=document.querySelector(".demo") ...

  4. 01显示转换隐私转换 有8个值转为false 显示转换Number的注意点

    prompt()函数会弹出一个框,接受用户的输入.但是在实际的开发中.这样的操作是很少. 至少在我做开发的过程中没有使用过.我二没有看见人家在过开发的使用使用. console.log(Number( ...

  5. 【遇到一个怪异的问题】使用embed来加载模版,只要写在init()函数中就会导致HTTP服务出错

    作者:张富春(ahfuzhang),转载时请注明作者和引用链接,谢谢! cnblogs博客 zhihu Github 公众号:一本正经的瞎扯 经过反复测试,只要换一个写法就能开启/重现这个怪异的问题. ...

  6. Java中YYYY-MM-dd在跨年时出现的bug

    先看一张图: Bug的产生原因: 日期格式化时候,把 yyyy-MM-dd 写成了 YYYY-MM-dd Bug分析: 当时间是2019-08-31时, public class DateTest { ...

  7. 进程状态|操作系统|什么是pcb|什么是僵尸进程 |什么是孤儿进程 【超详细的图文解释】【Linux OS】

    说在前面 今天给大家带来操作系统中进程状态的详解. 本篇博主将通过从进程状态的广泛概念,深入到Linux操作系统详细的一些进程状态.在解释进程状态的过程中,博主还会穿插一些操作系统一些重要概念!本篇干 ...

  8. 如何快速获取AWR中涉及到的表

    最近遇到一个很少见的需求,是关于应用测试方面的. 具体来说,这个应用的测试需求要基于一个固定的时间点数据,而且只能测试一轮,再测试就需要还原到测试前状态. 因为我们使用的存储是分层的(热数据在Flas ...

  9. 【CAS学习二】CAS部署和联调

    上一篇写到服务端部署的是CAS 6.4版本,可后面与客户端集成时出现未认证授权的服务,如下: 网上查了下,要把http的访问打开.具体设置步骤是:修:%Tomcat%\webapps\cas\WEB- ...

  10. FolkMQ "单线程"消息中间件 v1.0.32 发布

    简介 采用 "单线程" + "多路复用" + "内存运行" + "快照持久化" + "Broker 集群模式& ...