了解问题
通过解决一个实际问题并将数据映射到二维图上,来探索监督学习。
欢迎来到机器学习的第一步。在本章中,我们将构建一个简单的监督学习程序。从这个小程序到实现图像识别的目标,还有很长的路要走。事实上,一开始它与计算机视觉完全无关。但接下来的几章中,我们会逐步改进代码,直到它足够强大,能够处理图像任务。
我们程序的第一个版本将基于一种称为线性回归的技术。还记得上一章的内容吗?监督学习的核心是用一个函数来近似数据。在线性回归中,这个函数尽可能简单——就是一条直线。
本章将涉及多个概念,以引入线性回归。过程中我们可能会感到些许信息过载,请放轻松,慢慢理解。即使看起来我们只是在编写一个简短的程序,实际上却是在打下机器学习知识的基础。本章所学的内容不仅对当前章节有用,也将在后续学习中持续发挥作用。现在,让我们从一个实际问题开始。
问题描述
我们的朋友在一座繁忙的大都市里经营着一家温馨的小型披萨店。每天中午,他们都会查看预订座位的数量,并据此决定晚餐时段需要准备多少披萨面团。面团准备太多会造成浪费,太少则会导致披萨售罄。无论哪种情况,餐厅都会蒙受经济损失。
仅凭预订人数来判断所需披萨数量并不容易,因为许多顾客并不会提前订位,或者他们可能选择吃其他食物。店主知道预订数和披萨销量之间存在某种关联——通常预订越多,披萨需求也越大,但除此之外,具体的数量关系并不明确。
这位店主希望有一个程序,可以分析历史数据,掌握预订座位数与披萨销量之间的关系,并利用这一关系,根据当天的预订数量预测当晚的披萨销售量。我们能否为他编写这样一个程序呢?
监督式披萨预测
还记得我们在[监督学习课程]中学到的内容吗?我们可以使用一组带标签的样本训练一个监督学习算法,来解决披萨销量预测的问题。为了获取这些样本,我们请店主记录几天内的预订人数和实际披萨销量,并将这些数据保存在一个文件中。以下是该文件前四行的样子:
| 预订人数 | 披萨数量 |
|---|---|
| 13 | 33 |
| 2 | 16 |
| 14 | 32 |
| 23 | 51 |
该文件共包含30行数据。每一行都是一个样本,由一个输入变量(预订人数)和一个数值型标签(披萨销量)组成。一旦我们有了算法,就可以用这些样本来进行训练。之后在预测阶段,我们只需输入当天的预订人数,算法就会输出对应的披萨销量预测值。
让我们像数据科学家一样,从这些数字入手。
理解数据
浏览一下这些披萨数据,可以看出预订人数和披萨销量之间似乎存在相关性。
NumPy 库提供了一个便捷的函数,用于从文本文件中导入以空白字符分隔的数据:
1import numpy as np 2X, Y = np.loadtxt("pizza.txt", skiprows=1, unpack=True)
第一行导入 NumPy 库,第二行使用其 loadtxt() 函数从 pizza.txt 文件加载数据。我们跳过表头行,并将两列数据“解包”为两个独立数组 和 。其中 包含输入变量的值(预订人数), 包含标签(披萨销量)。我们使用大写字母命名 和 ,这是 Python 中常见的约定,表示这些变量应被视为常量。
让我们检查一下数据是否正确加载。如果想跟着操作,请运行上述代码,然后查看 和 的前几个元素:
➾ [0:5]
[ 13. 2. 14. 23. 13.]
➾ [0:5]
[ 33. 16. 32. 51. 27.]
这些数值与原始文件一致,但仍难以直观理解。我们将其绘制成图表以便更清晰地观察:
现在相关性一目了然:预订人数越多,披萨销量也越高。诚然,统计学家可能会批评我们仅凭少量匆忙收集的数据就得出结论。但毕竟这不是一项严谨的研究项目,因此让我们暂时忽略肩上的那位小统计学家,在下一节课中着手构建披萨销量预测器。
注意:如果你想知道如何绘制这张图,可以尝试以下绘图代码:
1# 绘制预订人数/披萨销量数据集 2import numpy as np 3import matplotlib.pyplot as plt 4import seaborn as sea 5sea.set() 6plt.axis([0, 50, 0, 50]) # 设置坐标轴范围(0 到 50) 7plt.xticks(fontsize=14) # 设置 x 轴刻度字体大小 8plt.yticks(fontsize=14) # 设置 y 轴刻度字体大小 9plt.xlabel("Reservations", fontsize=14) # 设置 x 轴标签 10plt.ylabel("Pizzas", fontsize=14) # 设置 y 轴标签 11X, Y = np.loadtxt("pizza.txt", skiprows=1, unpack=True) # 加载数据 12plt.plot(X, Y, "bo") # 绘制数据点 13plt.show() # 显示图表
Matplotlib 是一个全面的库,用于在 Python 中创建静态、动画和交互式可视化图形。
Seaborn 是一个基于 Matplotlib 的 Python 数据可视化库,提供了高级接口,用于绘制美观且富有信息量的统计图形。