从零开始玩转TensorFlow:小明的机器学习故事 3

下面是一篇以小明为主角,尝试用 TensorFlow 预测校园活动参与率的学习故事。我们会在故事情境中穿插对线性回归和逻辑回归的原理介绍,并附带必要的代码示例,帮助你从零基础理解并动手实践。文章结尾还有简要的分析总结。


小明的第一次机器学习实验

场景:预测校园活动的参与率

小明最近加入了学生会,负责策划校园活动。每次活动都需要准备场地、宣传物料和餐饮,但经常会出现场地过小或准备物资不足等问题。为了让活动准备更加高效,小明决定尝试使用机器学习来预测校园活动的参与率。

数据来源的假设

在开始之前,小明收集了过往 50 场校园活动的数据,包括以下信息:

  1. 活动宣传力度(如发海报的数量、微信公众号推文阅读量)
  2. 活动举办时间(周中 / 周末等)
  3. 活动是否免费(Yes / No)
  4. 天气状况(晴 / 雨 / 多云)
  5. 历史参与人数(真实参与率或人数,作为标签 Label)

现实中,我们可能会收集更多特征,如活动类型、主讲人知名度等,但在示例中只展示一些关键的、容易理解的特征。


内容:线性回归与逻辑回归

在本章中,我们将重点介绍:

  1. 线性回归(Linear Regression)
  2. 逻辑回归(Logistic Regression)
  3. 使用 TensorFlow 进行模型构建和训练的简单流程

我们先通过一个直观的例子认识这两种模型的含义和它们能解决的问题。

为什么要用线性回归?
  • 目标 :预测一个连续值,例如"活动的参与人数"或"参与率"(可以理解为一个 0~1 的百分比)。

  • 基本原理 :假设目标 y 与各个特征 x 有一个线性关系

  • 应用情景:如果小明想要直接预测参与活动的人数,或者预测活动参与率是 0.7 还是 0.8,那么可以把它当作一个连续值来回归。

为什么要用逻辑回归?
  • 目标 :预测一个分类结果,例如参与人数是否"超过 100 人"(是/否),或者参与率是否"超过 50%"(是/否)。

  • 基本原理 :逻辑回归借助 Sigmoid 函数将线性变换结果映射到 0~1 之间,用来表示属于某一类的概率。

  • 应用情景:如果小明只想知道"活动参与率会不会超过 50%"这样的二分类问题,就可以使用逻辑回归。


实战:使用 TensorFlow 构建和训练模型

以下我们会以 Keras 的方式来实现线性回归和逻辑回归。Keras 是 TensorFlow 提供的高阶 API,简单易用,能帮助我们快速搭建模型。

注意:数据部分我们将用随机生成的示例来演示流程,核心目的是理解训练步骤。实际项目中需要先对数据进行充分清洗、探索和分析。

1. 线性回归示例

假设我们要预测校园活动的实际参与率(范围 0~1 之间的浮点数),需要用线性回归

(1) 数据准备
python 复制代码
import numpy as np
import tensorflow as tf

# 假设我们有 50 条记录,每条包含 4 个特征
# 例如:宣传力度、活动时间(数值化)、是否免费(0/1)、天气(数值化)
np.random.seed(42)  # 为了保证结果可复现

X = np.random.rand(50, 4)
# 随机生成的特征,每行 4 个特征
# 实际工作中这里会是从数据库或文件中读入的真实特征

# 生成一个相对合理的"真实参与率" y_true
# 这里假设某些权重 w=[0.3, 0.2, -0.1, 0.4], 偏置 b=0.1, 并加一些噪声
w_real = np.array([0.3, 0.2, -0.1, 0.4])
b_real = 0.1
y = X.dot(w_real) + b_real + np.random.normal(0, 0.02, size=(50,))
# 将 y 限制在 [0,1] 之间(模拟参与率)
y = np.clip(y, 0, 1)

print("特征形状:", X.shape)
print("标签形状:", y.shape)

此时,X 大小为 (50,4), y 大小为 (50,),代表 50 条数据,4 个特征,1 个连续标签。

(2) 搭建线性回归模型

我们可以使用 tf.keras.Sequential 来快速构建。线性回归实际上就是输入层直接连接到输出层,因此可以只用一个 Dense 层,并且不加激活函数。

python 复制代码
model_linear = tf.keras.Sequential([
    tf.keras.layers.Dense(1, activation=None, input_shape=(4,))
])

# 设置优化器和损失函数
model_linear.compile(optimizer='sgd', loss='mse')

# 训练模型
model_linear.fit(X, y, epochs=100, verbose=0)

# 评估模型
mse_loss = model_linear.evaluate(X, y, verbose=0)
print("线性回归模型的最终损失(MSE):", mse_loss)

# 查看学到的权重和偏置
w_learned, b_learned = model_linear.layers[0].get_weights()
print("模型学到的权重:", w_learned.flatten())
print("模型学到的偏置:", b_learned)

示例输出:

bash 复制代码
线性回归模型的最终损失(MSE): 0.13851742446422577
模型学到的权重: [ 0.48031718 -0.56599224  0.61994004 -0.20186776]
模型学到的偏置: [0.3273381]
  • 损失函数 (Loss):MSE(均方误差),常用于回归问题。
  • 优化器 (Optimizer) :这里简单使用 sgd(随机梯度下降)。
  • Epochs:训练轮次,在真实项目中可根据结果灵活调整。

