ADTK 评估指标(metrics)方法汇总
一、模块metrics
介绍
模块metrics
包含四种类型的评分函数,用于根据真实异常测量检测结果的质量。所有的评分函数都支持两种模式:
- 如果输入是二进制标签的形式,每个正时间点都被认为是一个独立的异常事件。这等效于时间无关二元分类的评分函数的定义。
- 如果输入是事件列表的形式,则每个异常时间段都被视为一个事件。评分函数的计算将基于检测到的列表和真实列表中出现的段长度。
二、recall
,又名灵敏度、命中率或真阳性率 (TPR),是成功检测到的真异常的百分比。
输入类型:
- 当输入为异常标签时,度量计算将每个带有正标签的时间点视为一个独立事件。被检测为异常的异常时间点被认为是成功检测。
- 当输入是异常时间窗口列表时,度量计算将每个异常时间窗口视为一个独立事件。如果检测到的列表覆盖的此时间窗口的百分比大于或等于thresh ,则认为已成功检测到真实事件。请注意,如果列表中存在重叠的时间窗口,则将首先合并输入时间窗口。
在以下示例中,有 13 个数据点是已知异常。检测结果中,13个中有9个检测成功。因此,召回分数等于 9/13。
在以下示例中,有 6 个异常事件(包括 3 个瞬时事件)。默认情况下,如果检测结果中包含不少于 50% 的段,则认为事件检测成功。在本例中,根据此设置检测前 4 个事件,未检测到后 2 个事件。因此,召回分数等于 4/6。
如果我们限制成功检测的标准,使得一个事件必须覆盖超过 90% 的时间段才能被视为成功检测,那么第三个事件就不是成功检测,因为只有一半的时间段被检测到,因此召回分数等于 3/6。
方法调用
adtk.metrics.recall(y_true, y_pred, thresh=0.5)
参数介绍
y_true(pandas Series or DataFrame, list, or dict) -- 真正异常的标签或列表。
y_pred(pandas Series or DataFrame, list, or dict) -- 预测异常的标签或列表。
thresh(float, optional) -- 命中的阈值。仅在输入为列表或字典时使用。默认值:0.5。
y_true和y_pred的输入格式:
(1) 如果是 pandas Series,则将其视为沿时间索引的二进制标签。
(2) 如果是 pandas DataFrame,每一列都是一个二进制序列,被视为一个独立的异常类型。
(3) 如果是列表,则为事件列表,如果事件是瞬时的,则为 pandas Timestamp;
如果是封闭时间间隔,则为 pandas Timestamp 的 2 元组。
(4) 如果是dict,则每个键值对都是一个事件列表,并被视为一种独立的异常类型。
三、precision
类似于recall
,不同之处在于它计算预测异常为真实异常的百分比。在某些情况下,它也称为阳性预测值 (PPV)。如果检测器过于宽容,recall
分数会很高,而分数会precision
很低。如果检测器太严格,recall
分数会很低,而分数会precision
很高。
输入类型:
- 当输入为异常标签时,度量计算将每个带有正标签的时间点视为一个独立事件。被检测为异常的异常时间点被认为是成功检测。
- 当输入是异常时间窗口列表时,度量计算将每个异常时间窗口视为一个独立事件。如果检测到的列表覆盖的此时间窗口的百分比大于或等于thresh ,则认为已成功检测到真实事件。请注意,如果列表中存在重叠的时间窗口,则将首先合并输入时间窗口。
方法调用
adtk.metrics.precision(y_true, y_pred, thresh=0.5)
参数介绍
y_true(pandas Series or DataFrame, list, or dict) -- 真正异常的标签或列表。
y_pred(pandas Series or DataFrame, list, or dict) -- 预测异常的标签或列表。
thresh(float, optional) -- 命中的阈值。仅在输入为列表或字典时使用。默认值:0.5。
y_true和y_pred的输入格式:
(1) 如果是 pandas Series,则将其视为沿时间索引的二进制标签。
(2) 如果是 pandas DataFrame,每一列都是一个二进制序列,被视为一个独立的异常类型。
(3) 如果是列表,则为事件列表,如果事件是瞬时的,则为 pandas Timestamp;
如果是封闭时间间隔,则为 pandas Timestamp 的 2 元组。
(4) 如果是dict,则每个键值对都是一个事件列表,并被视为一种独立的异常类型。
四、f1_score
是precision
和recall
的调和平均值。
输入类型:
- 当输入为异常标签时,度量计算将每个带有正标签的时间点视为一个独立事件。被检测为异常的异常时间点被认为是成功检测。
- 当输入是异常时间窗口列表时,度量计算将每个异常时间窗口视为一个独立事件。如果检测到的列表覆盖的此时间窗口的百分比大于或等于thresh ,则认为已成功检测到真实事件。请注意,如果列表中存在重叠的时间窗口,则将首先合并输入时间窗口。
方法调用
adtk.metrics.f1_score(y_true, y_pred, recall_thresh=0.5, precision_thresh=0.5)
参数介绍
y_true(pandas Series or DataFrame, list, or dict) -- 真正异常的标签或列表。
y_pred(pandas Series or DataFrame, list, or dict) -- 预测异常的标签或列表。
recall_thresh(float, optional) -- 召回计算的阈值。仅在输入为列表或字典时使用。默认值:0.5。
precision_thresh(float, optional) -- 精度计算的阈值。仅在输入为列表或字典时使用。默认值:0.5。
y_true和y_pred的输入格式:
(1) 如果是 pandas Series,则将其视为沿时间索引的二进制标签。
(2) 如果是 pandas DataFrame,每一列都是一个二进制序列,被视为一个独立的异常类型。
(3) 如果是列表,则为事件列表,如果事件是瞬时的,则为 pandas Timestamp;
如果是封闭时间间隔,则为 pandas Timestamp 的 2 元组。
(4) 如果是dict,则每个键值对都是一个事件列表,并被视为一种独立的异常类型。
五、Intersect over union (IoU) 得分iou
计算了两个列表中都被识别为异常的时间段与两个列表中至少一个列表中识别为异常的时间段之间的长度比。
输入类型:
- 当输入为异常标签时,度量计算计算异常时间点的数量。
- 当输入是异常时间窗口列表时,度量计算测量时间段的长度。
在前面的示例中,真正异常段与检测到的段之间的并集为 13 天,而相交为 3 天。因此 IoU 得分为 3/13。
方法调用
adtk.metrics.f1_score(y_true, y_pred, recall_thresh=0.5, precision_thresh=0.5)
参数介绍
y_true(pandas Series or DataFrame, list, or dict) -- 真正异常的标签或列表。
y_pred(pandas Series or DataFrame, list, or dict) -- 预测异常的标签或列表。
y_true和y_pred的输入格式:
(1) 如果是 pandas Series,则将其视为沿时间索引的二进制标签。
(2) 如果是 pandas DataFrame,每一列都是一个二进制序列,被视为一个独立的异常类型。
(3) 如果是列表,则为事件列表,如果事件是瞬时的,则为 pandas Timestamp;
如果是封闭时间间隔,则为 pandas Timestamp 的 2 元组。
(4) 如果是dict,则每个键值对都是一个事件列表,并被视为一种独立的异常类型。