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函数将预测结果转换为类别标签。
打印训练集的预测结果、真实标签和测试集的预测结果、真实标签。