运行后我们可以看到训练过程中损失函数在降低,模型能学到与设定的真实权重相接近的参数,说明网络成功拟合了我们的模拟数据。

(3) 预测与解读
python 复制代码
# 随机选取一条新数据(模拟)
X_new = np.array([[0.2, 0.5, 0.0, 0.8]]) 
y_pred = model_linear.predict(X_new)
print("预测的活动参与率为:", y_pred)

如果 y_pred 输出为 [0.7],可理解为:活动有 70% 的人会参与(或者报名),方便小明提前做准备。


2. 逻辑回归示例

现在,如果小明只想知道"活动的参与人数是否会超过 50%(二分类)",可以使用逻辑回归。它输出一个概率值,表示活动"高参与率"的概率。

(1) 数据准备

我们可以复用上面 X 的特征,为了演示二分类标签,这次手动把 y 转成 0/1:

python 复制代码
# 将上面 y>0.5 的部分作为类1,<=0.5作为类0
y_binary = (y > 0.5).astype(int)

print("二分类标签示例:", y_binary[:10])

示例输出:

bash 复制代码
二分类标签示例: [1 1 1 0 0 0 1 0 1 0]
(2) 搭建逻辑回归模型

逻辑回归可以理解为线性变换 + sigmoid 函数。所以在 Keras 中,我们只需要一个 Dense(1, activation='sigmoid') 层即可。

python 复制代码
model_logistic = tf.keras.Sequential([
    tf.keras.layers.Dense(1, activation='sigmoid', input_shape=(4,))
])

model_logistic.compile(
    optimizer='sgd', 
    loss='binary_crossentropy',
    metrics=['accuracy']
)

model_logistic.fit(X, y_binary, epochs=100, verbose=0)

loss, acc = model_logistic.evaluate(X, y_binary, verbose=0)
print("逻辑回归模型的损失:", loss)
print("逻辑回归模型的准确率:", acc)
  • 损失函数binary_crossentropy 常用于二分类问题。
  • 指标 (Metrics)accuracy 是一个直观的分类指标。
(3) 预测与解读
python 复制代码
X_new = np.array([[0.2, 0.5, 0.0, 0.8]])
prob_pred = model_logistic.predict(X_new)
print("预测活动高参与率的概率:", prob_pred)

if prob_pred >= 0.5:
    print("模型判断:活动参与率很可能超过 50%")
else:
    print("模型判断:活动参与率应该不会超过 50%")

这样,小明就能够根据概率来进行决策:

  • 如果结果是 0.7,则有 70% 的把握活动参与率大于 50%,小明需要筹备更多资源。
  • 如果结果是 0.3,则可能无需投入过多预算。

分析总结

  1. 线性回归和逻辑回归的核心差别 在于,线性回归主要用于连续值 的预测,逻辑回归用于二分类或多分类问题。
  2. 原理方面
    • 线性回归:假设特征和标签间是线性关系,通过最小化均方误差来寻找最佳参数。
    • 逻辑回归:借助 Sigmoid 函数把输出映射到 (0,1) 范围,并使用对数损失(交叉熵)衡量预测概率的准确度。
  3. 为什么使用它们?
    • 线性回归对数据量不大的情况下,也可以快速训练并得到一个合理的基准模型,用于定量预测。
    • 逻辑回归同样简单、解释性强,而且对于二分类任务("大于 50% or 小于 50%")非常合适,可以直接输出概率。
  4. 实践要点
    • 收集足够质量的数据并进行预处理,保证特征和标签的准确性。
    • 合理选择损失函数和指标(回归用 MSE / 分类用交叉熵)。
    • 训练过程中观察损失下降趋势,不宜盲目增加 Epoch,需要防止过拟合或欠拟合。
    • 部署模型之前要在验证集或测试集上进行评估,以确认效果的稳定性。

通过这个小小的实验,小明已经初步体会到使用 TensorFlow 进行数据训练和模型预测的流程。从此,他在学校活动策划上有了更科学的依据,减少了场地浪费或物资不足的情况。

相关推荐
龚大龙37 分钟前
机器学习(李宏毅)——Diffusion Model
人工智能·机器学习
陈敬雷-充电了么-CEO兼CTO1 小时前
DeepSeek-R1:通过强化学习激发大语言模型的推理能力
人工智能·gpt·搜索引擎·自然语言处理·chatgpt·大模型·aigc
小宇爱1 小时前
55、深度学习-自学之路-自己搭建深度学习框架-16、使用LSTM解决RNN梯度消失和梯度爆炸的问题,重写莎士比亚风格文章。
人工智能·rnn·深度学习·神经网络·自然语言处理
南太湖小蚂蚁1 小时前
自然语言处理入门2——神经网络
人工智能·python·深度学习·神经网络·自然语言处理
梦丶晓羽1 小时前
自然语言处理:初识自然语言处理
人工智能·自然语言处理
风雅樱1 小时前
机器学习--(随机森林,线性回归)
随机森林·机器学习·线性回归
AOIWB1 小时前
机器分类的基石:逻辑回归Logistic Regression
机器学习·分类·数据挖掘·逻辑回归
dundunmm1 小时前
【数据挖掘】NumPy
人工智能·数据挖掘·numpy
Kai HVZ2 小时前
《OpenCV》——DNN模块
人工智能·opencv·dnn
RFID舜识物联网2 小时前
RFID测温技术:为生产安全与稳定保驾护航
大数据·人工智能·嵌入式硬件·物联网