python3+TensorFlow 2.x(二) 回归模型

打印 上一主题 下一主题

主题 1045|帖子 1045|积分 3135

目录

回归算法
1、线性回归 (Linear Regression)
一元线性回归举例
 2、非线性回归
3、回归分类 


回归算法

回归算法用于预测一连的数值输出。回归分析的目标是创建一个模型,以便根据输入特征预测目标变量,在使用 TensorFlow 2.x 实现线性回归模型时,通常的步骤包括数据预处置惩罚、模型构建、训练和评估。
1、线性回归 (Linear Regression)

概述:线性回归是最基本的回归算法之一,假设目标变量与输入特征之间存在线性关系。
模型形式:y=
+
+...+
+ϵ,其中 y 是目标变量,x​ 是特征,βi是权重,ϵ 是误差项。
一元线性回归举例

实现步骤
导入须要的库
生成或加载数据预处置惩罚:使用生成的线性数据集。生成了一个简朴的线性关系 y = 2x + 1,并加上了一些噪声来模拟实际的观测数据。np.linspace 生成 100 个从 0 到 10 的点,np.random.normal 用于生成随机噪声。数据处置惩罚:使用 X.reshape(-1, 1) 将 X 酿成二维数组,以顺应 TensorFlow 的输入要求。
构建线性回归模型:使用 tf.keras.Sequential 创建一个简朴的线性模型。只使用一个 Dense 层来表示线性回归,其中 input_dim=1 指明输入特征的维度为 1,output_dim=1 表示输出只有一个预测值。        
编译模型:设置丧失函数和优化器。使用了 adam 优化器,这是一个常用且结果不错的优化器。丧失函数选择 mean_squared_error,这是回归标题中常见的丧失函数。
训练模型:使用训练数据来训练模型。model.fit 方法用于训练模型。设置了 200 个 epoch 和10 的批次大小。
评估模型:通过测试数据评估模型性能。model.evaluate 会返回训练集的丧失值,用来评估训练过程中的结果.
预测结果:使用训练好的模型进行预测。使用 matplotlib 绘制训练过程中每个 epoch 的丧失厘革情况,以便观察模型训练的收敛过程,使用 model.predict 来预测训练集上的输出,然后将预测结果与真实数据一起绘制出来,查看模型的拟合结果
  1. import numpy as np
  2. import tensorflow as tf
  3. from tensorflow import keras
  4. import matplotlib.pyplot as plt
  5. # 1. 生成数据:y = 2x + 1
  6. np.random.seed(42)
  7. X = np.linspace(0, 10, 100)  # 生成100个点,范围是[0, 10]
  8. Y = 2 * X + 1 + np.random.normal(0, 1, X.shape[0])  # y = 2x + 1,加上一些噪声
  9. # 2. 数据预处理:将数据转化为TensorFlow的张量(也可以直接使用NumPy数组)
  10. X_train = X.reshape(-1, 1)  # 特征,转换成二维数组
  11. Y_train = Y.reshape(-1, 1)  # 标签,转换成二维数组
  12. # 3. 构建线性回归模型
  13. model = keras.Sequential([
  14.     keras.layers.Dense(1, input_dim=1)  # 只有一个输入特征,输出一个值
  15. ])
  16. # 4. 编译模型:选择损失函数和优化器
  17. model.compile(optimizer='adam', loss='mean_squared_error')
  18. # 5. 训练模型
  19. history = model.fit(X_train, Y_train, epochs=200, batch_size=10, verbose=0)
  20. # 6. 评估模型
  21. loss = model.evaluate(X_train, Y_train)
  22. print(f"Final training loss: {loss}")
  23. # 7. 绘制训练过程中的损失变化
  24. plt.plot(history.history['loss'])
  25. plt.title('Training Loss Over Epochs')
  26. plt.xlabel('Epochs')
  27. plt.ylabel('Loss')
  28. plt.show()
  29. # 8. 预测结果
  30. Y_pred = model.predict(X_train)
  31. # 9. 可视化真实数据和预测结果
  32. plt.scatter(X_train, Y_train, color='blue', label='Actual Data')
  33. plt.plot(X_train, Y_pred, color='red', label='Predicted Line')
  34. plt.title('Linear Regression with TensorFlow 2')
  35. plt.xlabel('X')
  36. plt.ylabel('Y')
  37. plt.legend()
  38. plt.show()
