解决预测错误的Bug
1 课程概览
本课解决手写数字识别案例中预测结果错误的Bug。核心问题是:使用matplotlib读取图片时,像素值可能不是精确的整数(如0.83、0.116等小数),如果再除以255进行归一化,会导致数据变为科学计数法形式,从根源上改变了数据值,从而导致预测失败。解决方法是去掉除以255的归一化操作,直接使用原始读取的像素值进行预测。
2 核心概念与定义
- 像素值精度问题:matplotlib读取图片时,像素值可能不是精确的整数,而是小数。
- 归一化副作用:小数像素值除以255后会变为科学计数法,改变数据本质。
- 原始值预测:直接使用读取的像素值进行预测,不进行归一化。
3 算法与模型详解
3.1 问题分析
训练时:
- 数据集像素值为整数(0~255)
- 归一化:X / 255,缩放到0~1范围
预测时:
- matplotlib读取图片,像素值为小数(如0.83、0.116)
- 如果再除以255:小数 / 255 = 科学计数法(如1.16e-05)
- 数据本质发生改变,导致预测失败
3.2 原始数据对比
| 数据来源 | 像素值类型 | 示例 |
|---|---|---|
| CSV数据集 | 整数 | 0, 60, 100, 255 |
| matplotlib读取 | 小数 | 0.83, 0.116, 0.007 |
3.3 归一化后的变化
| 操作 | 原始值 | 归一化后 | 问题 |
|---|---|---|---|
| 整数 / 255 | 60 | 0.235 | 正常 |
| 小数 / 255 | 0.83 | 0.00325 | 科学计数法 |
3.4 解决方案
去掉除以255的归一化操作:
- 训练时:保持归一化(X / 255)
- 预测时:不归一化,直接使用原始读取的像素值
原因:
- 读取的像素值已经是小数,再除以255会变成科学计数法
- 直接使用原始值,KNN算法会寻找最接近的点,预测概率更大
4 数学原理与推导
本课重点为问题分析,无数学推导。
5 代码示例
import matplotlib.pyplot as plt
import joblib
import warnings
warnings.filterwarnings('ignore', module='sklearn.neighbors')
def use_model():
# 1. 加载图片
X = plt.imread('./data/demo.png')
# 2. 绘制图片
plt.imshow(X, cmap='gray')
plt.axis('off')
plt.show()
# 3. 加载模型
estimator = joblib.load('./model/手写数字识别.pkl')
# 4. 数据转换
# 4.1 reshape为1×784
X = X.reshape(1, 784)
# 4.2 不进行归一化(关键修改)
# X = X / 255 # 注释掉这一行
# 5. 模型预测
y_predict = estimator.predict(X)
# 6. 打印预测结果
print("预测值为:", y_predict)
if __name__ == '__main__':
use_model()
输出示例:
预测值为: [2]
6 重难点与易错提醒
- ❗重点:预测时不要除以255,直接使用原始读取的像素值。
- ❗重点:matplotlib读取图片时像素值可能是小数,不是精确整数。
- ❗重点:小数除以255会变成科学计数法,改变数据本质。
- ⚠️易错:盲目套用训练时的归一化操作到预测阶段。
- ⚠️易错:认为训练和预测的数据处理方式必须完全一致(此处为例外)。
- 💡深入理解:KNN算法寻找最接近的点,原始值预测概率更大。
7 课堂问答精选
Q: 为什么训练时归一化,预测时不归一化?
A:
- 训练时:CSV数据集像素值为整数(0~255),归一化(/255)缩放到0~1范围,正常。
- 预测时:matplotlib读取图片像素值为小数(如0.83),再除以255会变成科学计数法(如0.00325),改变数据本质,导致预测失败。 因此预测时不归一化,直接使用原始读取的像素值。
Q: 为什么matplotlib读取的像素值是小数?
A: 因为matplotlib通过内部取色器读取图片像素点时,可能无法精确读取到具体的整数值,导致读取结果为小数。这与CSV数据集中的整数像素值存在差异。
8 本课小结
- 问题:预测时除以255导致小数变为科学计数法,预测失败。
- 原因:matplotlib读取图片像素值为小数,再除以255改变数据本质。
- 解决:去掉预测时的归一化操作,直接使用原始读取的像素值。
- 训练时保持归一化,预测时不归一化(此处为例外)。
- KNN算法寻找最接近的点,原始值预测概率更大。
9 延伸思考与实践
- 实践:对比归一化和不归一化的预测结果。
- 思考:为什么训练和预测的数据处理方式在此处不一致?
- 总结:手写数字识别案例的完整流程。