利用逻辑回归进行数据分类
在数据分类领域,逻辑回归是一种强大的工具。下面我们将详细探讨如何使用逻辑回归对汽车数据进行分类,判断一辆车是宝马(BMW)还是普锐斯(Prius)。
1. 测量汽车的“宝马特征度”
1.1 决策边界
我们从一个与上一节类似的决策边界开始。决策边界函数为 (p(x) = 0.56 - 0.35 \cdot x),它将价格 (p) 表示为里程 (x) 的函数。这个函数适用于经过缩放的数据集,通过我们的
test_classifier
函数对缩放后的数据进行测试,发现该决策边界对数据的分类准确率达到了 78.5%。
1.2 “宝马特征度”的衡量
将决策边界函数 (p = ax + b)(这里 (a = -0.35),(b = 0.56))变形为 (p - ax - b = 0)。这个式子 (p - ax - b) 可以用来衡量一个数据点的“宝马特征度”,具体情况如下表所示:
| 数据点位置 | (p - ax - b) 的值 | 汽车类型可能性 |
| — | — | — |
| 决策边界上方 | (p - ax - b > 0) | 可能是宝马 |
| 决策边界上 | (p - ax - b = 0) | 可能是宝马或普锐斯 |
| 决策边界下方 | (p - ax - b < 0) | 可能是普锐斯 |
函数 (f(x, p) = p - ax - b) 几乎满足我们的需求,它输入里程和价格,输出一个数值,数值越高表示越可能是宝马,越低表示越可能是普锐斯。但该函数输出的数值范围不在 0 到 1 之间,且分界值是 0 而不是我们期望的 0.5。
2. 引入 sigmoid 函数
2.1 sigmoid 函数的定义
逻辑回归需要使用逻辑函数,最基本的逻辑函数是 sigmoid 函数,其定义为:
(\sigma(x) = \frac{1}{1 + e^{-x}})
在 Python 中可以这样实现:
from math import exp
def sigmoid(x):
return 1 / (1 + exp(-x))
2.2 sigmoid 函数的性质
sigmoid 函数的图像形状类似字母 S,它可以将任何输入的数字映射到 0 到 1 之间的值。大的负数输入会使结果接近 0,大的正数输入会使结果接近 1,且 (\sigma(0) = 0.5)。可以将其看作是将 ((-\infty, +\infty)) 的范围转换为更易于处理的 ([0, 1]) 范围。
3. 将 sigmoid 函数与其他函数组合
3.1 组合函数的构建
我们将之前的函数 (f(x, p) = p - ax - b) 的结果通过 sigmoid 函数进行处理,得到新的函数 (L(x, p) = \sigma(f(x, p)))。在 Python 中实现如下:
def make_logistic(a, b, c):
def l(x, p):
return sigmoid(a * x + b * p - c)
return l
3.2 组合函数的优势
从 2D 热力图上看,(L(x, p)) 和 (f(x, p)) 看起来很相似,但如果将它们的图像绘制为 3D 中的 2D 曲面,就会发现 sigmoid 函数的曲线形状起到了作用。由于我们用 0 表示普锐斯,1 表示宝马,(L(x, p)) 的值更接近这些分类标签,而 (f(x, p)) 的值会趋向于正无穷和负无穷。
4. 练习题
4.1 练习题 1
找到一个函数 (h(x)),使得当 (x) 为大的正数时,(h(x)) 接近 0;当 (x) 为大的负数时,(h(x)) 接近 1,且 (h(3) = 0.5)。
解答
:函数 (y(x) = 3 - x) 满足 (y(3) = 0),当 (x) 为大的负数时,(y(x)) 趋向于正无穷;当 (x) 为大的正数时,(y(x)) 趋向于负无穷。将 (y(x)) 的结果传入 sigmoid 函数,得到 (h(x) = \sigma(y(x)) = \sigma(3 - x)) 满足要求。
4.2 练习题 2
由于里程 (x) 和价格 (p) 不能为负数,函数 (f(x, p)) 实际上有一个下限。那么一辆车能产生的 (f) 的最低值是多少?
解答
:根据热力图和函数方程,当 (x) 和 (p) 减小时,(f = p - ax - b = p + 0.35 \cdot x - 0.56) 的值会变小。所以 (f(x, p)) 的最小值出现在 ((x, p) = (0, 0)) 处,即 (f(0, 0) = -0.56)。
5. 探索可能的逻辑函数
5.1 目标
我们不满足于通过目测得到的决策边界对应的 (L(x, p)) 函数,而是希望找到最适合数据的 (L(x, p)) 函数。为此,我们将探索一个由三个参数 (a)、(b) 和 (c) 定义的逻辑函数,该函数接受 2D 向量并返回 0 到 1 之间的数值,且决策边界 (L(x, p) = 0.5) 是一条直线。
5.2 逻辑函数的参数化
直线的一般形式为 (ax + bp = c),对应的函数 (z(x, p) = ax + bp - c) 在直线上的值为 0,直线一侧为正值,另一侧为负值。将 (z(x, p)) 通过 sigmoid 函数处理,得到一般形式的逻辑函数 (L(x, p) = \sigma(ax + bp - c))。我们可以用 Python 实现一个函数
make_logistic(a, b, c)
来生成这样的逻辑函数:
def make_logistic(a, b, c):
def l(x, p):
return sigmoid(a * x + b * p - c)
return l
5.3 衡量逻辑函数的拟合质量
5.3.1 简单成本函数
一种简单的衡量逻辑函数 (L) 误差或成本的方法是计算它与正确值(0 或 1)的偏差,并将所有数据点的偏差相加。Python 代码如下:
def simple_logistic_cost(a, b, c):
l = make_logistic(a, b, c)
errors = [abs(is_bmw - l(x, p)) for x, p, is_bmw in scaled_car_data]
return sum(errors)
但这个简单成本函数不足以让梯度下降收敛到 (a)、(b) 和 (c) 的最优值。例如,对于一个表示普锐斯的数据点 ((x, p, 0)),逻辑函数 (L_1(x, p)) 返回 0.99,误差为 (|0 - 0.99| = 0.99);另一个逻辑函数 (L_2(x, p)) 返回 0.999,误差为 (|0 - 0.999| = 0.999),两者误差相差不大,但实际上 (L_2) 的错误程度应该比 (L_1) 大得多。
5.3.2 改进的成本函数
为了更准确地衡量错误程度,我们使用负对数函数 (-\log(x)),它可以将小的输入值转换为大的输出值。具体实现如下:
from math import log
def point_cost(l, x, p, is_bmw):
wrong = 1 - is_bmw
return -log(abs(wrong - l(x, p)))
def logistic_cost(a, b, c):
l = make_logistic(a, b, c)
errors = [point_cost(l, x, p, is_bmw) for x, p, is_bmw in scaled_car_data]
return sum(errors)
通过梯度下降最小化
logistic_cost
函数,有望得到更好的逻辑函数。在进行梯度下降之前,我们可以先进行一个简单的检查,确认对于明显更好的决策边界,
logistic_cost
返回的值更低。
下面是整个流程的 mermaid 流程图:
graph TD;
A[开始] --> B[确定决策边界];
B --> C[衡量“宝马特征度”];
C --> D[引入 sigmoid 函数];
D --> E[组合函数];
E --> F[练习题解答];
F --> G[探索逻辑函数];
G --> H[参数化逻辑函数];
H --> I[衡量拟合质量];
I --> J[简单成本函数];
I --> K[改进成本函数];
K --> L[梯度下降优化];
L --> M[结束];
综上所述,我们通过一系列步骤,从确定决策边界到引入 sigmoid 函数,再到构建和优化逻辑函数,逐步实现了使用逻辑回归对汽车数据进行分类的目标。通过不断调整参数,我们可以找到最适合数据的逻辑函数,提高分类的准确性。
6. 深入理解成本函数的选择
6.1 简单成本函数的局限性
简单成本函数
simple_logistic_cost
只是简单地计算逻辑函数预测值与正确值的绝对偏差之和。从前面的例子可以看出,当逻辑函数对某个数据点的预测错误程度加深时,简单成本函数不能很好地体现出错误程度的显著差异。这是因为它没有考虑到预测的确定性程度,只是单纯地计算差值。例如,对于一个表示普锐斯的数据点,预测值从 0.99 变为 0.999,虽然错误程度明显加深,但简单成本函数的差值却很小。
6.2 改进成本函数的优势
改进后的成本函数
logistic_cost
引入了负对数函数 (-\log(x)),很好地解决了简单成本函数的问题。当逻辑函数对某个数据点的预测错误程度加深时,负对数函数会将这种微小的差异放大,使得成本函数能够更准确地反映出预测的错误程度。例如,对于预测值为 0.99 和 0.999 的情况,通过负对数函数计算得到的成本差异会更加明显,更符合我们对错误程度的直观理解。
6.3 成本函数对比表格
| 成本函数 | 计算方式 | 优点 | 缺点 |
|---|---|---|---|
simple_logistic_cost
| 计算预测值与正确值的绝对偏差之和 | 计算简单,直观易懂 | 不能很好地体现预测错误程度的差异,不利于梯度下降收敛 |
logistic_cost
| 计算每个数据点的负对数误差之和 | 能准确反映预测的错误程度,有利于梯度下降收敛 | 计算相对复杂,涉及对数运算 |
7. 梯度下降优化逻辑函数
7.1 梯度下降的原理
梯度下降是一种常用的优化算法,用于寻找函数的最小值。在我们的问题中,我们的目标是找到参数 (a)、(b) 和 (c) 的值,使得
logistic_cost
函数的值最小。梯度下降的基本思想是沿着函数的负梯度方向逐步更新参数,直到找到函数的局部最小值。
7.2 梯度下降的步骤
- 初始化参数 :随机初始化参数 (a)、(b) 和 (c) 的值。
-
计算梯度
:计算
logistic_cost函数关于参数 (a)、(b) 和 (c) 的梯度。 - 更新参数 :根据梯度和学习率,更新参数 (a)、(b) 和 (c) 的值。
- 重复步骤 2 和 3 :直到满足停止条件,例如达到最大迭代次数或梯度的绝对值小于某个阈值。
7.3 梯度下降的 Python 代码示例
import numpy as np
# 定义学习率和最大迭代次数
learning_rate = 0.01
max_iterations = 1000
# 初始化参数
a = 0
b = 0
c = 0
for i in range(max_iterations):
# 计算当前参数下的成本
current_cost = logistic_cost(a, b, c)
# 计算梯度(这里简化,实际需要根据链式法则计算)
# 假设已经有计算梯度的函数 compute_gradients
grad_a, grad_b, grad_c = compute_gradients(a, b, c)
# 更新参数
a = a - learning_rate * grad_a
b = b - learning_rate * grad_b
c = c - learning_rate * grad_c
# 计算更新后的成本
new_cost = logistic_cost(a, b, c)
# 如果成本不再下降,提前停止
if abs(new_cost - current_cost) < 1e-6:
break
print(f"最优参数: a = {a}, b = {b}, c = {c}")
8. 逻辑回归在汽车分类中的应用总结
8.1 整体流程回顾
整个逻辑回归用于汽车分类的过程可以总结为以下几个关键步骤:
1.
确定决策边界
:通过分析数据,找到一个合适的决策边界函数 (p(x) = ax + b),用于区分宝马和普锐斯。
2.
衡量“宝马特征度”
:将决策边界函数变形,得到函数 (f(x, p) = p - ax - b),用于衡量一个数据点的“宝马特征度”。
3.
引入 sigmoid 函数
:为了将 (f(x, p)) 的输出范围映射到 0 到 1 之间,引入 sigmoid 函数 (\sigma(x)),得到新的函数 (L(x, p) = \sigma(f(x, p)))。
4.
构建和优化逻辑函数
:通过参数化逻辑函数 (L(x, p) = \sigma(ax + bp - c)),并使用梯度下降算法优化参数 (a)、(b) 和 (c),使得逻辑函数能够更好地拟合数据。
8.2 实际应用中的注意事项
- 数据预处理 :在实际应用中,需要对数据进行预处理,例如缩放、归一化等,以确保数据的质量和一致性。
- 参数调整 :梯度下降算法中的学习率和最大迭代次数等参数需要根据具体情况进行调整,以达到最佳的优化效果。
- 过拟合和欠拟合 :需要注意避免过拟合和欠拟合的问题。过拟合会导致模型在训练数据上表现很好,但在测试数据上表现不佳;欠拟合则会导致模型无法很好地拟合数据。
8.3 未来发展方向
逻辑回归作为一种经典的分类算法,在很多领域都有广泛的应用。未来,可以结合其他机器学习算法,如神经网络、支持向量机等,进一步提高分类的准确性和性能。同时,也可以探索更复杂的特征工程方法,提取更多有价值的特征,从而更好地描述数据。
下面是逻辑回归应用于汽车分类的另一个 mermaid 流程图,更详细地展示了整个过程:
graph TD;
A[数据收集] --> B[数据预处理];
B --> C[确定决策边界];
C --> D[衡量“宝马特征度”];
D --> E[引入 sigmoid 函数];
E --> F[构建逻辑函数];
F --> G[定义成本函数];
G --> H[梯度下降优化];
H --> I[模型评估];
I --> J[模型应用];
J --> K[结果分析];
K --> L[参数调整];
L --> H;
通过以上内容,我们全面地介绍了如何使用逻辑回归对汽车数据进行分类。从基本概念的引入到具体算法的实现,再到实际应用中的注意事项和未来发展方向,希望能够帮助读者更好地理解和应用逻辑回归算法。在实际操作中,可以根据具体情况进行调整和优化,以达到最佳的分类效果。
超级会员免费看
3328

被折叠的 条评论
为什么被折叠?



