当前位置: 首页 > news >正文

【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归

Langchain系列文章目录

01-玩转LangChain:从模型调用到Prompt模板与输出解析的完整指南
02-玩转 LangChain Memory 模块:四种记忆类型详解及应用场景全覆盖
03-全面掌握 LangChain:从核心链条构建到动态任务分配的实战指南
04-玩转 LangChain:从文档加载到高效问答系统构建的全程实战
05-玩转 LangChain:深度评估问答系统的三种高效方法(示例生成、手动评估与LLM辅助评估)
06-从 0 到 1 掌握 LangChain Agents:自定义工具 + LLM 打造智能工作流!
07-【深度解析】从GPT-1到GPT-4:ChatGPT背后的核心原理全揭秘
08-【万字长文】MCP深度解析:打通AI与世界的“USB-C”,模型上下文协议原理、实践与未来

Python系列文章目录

PyTorch系列文章目录

机器学习系列文章目录

深度学习系列文章目录

Java系列文章目录

JavaScript系列文章目录

深度学习系列文章目录

01-【深度学习-Day 1】为什么深度学习是未来?一探究竟AI、ML、DL关系与应用
02-【深度学习-Day 2】图解线性代数:从标量到张量,理解深度学习的数据表示与运算
03-【深度学习-Day 3】搞懂微积分关键:导数、偏导数、链式法则与梯度详解
04-【深度学习-Day 4】掌握深度学习的“概率”视角:基础概念与应用解析
05-【深度学习-Day 5】Python 快速入门:深度学习的“瑞士军刀”实战指南
06-【深度学习-Day 6】掌握 NumPy:ndarray 创建、索引、运算与性能优化指南
07-【深度学习-Day 7】精通Pandas:从Series、DataFrame入门到数据清洗实战
08-【深度学习-Day 8】让数据说话:Python 可视化双雄 Matplotlib 与 Seaborn 教程
09-【深度学习-Day 9】机器学习核心概念入门:监督、无监督与强化学习全解析
10-【深度学习-Day 10】机器学习基石:从零入门线性回归与逻辑回归


文章目录

  • Langchain系列文章目录
  • Python系列文章目录
  • PyTorch系列文章目录
  • 机器学习系列文章目录
  • 深度学习系列文章目录
  • Java系列文章目录
  • JavaScript系列文章目录
  • 深度学习系列文章目录
  • 前言
  • 一、线性回归 (Linear Regression)
    • 1.1 什么是线性回归?
      • 1.1.1 概念解析
      • 1.1.2 适用场景
    • 1.2 线性回归模型
      • 1.2.1 数学表达式
    • 1.3 损失函数:均方误差 (Loss Function: Mean Squared Error - MSE)
      • 1.3.1 为什么需要损失函数?
      • 1.3.2 MSE 的定义与公式
      • 1.3.3 MSE 的意义
    • 1.4 实践:简单线性回归示例 (Python & Scikit-learn)
      • 1.4.1 数据准备
      • 1.4.2 使用 Scikit-learn 实现
      • 1.4.3 结果解读与可视化
  • 二、逻辑回归 (Logistic Regression)
    • 2.1 什么是逻辑回归?
      • 2.1.1 概念解析
      • 2.1.2 适用场景
    • 2.2 Sigmoid 函数
      • 2.2.1 为什么需要 Sigmoid 函数?
      • 2.2.2 Sigmoid 函数的定义与图像
      • 2.2.3 Sigmoid 函数的特性
    • 2.3 逻辑回归模型
      • 2.3.1 数学表达式
      • 2.3.2 决策边界 (Decision Boundary)
    • 2.4 损失函数:交叉熵 (Cross-Entropy)
      • 2.4.1 为什么不用 MSE?
      • 2.4.2 交叉熵的定义与公式
      • 2.4.3 交叉熵的意义
    • 2.5 实践:简单逻辑回归示例 (Python & Scikit-learn)
      • 2.5.1 数据准备
      • 2.5.2 使用 Scikit-learn 实现
      • 2.5.3 结果解读与可视化
  • 三、模型训练的基本流程 (概念引入)
    • 3.1 概览
    • 3.2 前向传播 (Forward Propagation)
      • 3.2.1 概念
      • 3.2.2 示例
    • 3.3 计算损失 (Calculate Loss)
      • 3.3.1 概念
      • 3.3.2 重要性
    • 3.4 反向传播 (Backward Propagation - 概念引入)
      • 3.4.1 概念引入
      • 3.4.2 梯度的角色
    • 3.5 参数更新 (Parameter Update - 概念引入)
      • 3.5.1 概念引入
      • 3.5.2 学习率的重要性
  • 四、目标:为理解神经网络打下基础
    • 4.1 线性回归/逻辑回归与神经网络的联系
      • 4.1.1 单个神经元
      • 4.1.2 构建模块
    • 4.2 为什么这些基础很重要?
      • 4.2.1 理解核心机制
      • 4.2.2 解决实际问题
  • 五、总结


