1.机器学习工作流程介绍
本文学习如何思考机器学习问题。机器学习(ML)不仅关于数学和建模,而且关于选择问题的设置,识别客户需求和长期目标。本文的组织如下:
1.通过识别关键利益相关者,选择正确的度量指标,建立机器学习问题的框架。
2.因为ML是关于数据的,将讨论与数据相关的不同挑战。
3.在解决ML问题时如何组织数据集,以确保创建的模型在新数据上表现良好。
4.如何利用不同的工具来确定模型的局限性。
在本文中,将多次使用德国交通标志识别基准(German Traffic Sign Benchmarks,GTSRB)进行练习。
2.建立问题的框架
除非你是在参加机器学习比赛,否则模型的性能很少是你唯一关心的事情。例如,在自动驾驶汽车系统中,模型的推断时间(提供预测所需的时间)也是一个重要的因素。一个每秒可以消化5个图像的模型比一个每秒只能处理一个图像的模型要好,即使第二个图像的性能更好。在这种情况下,推断时间也是选择我们的模型的一个指标。
理解数据管道(pipeline)非常重要,因为它将推动模型开发。在某些情况下,获取新数据相对容易,但对它们进行标定(例如通过关联类名)可能代价很高。在这种情况下,可能希望创建一个需要较少数据的模型,或者可以处理未标定数据的模型。
3. 确定主要利益相关者
作为一名机器学习工程师,你很少会成为自己产品的最终用户。因此,您需要确定您试图解决的问题的不同涉众。为什么?因为这将推动您的模型开发。
4.选择度量指标
每一个机器学习问题都需要它自己的度量标准,而一些度量标准,如准确性,可能适合于许多问题,需要记住错误预测的后果。考虑以下情况:当构建一个垃圾邮件分类算法,应该以很少的False Positives(假阳性/误报)为目标,因为不希望算法将一些潜在的重要邮件分类到垃圾邮件文件夹。然而,False Negative (假阴性)只是一个位于收件箱中的垃圾邮件,它可以由用户手动删除。
5.分类和目标检测指标
Precision(精确度):在分类为特定类别的元素中,做对了多少个?例如,将6张包含汉堡的图片分类,其中只有5张确实包含汉堡。精度是5/6。
召回率(Recall):正确分类的图像数量除以图像总数。例如,有40张汉堡的图片,正确地分类了其中的15张。召回率(recall)是15/40。对目标检测使用相同的精确度和召回率定义,但考虑的是每个图像中目标的实例数。
Accuracy(准确性):(仅用于分类问题)正确分类的图像数量占图像总数的比例。
6.练习1
结构
在本练习中,需要使用以下文件:
Ground truth data: data/ground_truth.json包含真实数据的标签(边界框和类)。该文件包含20个观察项,每个观察项是一个字典,带有以下字段。
{filename: str, boxes: List[List[int]], classes: List[int]}
边界框使用[x1, y1, x2, y2]格式。
预测数据data/predictions.json包含预测数据的标签(边界框和类)(可以将其视为模型的输出)。格式类似于真实数据。
最后,utils.py文件包含helper函数。其中一个check_results将验证IoU计算,另一个get_data将把真实值和预测数据加载到Python字典中。
第一部分-计算IoU
目标
在本练习的第一部分中,任务是实现一个函数,该函数计算两个边界框之间的iou。
细节
iou.py中的calculate_ious函数接受两个数组,其中包含边界框坐标作为输入。两个数组都是1x4 numpy数组。数组使用以下格式:
[x1, y1, x2, y2]
其中x1 < x2, y1 < y2。(x1, y1)为左上角的坐标,(x2, y2)为边界框右下角的坐标。
例如
iou = calculate_iou(np.array([0, 0, 100, 100]), np.array([101, 101, 200, 200]))
提示
请记住,边界框可能不相交,在这种情况下,IoU应该等于0。
通过运行python iou.py,检查实现情况。
第二部分-计算精确度/召回率
目标
要求对给定的一组预测和真实值计算精确度和召回率。使用0.5 IoU的阈值来确定一个预测是否为真。
细节
precision_recall.py中的precision_recall函数以一个IoU值组成的 ious NxM数组以及两个列表pred_classes和gt_classes作为输入,该列表包含M个预测类ids和N个真实类ids。
IoU数组包含N个真实值边界框和M个预测值边界框之间的成对IoU值,如下:
ious[x, y] = calculate_iou(groundtruth[x], predictions[y])
例如
precision, recall = precision_recall(np.array([[0.5, 0.1],[0.8, 0.1]),
np.array([1, 2]),
np.array([1, 0]))
提示
需要计算False Negatives的数量来计算召回率。可以使用IoU数组来查找未预测的真实值边界框。
通过运行python precision_recall.py,检查程序实现情况。
参考代码
iou.py
import numpy as np
from utils import get_data, check_results
def calculate_iou(gt_bbox, pred_bbox):
"""
calculate iou
args:
- gt_bbox [array]: 1x4 single gt bbox
- pred_bbox [array]: 1x4 single pred bbox
returns:
- iou [float]: iou between