复制代码

 2、非线性回归

创建合成数据集:使用 NumPy 生成从 -3 到 3 的 100 个点,并盘算对应的 y 值为sin(x) 加上一些噪声。
分别训练集和测试集:使用 train_test_split 将数据集分别为训练集和测试集,比例为 80% 训练,20% 测试。
构建曲线拟合模型:使用 tf.keras.Sequential 创建一个简朴的神经网络模型,包含两个潜伏层,每层有 64 个神经元,激活函数为 ReLU,最后一层为输出层。
编译模型:使用 Adam 优化器和均方误差丧失函数编译模型。
训练模型:使用 fit 方法训练模型,设置训练轮数为 200,批次大小为 10。
进行预测:使用 predict 方法对测试集进行预测。可视化预测结果,使用 Matplotlib 绘制实际值和预测值的散点图。
  1. import numpy as np
  2. import tensorflow as tf
  3. import matplotlib.pyplot as plt
  4. from sklearn.model_selection import train_test_split
  5. # 1. 创建合成数据集
  6. np.random.seed(0)
  7. X = np.linspace(-3, 3, 100)  # 生成从-3到3的100个点
  8. y = np.sin(X) + np.random.normal(0, 0.1, X.shape)  # y = sin(x) + 噪声
  9. # 2. 划分训练集和测试集
  10. X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
  11. # 3. 构建曲线拟合模型
  12. # 将输入数据转换为二维数组
  13. X_train = X_train.reshape(-1, 1)
  14. X_test = X_test.reshape(-1, 1)
  15. model = tf.keras.Sequential([
  16.     tf.keras.layers.Dense(64, activation='relu', input_shape=(1,)),  # 隐藏层
  17.     tf.keras.layers.Dense(64, activation='relu'),  # 隐藏层
  18.     tf.keras.layers.Dense(1)  # 输出层
  19. ])
  20. # 4. 编译模型
  21. model.compile(optimizer='adam', loss='mean_squared_error')
  22. # 5. 训练模型
  23. model.fit(X_train, y_train, epochs=200, batch_size=10, verbose=0)
  24. # 6. 进行预测
  25. predictions = model.predict(X_test)
  26. # 7. 可视化预测结果
  27. plt.figure(figsize=(10, 6))
  28. plt.scatter(X_test, y_test, color='blue', label='Actual Values')  # 实际值
  29. plt.scatter(X_test, predictions, color='red', label='Predicted Values')  # 预测值
  30. plt.title('Curve Fitting Regression')
  31. plt.xlabel('X')
  32. plt.ylabel('y')
  33. plt.legend()
  34. plt.grid()
  35. plt.show()
复制代码

