TensorFlow 回归模型
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 回归模型的更多相关文章
- 手写数字识别 ----Softmax回归模型官方案例注释(基于Tensorflow,Python)
# 手写数字识别 ----Softmax回归模型 # regression import os import tensorflow as tf from tensorflow.examples.tut ...
- 利用Tensorflow实现逻辑回归模型
官方mnist代码: #下载Mnist数据集 import tensorflow.examples.tutorials.mnist.input_data mnist = input_data.read ...
- 吴裕雄 python 神经网络——TensorFlow实现回归模型训练预测MNIST手写数据集
import tensorflow as tf from tensorflow.examples.tutorials.mnist import input_data mnist = input_dat ...
- tensorflow之逻辑回归模型实现
前面一篇介绍了用tensorflow实现线性回归模型预测sklearn内置的波士顿房价,现在这一篇就记一下用逻辑回归分类sklearn提供的乳腺癌数据集,该数据集有569个样本,每个样本有30维,为二 ...
- 深度学习实践系列(1)- 从零搭建notMNIST逻辑回归模型
MNIST 被喻为深度学习中的Hello World示例,由Yann LeCun等大神组织收集的一个手写数字的数据集,有60000个训练集和10000个验证集,是个非常适合初学者入门的训练集.这个网站 ...
- tensorflow机器学习模型的跨平台上线
在用PMML实现机器学习模型的跨平台上线中,我们讨论了使用PMML文件来实现跨平台模型上线的方法,这个方法当然也适用于tensorflow生成的模型,但是由于tensorflow模型往往较大,使用无法 ...
- Python之TensorFlow的模型训练保存与加载-3
一.TensorFlow的模型保存和加载,使我们在训练和使用时的一种常用方式.我们把训练好的模型通过二次加载训练,或者独立加载模型训练.这基本上都是比较常用的方式. 二.模型的保存与加载类型有2种 1 ...
- 如何在R语言中使用Logistic回归模型
在日常学习或工作中经常会使用线性回归模型对某一事物进行预测,例如预测房价.身高.GDP.学生成绩等,发现这些被预测的变量都属于连续型变量.然而有些情况下,被预测变量可能是二元变量,即成功或失败.流失或 ...
- SPSS数据分析—Poisson回归模型
在对数线性模型中,我们假设单元格频数分布为多项式分布,但是还有一类分类变量分布也是经常用到的,就是Poisson分布. Poisson分布是某件事发生次数的概率分布,用于描述单位时间.单位面积.单位空 ...
- SPSS数据分析—配对Logistic回归模型
Lofistic回归模型也可以用于配对资料,但是其分析方法和操作方法均与之前介绍的不同,具体表现 在以下几个方面1.每个配对组共有同一个回归参数,也就是说协变量在不同配对组中的作用相同2.常数项随着配 ...
随机推荐
- 你知道css3渐变吗线性渐变和径向渐变
线性渐变 #app { width: 200px; height: 200px; background: linear-gradient(to bottom, red, green); /*从顶部到底 ...
- conditional_t和enable_if_t的实现
conditional_t和enable_if_t是元编程里面很相似却有有着一定区别的模板.形如conditional_t<_Cond, _If, _Else>是指如果_Cond表达式 ...
- PHP中目录操作函数
PHP中目录操作函数 1.是否是目录 is_dir 判断给定文件名是否是一个目录 $path = dirname(__FILE___); echo is_dir($path) ? '目录' : ' ...
- vue 导出多页pdf, window.print()实现
如果你对分页打印没思路,而网上的现成方案又不适合,不妨进来看看,也许会对你有帮助. 由于工作环境是局域网,对于插件的安装有限制,所以排除了jspdf + html2canvas的实现方式:采用wind ...
- TDBLookupComboboxEh 一些设置项,自己总结
注意:如果top_seller_nick有重复的值的时候,keyfield 也为top_seller_nick的话,就会造成,选中最下面的那个阿里巴巴的,默认也是第一个天猫的各项值. 因为选后是根据k ...
- Linux-expect(以交互形式输入命令,实现交互通信)
1.expect简介 expect是一种脚本语言,它能够代替人工实现与终端的交互,主要应用于执行命令和程序时,系统以交互形式要求输入指定字符串,实现交互通信. 安装命令: yum install ex ...
- [JVM] CPU缓存一致性协议
CPU缓存一致性协议 CPU高速缓存 CPU缓存是位于cpu和内存之间的临时数据交换器,它的容量比内存小的夺但是交换速度要比内存快得多,主要是为了解决cpu运行时的处理速度与内存读写速度不匹配的问题. ...
- CF1841
A 题意:给一个长度为 \(n\) 的全是 \(1\) 的数列,Alice 先操作,Bob 交替.每次操作选择至少两个(可以更多)相等的数字,删除它们,在序列中加入它们的和.直到有人不能操作为止,这个 ...
- Python实现冒泡排序、选择排序、插入排序
排序与搜索 排序算法(英语:Sorting algorithm)是一种能将一串数据依照特定顺序进行排列的一种算法. 排序算法的稳定性 稳定性:稳定排序算法会让原本有相等键值的纪录维持相对次序.也就是如 ...
- NC208250 牛牛的最美味和最不美味的零食
题目链接 题目 题目描述 牛牛为了减(吃)肥(好),希望对他的零食序列有更深刻的了解,所以他把他的零食排成一列,然后对每一个零食的美味程度都打了分,现在他有可能执行两种操作: eat k:吃掉当前的第 ...