前言

在上一篇【深度学习-Day 9】机器学习基础(一) - 核心概念中,我们初步踏入了机器学习的大门,了解了其基本定义、分类以及像特征、标签、数据集划分等核心术语。今天,我们将继续深入,学习两种基础且非常重要的机器学习模型:线性回归 (Linear Regression)逻辑回归 (Logistic Regression)。理解它们不仅能帮助我们解决实际问题,更是我们后续理解复杂神经网络如何“学习”的关键一步。本文将带你详细解析这两种模型的概念、核心原理、损失函数,并通过Scikit-learn进行实战演练,最后为你揭示模型训练的基本流程。

一、线性回归 (Linear Regression)

线性回归可以说是机器学习中最简单、最直观的模型之一。它的目标是找到一个线性关系,用以描述输入特征和一个连续的输出变量之间的关系。

1.1 什么是线性回归?

1.1.1 概念解析

线性回归假设输入特征 x x x 和输出 y y y 之间存在线性关系。也就是说,我们可以用一条直线(在二维空间中)或一个平面(在三维空间中)或一个超平面(更高维度)来拟合数据。简单来说,就是试图找到一条“最佳拟合直线”,使得这条直线尽可能地贴近所有数据点。

类比: 就像我们想预测房屋的价格(连续输出 y y y,可能会考虑房屋的面积(输入特征 x x x。线性回归会尝试找到一个公式,比如: 价格 = 某个系数 × 面积 + 一个常数 \text{价格} = \text{某个系数} \times \text{面积} + \text{一个常数} 价格=某个系数×面积+一个常数,来描述这种关系。

1.1.2 适用场景

线性回归主要用于预测连续值输出的问题,例如:

  • 房价预测:根据房屋面积、卧室数量、地理位置等预测房价。
  • 销售额预测:根据广告投入、市场活动等预测产品销售额。
  • 股票价格预测:根据历史股价、公司业绩等预测未来股价(虽然实际中股票预测非常复杂,线性模型是基础尝试)。
  • 温度预测:根据海拔、季节等预测气温。

1.2 线性回归模型

1.2.1 数学表达式

对于一个拥有 n n n 个特征的数据点,线性回归模型的数学表达式可以写为:
y ^ = w 1 x 1 + w 2 x 2 + ⋯ + w n x n + b \hat{y} = w_1x_1 + w_2x_2 + \dots + w_nx_n + b y^=w1x1+w2x2++wnxn+b
其中:

  • y ^ \hat{y} y^ (读作 “y-hat”) 是模型的预测值。
  • x 1 , x 2 , … , x n x_1, x_2, \dots, x_n x1,x2,,xn 是输入特征。
  • w 1 , w 2 , … , w n w_1, w_2, \dots, w_n w1,w2,,wn 是模型的权重 (weights),表示每个特征对预测结果的贡献程度。
  • b b b偏置项 (bias),可以理解为当所有输入特征都为0时,模型的基线预测值。

如果使用向量表示,可以简化为:
y ^ = W T X + b \hat{y} = W^T X + b y^=WTX+b
其中 W = [ w 1 , w 2 , … , w n ] T W = [w_1, w_2, \dots, w_n]^T W=[w1,w2,,wn]T 是权重向量, X = [ x 1 , x 2 , … , x n ] T X = [x_1, x_2, \dots, x_n]^T X=[x1,x2,,xn]T 是特征向量。

为了入门,我们先看最简单的一元线性回归,它只有一个输入特征 x x x
y ^ = w x + b \hat{y} = wx + b y^=wx+b
这里的 w w w 就是直线的斜率, b b b 就是截距。

1.3 损失函数:均方误差 (Loss Function: Mean Squared Error - MSE)

1.3.1 为什么需要损失函数?

模型 ( y ^ = w x + b ) (\hat{y} = wx + b) (y^=wx+b) 中的 w w w b b b 是未知的,我们需要一种方法来衡量模型预测的好坏,并指导我们如何调整 w w w b b b 来使模型更好。损失函数(Loss Function)就是用来量化模型预测值 y ^ \hat{y} y^ 与真实值 y y y 之间差异的。我们的目标是找到一组参数 w w w b b b,使得损失函数的值最小。

1.3.2 MSE 的定义与公式

对于线性回归,最常用的损失函数是均方误差 (Mean Squared Error, MSE)。它计算的是所有样本的预测误差的平方的平均值。
假设我们有 N N N 个训练样本,对于第 i i i 个样本 ( x ( i ) , y ( i ) ) (x^{(i)}, y^{(i)}) (x(i),y(i))

  • 真实值为 y ( i ) y^{(i)} y(i)
  • 模型预测值为 y ^ ( i ) = w x ( i ) + b \hat{y}^{(i)} = wx^{(i)} + b y^(i)=wx(i)+b

则 MSE 的计算公式为:
M S E = J ( w , b ) = 1 N ∑ i = 1 N ( y ( i ) − y ^ ( i ) ) 2 MSE = J(w,b) = \frac{1}{N} \sum_{i=1}^{N} (y^{(i)} - \hat{y}^{(i)})^2 MSE=J(w,b)=N1i=1N(y(i)y^(i))2
或者写成:
M S E = J ( w , b ) = 1 N ∑ i = 1 N ( y ( i ) − ( w x ( i ) + b ) ) 2 MSE = J(w,b) = \frac{1}{N} \sum_{i=1}^{N} (y^{(i)} - (wx^{(i)} + b))^2 MSE=J(w,b)=N1i=1N(y(i)(wx(i)+b))2
公式解读:

  • ( y ( i ) − y ^ ( i ) ) (y^{(i)} - \hat{y}^{(i)}) (y(i)y^(i)):计算每个样本的预测值与真实值之间的差(误差)。
  • ( y ( i ) − y ^ ( i ) ) 2 (y^{(i)} - \hat{y}^{(i)})^2 (y(i)y^(i))2:对误差进行平方。这样做有两个好处:
    1. 避免正负误差相互抵消。
    2. 对较大的误差给予更大的惩罚。
  • ∑ i = 1 N … \sum_{i=1}^{N} \dots i=1N:将所有样本的平方误差加起来。
  • 1 N … \frac{1}{N} \dots N1:取平均值,使得损失函数的值与样本数量无关。

1.3.3 MSE 的意义

MSE 的值越小,说明模型的预测值与真实值的整体差异越小,模型的拟合效果就越好。我们的训练目标就是找到使 MSE 最小的 w w w b b b

1.4 实践:简单线性回归示例 (Python & Scikit-learn)

下面我们用 Python 和强大的机器学习库 Scikit-learn 来实现一个简单的线性回归。

1.4.1 数据准备

我们先手动创建一组简单的数据。假设我们有一些数据点,代表学习小时数和对应的考试分数。

import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error# 示例数据: (学习小时数, 考试分数)
X_train = np.array([1, 2, 3, 4, 5, 6, 7, 8]).reshape(-1, 1) # 输入特征,需要是二维数组
y_train = np.array([50, 55, 65, 70, 72, 80, 85, 90])         # 对应的输出(标签)print("输入特征 X_train (学习小时数):\n", X_train)
print("输出标签 y_train (考试分数):\n", y_train)

1.4.2 使用 Scikit-learn 实现

Scikit-learn 使得实现线性回归非常简单。

# 1. 创建线性回归模型实例
model = LinearRegression()# 2. 训练模型 (拟合数据)
#    模型会尝试找到最佳的 w 和 b 来最小化 MSE
model.fit(X_train, y_train)# 3. 查看模型参数
w = model.coef_[0]  # 权重 w (斜率)
b = model.intercept_ # 偏置 b (截距)
print(f"\n学习到的模型参数:")
print(f"权重 (w): {w:.2f}")
print(f"偏置 (b): {b:.2f}")# 4. 进行预测
#    假设我们想预测学习 5.5 小时的分数
X_new = np.array([[5.5]]) # 注意输入也需要是二维数组
y_pred_new = model.predict(X_new)
print(f"\n学习 5.5 小时,预测分数: {y_pred_new[0]:.2f}")# 对训练数据进行预测,用于计算MSE和可视化
y_pred_train = model.predict(X_train)# 5. 评估模型 (计算MSE)
mse = mean_squared_error(y_train, y_pred_train)
print(f"在训练集上的均方误差 (MSE): {mse:.2f}")

1.4.3 结果解读与可视化

# 可视化结果
plt.figure(figsize=(8, 6))
plt.scatter(X_train, y_train, color='blue', label='实际数据点') # 原始数据点
plt.plot(X_train, y_pred_train, color='red', linewidth=2, label='线性回归拟合线') # 拟合的直线
plt.scatter(X_new, y_pred_new, color='green', s=100, label='新数据点预测', marker='*') # 预测的新点
plt.xlabel("学习小时数")
plt.ylabel("考试分数")
plt.title("简单线性回归示例")
plt.legend()
plt.grid(True)
plt.show()print(f"\n从图上可以看出,模型拟合出了一条直线 y = {w:.2f}x + {b:.2f} 来描述学习小时数和考试分数的关系。")

这段代码会输出学习到的权重 w w w 和偏置 b b b,以及对新数据点的预测值和在训练集上的MSE。可视化图会清晰地展示原始数据点和模型拟合出的直线。

二、逻辑回归 (Logistic Regression)

虽然名字里有“回归”,但逻辑回归实际上是一种非常流行的分类算法。它用于预测一个离散的类别标签,例如判断一封邮件是否为垃圾邮件(是/否),或者一个肿瘤是良性还是恶性。

2.1 什么是逻辑回归?

2.1.1 概念解析

逻辑回归通过一个特殊的函数(Sigmoid 函数)将线性回归的输出结果映射到 ( 0 , 1 ) (0, 1) (0,1) 的区间内,这个值可以被解释为属于某个类别的概率。然后,通过设定一个阈值(例如0.5),将概率转化为类别预测。

类比: 假设我们想预测一个学生是否能通过考试(类别:通过/不通过),我们可以根据学生的学习时间(输入特征)。逻辑回归会输出一个概率值,比如学习5小时通过考试的概率是0.7。如果我们将阈值设为0.5,那么因为0.7 > 0.5,模型会预测该学生“通过”考试。

2.1.2 适用场景

逻辑回归主要用于二分类问题,也可以扩展到多分类问题。常见应用有:

  • 垃圾邮件检测:判断邮件是垃圾邮件还是非垃圾邮件。
  • 疾病预测:根据病人的生理指标判断是否患有某种疾病。
  • 用户点击率预测:预测用户是否会点击某个广告。
  • 信用评分:评估个人信用风险,判断是否会违约。

2.2 Sigmoid 函数

2.2.1 为什么需要 Sigmoid 函数?

线性回归的输出 y ^ = W X + b \hat{y} = WX + b y^=WX+b 可以是任意实数,而分类问题需要的是一个概率值,范围在 [ 0 , 1 ] [0, 1] [0,1] 之间。Sigmoid 函数(也称 Logistic 函数)正好能实现这个转换,它可以将任意实数输入“挤压”到 ( 0 , 1 ) (0, 1) (0,1) 区间。

2.2.2 Sigmoid 函数的定义与图像

Sigmoid 函数的数学表达式为:
σ ( z ) = 1 1 + e − z \sigma(z) = \frac{1}{1 + e^{-z}} σ(z)=1+ez1
其中 z z z 通常是线性组合的结果,即 z = W X + b z = WX + b z=WX+b

图像: Sigmoid 函数的图像呈 “S” 形:

def sigmoid(z):return 1 / (1 + np.exp(-z))z_values = np.linspace(-10, 10, 200)
sigma_values = sigmoid(z_values)plt.figure(figsize=(8, 5))
plt.plot(z_values, sigma_values, label=r'$\sigma(z) = \frac{1}{1 + e^{-z}}$')
plt.title('Sigmoid (Logistic) 函数图像')
plt.xlabel('z')
plt.ylabel(r'$\sigma(z)$')
plt.axhline(0.5, color='red', linestyle='--', label='y = 0.5')
plt.axhline(0, color='gray', linestyle=':')
plt.axhline(1, color='gray', linestyle=':')
plt.yticks([0, 0.5, 1.0])
plt.grid(True)
plt.legend()
plt.show()

图示说明:
从 Sigmoid 函数的图像可以看出:

  • z z z 趋向于 + ∞ +\infty + 时, σ ( z ) \sigma(z) σ(z) 趋向于 1。
  • z z z 趋向于 − ∞ -\infty 时, σ ( z ) \sigma(z) σ(z) 趋向于 0。
  • z = 0 z = 0 z=0 时, σ ( z ) = 0.5 \sigma(z) = 0.5 σ(z)=0.5

2.2.3 Sigmoid 函数的特性

  • 输出范围: ( 0 , 1 ) (0, 1) (0,1),完美契合概率的定义。
  • 单调连续: 易于求导,这在梯度下降等优化算法中非常重要。

2.3 逻辑回归模型

2.3.1 数学表达式

逻辑回归模型首先计算输入特征的线性组合 z = W X + b z = WX + b z=WX+b,然后将结果 z z z 输入到 Sigmoid 函数中,得到预测概率 p ^ \hat{p} p^:
p ^ = σ ( z ) = σ ( W X + b ) = 1 1 + e − ( W X + b ) \hat{p} = \sigma(z) = \sigma(WX + b) = \frac{1}{1 + e^{-(WX + b)}} p^=σ(z)=σ(WX+b)=1+e(WX+b)1
p ^ \hat{p} p^ 表示样本属于正类(通常用标签1表示)的概率。那么,样本属于负类(标签0)的概率就是 1 − p ^ 1 - \hat{p} 1p^

2.3.2 决策边界 (Decision Boundary)

得到概率 p ^ \hat{p} p^ 后,我们需要一个决策规则来将其转换为类别预测。通常,我们会选择一个阈值 (threshold),比如 0.5。

  • 如果 p ^ ≥ 0.5 \hat{p} \ge 0.5 p^0.5,则预测为正类 (1)。
  • 如果 p ^ < 0.5 \hat{p} < 0.5 p^<0.5,则预测为负类 (0)。

p ^ = 0.5 \hat{p} = 0.5 p^=0.5 时, σ ( z ) = 0.5 \sigma(z) = 0.5 σ(z)=0.5,这意味着 z = W X + b = 0 z = WX + b = 0 z=WX+b=0。这个方程 W X + b = 0 WX + b = 0 WX+b=0 就定义了决策边界

  • 对于一元逻辑回归(一个特征 x 1 x_1 x1),决策边界是一个点: w 1 x 1 + b = 0 ⇒ x 1 = − b / w 1 w_1x_1 + b = 0 \Rightarrow x_1 = -b/w_1 w1x1+b=0x1=b/w1
  • 对于二元逻辑回归(两个特征 x 1 , x 2 x_1, x_2 x1,x2),决策边界是一条直线: w 1 x 1 + w 2 x 2 + b = 0 w_1x_1 + w_2x_2 + b = 0 w1x1+w2x2+b=0
  • 对于更高维度,决策边界是一个超平面。

2.4 损失函数:交叉熵 (Cross-Entropy)

2.4.1 为什么不用 MSE?

如果将逻辑回归的 Sigmoid 输出直接用于 MSE 损失函数,即 KaTeX parse error: Expected 'EOF', got '_' at position 35: …sum (\text{true_̲label} - \sigma…,那么这个损失函数相对于参数 W W W b b b 将是一个非凸函数 (non-convex function)。非凸函数有很多局部最小值,使用梯度下降法进行优化时很容易陷入局部最优解,而不是全局最优解。

2.4.2 交叉熵的定义与公式

为了解决这个问题,逻辑回归通常使用对数损失函数 (Log Loss),也称为二元交叉熵损失 (Binary Cross-Entropy Loss)
对于单个样本 ( x , y ) (x, y) (x,y),其中 y y y 是真实标签 (0 或 1), p ^ = σ ( W X + b ) \hat{p} = \sigma(WX+b) p^=σ(WX+b) 是模型预测该样本为正类 (1) 的概率:

  • 如果真实标签 y = 1 y = 1 y=1,我们希望预测概率 p ^ \hat{p} p^ 尽可能接近 1。损失项为 − log ⁡ ( p ^ ) -\log(\hat{p}) log(p^)。当 p ^ → 1 \hat{p} \to 1 p^1 时, − log ⁡ ( p ^ ) → 0 -\log(\hat{p}) \to 0 log(p^)0;当 p ^ → 0 \hat{p} \to 0 p^0 时, − log ⁡ ( p ^ ) → ∞ -\log(\hat{p}) \to \infty log(p^)
  • 如果真实标签 y = 0 y = 0 y=0,我们希望预测概率 p ^ \hat{p} p^ 尽可能接近 0,即 1 − p ^ 1-\hat{p} 1p^ 尽可能接近 1。损失项为 − log ⁡ ( 1 − p ^ ) -\log(1-\hat{p}) log(1p^)。当 p ^ → 0 \hat{p} \to 0 p^0 时 ( 1 − p ^ → 1 1-\hat{p} \to 1 1p^1), − log ⁡ ( 1 − p ^ ) → 0 -\log(1-\hat{p}) \to 0 log(1p^)0;当 p ^ → 1 \hat{p} \to 1 p^1 时 ( 1 − p ^ → 0 1-\hat{p} \to 0 1p^0), − log ⁡ ( 1 − p ^ ) → ∞ -\log(1-\hat{p}) \to \infty log(1p^)

将这两种情况合并,单个样本的交叉熵损失函数可以写为:
Cost ( p ^ , y ) = − [ y log ⁡ ( p ^ ) + ( 1 − y ) log ⁡ ( 1 − p ^ ) ] \text{Cost}(\hat{p}, y) = -[y \log(\hat{p}) + (1-y) \log(1-\hat{p})] Cost(p^,y)=[ylog(p^)+(1y)log(1p^)]
对于 N N N 个训练样本的整个数据集,平均交叉熵损失为:
J ( W , b ) = − 1 N ∑ i = 1 N [ y ( i ) log ⁡ ( p ^ ( i ) ) + ( 1 − y ( i ) ) log ⁡ ( 1 − p ^ ( i ) ) ] J(W,b) = -\frac{1}{N} \sum_{i=1}^{N} [y^{(i)} \log(\hat{p}^{(i)}) + (1-y^{(i)}) \log(1-\hat{p}^{(i)})] J(W,b)=N1i=1N[y(i)log(p^(i))+(1y(i))log(1p^(i))]
其中 p ^ ( i ) = σ ( W X ( i ) + b ) \hat{p}^{(i)} = \sigma(W X^{(i)} + b) p^(i)=σ(WX(i)+b)

2.4.3 交叉熵的意义

交叉熵损失函数是凸函数,这意味着它只有一个全局最小值,使用梯度下降等优化算法可以有效地找到最优参数。它能够很好地惩罚那些“自信的错误预测”(例如,真实标签是1,但模型预测概率接近0)。

2.5 实践:简单逻辑回归示例 (Python & Scikit-learn)

下面我们用 Python 和 Scikit-learn 来实现一个简单的二分类逻辑回归。

2.5.1 数据准备

我们使用 Scikit-learn 内置的 make_classification 函数生成一个简单的二分类数据集。

from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score, confusion_matrix, classification_report# 生成一个二分类数据集
X, y = make_classification(n_samples=200, n_features=2, n_informative=2, n_redundant=0,n_clusters_per_class=1, flip_y=0.1, random_state=42)# 将数据集划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)print("部分训练数据特征 X_train (前5个):\n", X_train[:5])
print("部分训练数据标签 y_train (前5个):\n", y_train[:5])

2.5.2 使用 Scikit-learn 实现

# 1. 创建逻辑回归模型实例
#    solver='liblinear' 适用于小型数据集,且是默认求解器之一
#    random_state 用于结果可复现
log_reg_model = LogisticRegression(solver='liblinear', random_state=42)# 2. 训练模型
log_reg_model.fit(X_train, y_train)# 3. 查看模型参数 (可选)
#    对于多特征,系数会多一些
print(f"\n学习到的模型系数 (W): {log_reg_model.coef_}")
print(f"学习到的模型截距 (b): {log_reg_model.intercept_}")# 4. 在测试集上进行预测
y_pred_test = log_reg_model.predict(X_test)
y_pred_proba_test = log_reg_model.predict_proba(X_test) # 获取预测概率print(f"\n部分测试集预测标签 (前5个): {y_pred_test[:5]}")
print(f"部分测试集预测概率 (前5个, [P(class 0), P(class 1)]):\n {y_pred_proba_test[:5]}")

2.5.3 结果解读与可视化

# 5. 评估模型
accuracy = accuracy_score(y_test, y_pred_test)
conf_matrix = confusion_matrix(y_test, y_pred_test)
class_report = classification_report(y_test, y_pred_test)print(f"\n模型在测试集上的准确率 (Accuracy): {accuracy:.4f}")
print(f"\n混淆矩阵 (Confusion Matrix):\n{conf_matrix}")
print(f"\n分类报告 (Classification Report):\n{class_report}")# 可视化决策边界 (仅适用于2个特征的情况)
plt.figure(figsize=(10, 6))# 绘制数据点
plt.scatter(X_test[y_test == 0][:, 0], X_test[y_test == 0][:, 1], color='blue', marker='o', label='类别 0 (实际)')
plt.scatter(X_test[y_test == 1][:, 0], X_test[y_test == 1][:, 1], color='red', marker='x', label='类别 1 (实际)')# 绘制决策边界
ax = plt.gca()
xlim = ax.get_xlim()
ylim = ax.get_ylim()# 创建网格来评估模型
xx, yy = np.meshgrid(np.linspace(xlim[0], xlim[1], 100),np.linspace(ylim[0], ylim[1], 100))
Z = log_reg_model.predict_proba(np.c_[xx.ravel(), yy.ravel()])[:, 1]
Z = Z.reshape(xx.shape)# 绘制等高线图(决策边界是P=0.5的地方)
plt.contourf(xx, yy, Z, levels=[0, 0.5, 1], alpha=0.3, colors=['blue', 'red']) # 填充区域
plt.contour(xx, yy, Z, levels=[0.5], colors='green', linewidths=2) # 决策边界线plt.title('逻辑回归决策边界示例 (测试集)')
plt.xlabel('特征 1')
plt.ylabel('特征 2')
plt.legend(loc='best')
plt.grid(True)
plt.show()

这段代码会输出模型在测试集上的准确率、混淆矩阵和分类报告。对于二维特征数据,它还会绘制出数据点以及学习到的决策边界。

三、模型训练的基本流程 (概念引入)

无论是线性回归、逻辑回归,还是未来我们将学习的更复杂的神经网络,它们“学习”或“训练”的过程都遵循一个相似的基本流程。这里我们先从概念上理解这个流程。

3.1 概览

模型训练是一个迭代的过程,目标是找到一组最优的模型参数(比如线性回归中的 w w w b b b),使得损失函数的值最小。

3.2 前向传播 (Forward Propagation)

3.2.1 概念

前向传播是指将输入数据从模型的输入层开始,逐层通过模型(如果有多层的话),直到产生输出(即预测值)的过程。

  • 对于线性回归: 输入 X X X 经过 $ \hat{y} = WX + b $ 得到预测值 y ^ \hat{y} y^
  • 对于逻辑回归: 输入 X X X 经过 $ z = WX + b $,然后 $ \hat{p} = \sigma(z) $ 得到预测概率 p ^ \hat{p} p^

3.2.2 示例

假设有一个样本 ( x 1 , x 2 ) (x_1, x_2) (x1,x2),当前模型参数为 w 1 , w 2 , b w_1, w_2, b w1,w2,b
在线性回归中,前向传播计算 y ^ = w 1 x 1 + w 2 x 2 + b \hat{y} = w_1x_1 + w_2x_2 + b y^=w1x1+w2x2+b
在逻辑回归中,前向传播计算 z = w 1 x 1 + w 2 x 2 + b z = w_1x_1 + w_2x_2 + b z=w1x1+w2x2+b,然后计算 p ^ = 1 1 + e − z \hat{p} = \frac{1}{1+e^{-z}} p^=1+ez1

3.3 计算损失 (Calculate Loss)

3.3.1 概念

在前向传播得到预测值后,我们会使用预先定义的损失函数来比较预测值和真实标签之间的差异。这个差异就是“损失”或“误差”。

3.3.2 重要性

损失值的大小直接反映了当前模型参数的好坏。损失越大,说明模型预测越不准确。我们的目标是调整参数,使得这个损失值尽可能小。

3.4 反向传播 (Backward Propagation - 概念引入)

3.4.1 概念引入

反向传播是模型学习的核心机制之一。简单来说,它是将前向传播计算出的损失(误差)从输出层反向传播回模型的每一层(或每个参数),以计算出每个参数对总损失的“贡献程度”或者说“责任”。这个“贡献程度”是通过计算损失函数关于每个参数的梯度 (gradient) 来量化的。

梯度本质上是导数或偏导数,它指明了如果参数发生微小变动,损失函数会如何变化。

3.4.2 梯度的角色

梯度告诉我们参数应该往哪个方向调整才能使损失减小得最快。如果某个参数的梯度为正,说明增加该参数会使损失增加,因此我们应该减小该参数;反之亦然。

(注意:反向传播的详细数学推导,尤其是链式法则的应用,我们将在后续介绍神经网络时深入讲解。)

3.5 参数更新 (Parameter Update - 概念引入)

3.5.1 概念引入

得到每个参数的梯度后,我们就可以根据梯度来更新参数了。最常见的参数更新规则是梯度下降法 (Gradient Descent) 的变种。其基本思想是:参数沿着梯度的反方向进行调整,因为梯度的反方向是损失函数下降最快的方向。

更新公式可以简化为:
新参数 = 旧参数 − 学习率 × 梯度 \text{新参数} = \text{旧参数} - \text{学习率} \times \text{梯度} 新参数=旧参数学习率×梯度
例如,对于权重 w w w
w new = w old − α ∂ J ∂ w w_{\text{new}} = w_{\text{old}} - \alpha \frac{\partial J}{\partial w} wnew=woldαwJ
其中:

  • α \alpha α (alpha) 是学习率 (learning rate),它是一个超参数,控制每次参数更新的步长。
  • ∂ J ∂ w \frac{\partial J}{\partial w} wJ 是损失函数 J J J 关于参数 w w w 的梯度。

3.5.2 学习率的重要性

学习率的选择非常关键:

  • 学习率太小: 模型收敛速度会很慢,需要很多次迭代才能达到最优。
  • 学习率太大: 参数更新的步子迈得太大,可能会在最优解附近震荡甚至发散,导致无法收敛。

选择合适的学习率是训练模型中的一个重要技巧,我们会在后续的优化算法章节详细讨论。

整个训练流程就是不断重复“前向传播 -> 计算损失 -> 反向传播计算梯度 -> 更新参数”这个循环,直到模型的性能达到满意的水平或者满足其他停止条件。

四、目标:为理解神经网络打下基础

学习线性回归和逻辑回归不仅仅是为了掌握这两个模型本身,更重要的是它们为我们理解更复杂的深度学习模型(尤其是神经网络)奠定了坚实的基础。

4.1 线性回归/逻辑回归与神经网络的联系

4.1.1 单个神经元

实际上,神经网络中的一个神经元 (neuron) 的基本计算过程与逻辑回归(或者说线性变换后接一个激活函数)非常相似。
一个神经元接收多个输入,对这些输入进行加权求和(就像 W X + b WX+b WX+b),然后将结果通过一个激活函数 (activation function)(Sigmoid 就是一种激活函数)得到输出。

单个神经元 (类似逻辑回归单元)
W1
W2
1
z = WX+b
输出
Σ
输入1
输入2
偏置b
激活函数 σ
预测概率/值

所以,你可以把逻辑回归看作是一个非常简单的、只有一个神经元的神经网络。

4.1.2 构建模块

线性回归和逻辑回归中涉及的核心概念,如:

  • 参数(权重和偏置)
  • 前向传播
  • 损失函数
  • 梯度
  • 参数更新(梯度下降)
    这些都是构建和训练任何神经网络都不可或缺的组件。理解了这些简单模型是如何工作的,就能更容易地理解多层神经网络是如何堆叠这些基本单元并进行学习的。

4.2 为什么这些基础很重要?

4.2.1 理解核心机制

掌握线性回归和逻辑回归的原理,能帮助我们从根本上理解机器学习模型是如何从数据中“学习”模式的。这种理解对于后续调试更复杂的模型、选择合适的模型架构以及解释模型行为都至关重要。

4.2.2 解决实际问题

尽管简单,线性回归和逻辑回归在工业界仍然被广泛应用于许多场景,特别是当数据特征与输出之间的关系相对简单,或者对模型可解释性要求较高时。它们是快速搭建基线模型、验证想法的有力工具。

五、总结

在本篇文章中,我们深入探讨了两种基础的机器学习模型:

  1. 线性回归 (Linear Regression):

    • 目标: 预测连续值输出。
    • 模型: y ^ = W X + b \hat{y} = WX + b y^=WX+b
    • 损失函数: 均方误差 (MSE), J = 1 N ∑ ( y − y ^ ) 2 J = \frac{1}{N} \sum (y - \hat{y})^2 J=N1(yy^)2
    • 核心思想: 找到最佳拟合直线/平面来描述特征与输出间的线性关系。
  2. 逻辑回归 (Logistic Regression):

    • 目标: 进行二分类(或多分类)预测。
    • 模型: p ^ = σ ( W X + b ) = 1 1 + e − ( W X + b ) \hat{p} = \sigma(WX + b) = \frac{1}{1 + e^{-(WX+b)}} p^=σ(WX+b)=1+e(WX+b)1,使用 Sigmoid 函数将输出映射到 ( 0 , 1 ) (0,1) (0,1) 作为概率。
    • 损失函数: 二元交叉熵 (Binary Cross-Entropy), J = − 1 N ∑ [ y log ⁡ ( p ^ ) + ( 1 − y ) log ⁡ ( 1 − p ^ ) ] J = -\frac{1}{N} \sum [y \log(\hat{p}) + (1-y) \log(1-\hat{p})] J=N1[ylog(p^)+(1y)log(1p^)]
    • 核心思想: 找到一个决策边界来区分不同的类别。
  3. 模型训练的基本流程:

    • 初始化参数。
    • 前向传播: 根据当前参数计算预测值。
    • 计算损失: 使用损失函数评估预测的好坏。
    • 反向传播: 计算损失函数关于模型参数的梯度。
    • 参数更新: 根据梯度和学习率调整参数(如梯度下降法)。
    • 迭代: 重复以上步骤直至模型收敛或达到停止条件。

理解这些基础模型和训练流程,为我们后续学习神经网络(可以看作是这些简单模型的复杂堆叠和扩展)打下了坚实的基础。在下一篇文章中,我们可能会进行一个更完整的机器学习项目实战,或者开始初步探索神经网络的奥秘,敬请期待!


相关文章:

  • 云共享虚拟主机具体是指什么?
  • “追光”植物背后的故事(二)
  • SpringBoot--springboot简述及快速入门
  • 基于 PLC 的轮式服务机器人研究
  • 医疗实时操作系统方案:手术机器人的微秒级运动控制
  • 【Hot 100】208. 实现 Trie (前缀树)
  • 基于C#+MySQL实现(WinForm)企业设备使用信息管理系统
  • niushop单商户V5多门店版V5.5.0全插件+商品称重、商家手机端+搭建环境教程
  • 从数据中台到数据飞轮:数字化转型的演进之路
  • python如何做人脸识别
  • Docker与PostgreSQL
  • 国联股份卫多多与七腾机器人签署战略合作协议
  • 基于Spring Boot+Layui构建企业级电子招投标系统实战指南
  • 工业巡检机器人 —— 机器人市场的新兴增长引擎
  • OpenTiny icons——超轻量的CSS图标库,引领图标库新风向
  • Git 第二讲---提高篇 git的分支管理
  • AD 飞线的显示与隐藏
  • 图论part09dijkstra算法
  • 【时时三省】(C语言基础)使用字符串处理函数
  • 四旋翼控制入门笔记
  • 杭州“放大招”支持足球发展:足球人才可评“高层次人才”
  • 体坛联播|C罗儿子完成国家队首秀,德约结束与穆雷合作
  • 加拿大总理宣布新内阁名单
  • 佩斯科夫:若普京认为必要,将公布土耳其谈判俄方代表人选
  • 广东韶关一镇干部冲进交通事故火海救人,获授“见义勇为”奖励万元
  • 央行等印发《关于金融支持广州南沙深化面向世界的粤港澳全面合作的意见》