3、回归分类 

  1. import numpy as np
  2. import tensorflow as tf
  3. from sklearn.model_selection import train_test_split
  4. from sklearn.datasets import make_classification, make_regression
  5. import matplotlib.pyplot as plt
  6. # 生成回归数据集
  7. X_reg, y_reg = make_regression(n_samples=1000, n_features=1, noise=10, random_state=42)
  8. # 生成分类数据集
  9. X_class, y_class = make_classification(n_samples=1000, n_features=2, n_informative=2, n_redundant=0, n_clusters_per_class=1, random_state=42)
  10. # 划分训练集和测试集
  11. X_reg_train, X_reg_test, y_reg_train, y_reg_test = train_test_split(X_reg, y_reg, test_size=0.2, random_state=42)
  12. X_class_train, X_class_test, y_class_train, y_class_test = train_test_split(X_class, y_class, test_size=0.2, random_state=42)
  13. # 创建线性回归模型
  14. model_reg = tf.keras.Sequential([
  15.     tf.keras.layers.Dense(1, input_shape=(1,))  # 输入特征为 1,输出为 1
  16. ])
  17. # 编译模型
  18. model_reg.compile(optimizer='adam', loss='mean_squared_error')
  19. # 训练模型
  20. model_reg.fit(X_reg_train, y_reg_train, epochs=100, batch_size=32, verbose=1)
  21. # 评估模型
  22. loss_reg = model_reg.evaluate(X_reg_test, y_reg_test, verbose=0)
  23. print(f'回归模型测试集损失: {loss_reg:.4f}')
  24. # 可视化回归结果
  25. plt.scatter(X_reg, y_reg, color='blue', label='Data points')
  26. plt.scatter(X_reg_test, model_reg.predict(X_reg_test), color='red', label='Predictions')
  27. plt.title('Linear Regression Results')
  28. plt.xlabel('Feature')
  29. plt.ylabel('Target')
  30. plt.legend()
  31. plt.show()
  32. # 创建逻辑回归模型
  33. model_class = tf.keras.Sequential([
  34.     tf.keras.layers.Dense(1, activation='sigmoid', input_shape=(2,))  # 输入特征为 2,输出为 1
  35. ])
  36. # 编译模型
  37. model_class.compile(optimizer='adam', loss='binary_crossentropy', metrics=['accuracy'])
  38. # 训练模型
  39. model_class.fit(X_class_train, y_class_train, epochs=100, batch_size=32, verbose=1)
  40. # 评估模型
  41. loss_class, accuracy_class = model_class.evaluate(X_class_test, y_class_test, verbose=0)
  42. print(f'分类模型测试集损失: {loss_class:.4f}, 测试集准确率: {accuracy_class:.4f}')
  43. # 可视化分类数据点
  44. plt.scatter(X_class_train[y_class_train == 0][:, 0], X_class_train[y_class_train == 0][:, 1], color='blue', label='Class 0', alpha=0.5)
  45. plt.scatter(X_class_train[y_class_train == 1][:, 0], X_class_train[y_class_train == 1][:, 1], color='red', label='Class 1', alpha=0.5)
  46. # 绘制决策边界
  47. x_min, x_max = X_class[:, 0].min() - 1, X_class[:, 0].max() + 1
  48. y_min, y_max = X_class[:, 1].min() - 1, X_class[:, 1].max() + 1
  49. xx, yy = np.meshgrid(np.arange(x_min, x_max, 0.01), np.arange(y_min, y_max, 0.01))
  50. Z = model_class.predict(np.c_[xx.ravel(), yy.ravel()])
  51. Z = Z.reshape(xx.shape)
  52. plt.contourf(xx, yy, Z, levels=[0, 0.5, 1], alpha=0.2, colors=['blue', 'red'])
  53. plt.title('Logistic Regression Decision Boundary')
  54. plt.xlabel('Feature 1')
  55. plt.ylabel('Feature 2')
  56. plt.legend()
  57. plt.show()
复制代码

make_classification 是 sklearn.datasets 模块中的一个函数,用于生成用于分类的合成数据集。可以通过差别的参数来控制生成数据的特性。
参数解释:n_samples: 生成的样本数目。
n_features: 特征的总数。设置为 2,表示每个样本有 2 个特征。
n_informative: 有效特征的数目,这些特征对分类任务有贡献。设置为 2,表示全部特征都是有效特征。
n_redundant: 冗余特征的数目,这些特征是通过线性组合生成的有效特征。设置为 0,表示没有冗余特征。
n_clusters_per_class: 每个类别的聚类数目。设置为 1,表示每个类别只有一个聚类。
random_state: 随机种子,用于确保结果的可重复性。设置为 42。
make_regression 是 sklearn.datasets 模块中的一个函数,用于生成用于回归的合成数据集。
参数解释:n_samples: 生成的样本数目。
n_features: 特征的总数。比如设置为 1,表示每个样本有 1 个特征。
n_informative: 有效特征的数目,这些特征对目标变量有贡献。比如设置为 1,表示全部特征都是有效特征。
n_targets: 目标变量的数目。默认值为 1,表示生成一个目标变量。
bias: 截距项,表示模型的偏置。可以设置为一个常数,比如 0。
noise: 添加到输出中的噪声的标准差。可以设置为一个浮点数,如 0.1表示添加肯定的随机噪声。
random_state: 随机种子,用于确保结果的可重复性。可以设置为一个整数,比如 42。


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

x
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

美食家大橙子

论坛元老
这个人很懒什么都没写!
快速回复 返回顶部 返回列表