Alibi Detect 是一个专注于异常值、对抗性样本和数据漂移检测的Python库。该包旨在涵盖表格数据、文本、图像和时间序列的在线和离线检测器。对于数据漂移检测,同时支持 TensorFlow 和 PyTorch 后端。
关于在生产环境中监控异常值和分布的重要性的更多背景信息,请查看来自 ICML 2020 生产中机器学习系统的部署和监控挑战 研讨会的这个演讲,该演讲基于论文生产中模型的监控和可解释性,并引用了Alibi Detect。
如需全面了解数据漂移检测,请查看保护您的机器学习免受数据漂移影响:简介。该演讲涵盖了什么是数据漂移、为什么要检测它、不同类型的数据漂移、如何以原则性的方式检测它,并描述了数据漂移检测器的结构。
目录
安装和使用
包 alibi-detect
可以通过以下方式安装:
- PyPI 或 GitHub 源代码(使用
pip
) - Anaconda(使用
conda
/mamba
)
使用pip
-
alibi-detect 可以从 PyPI 安装:
pip install alibi-detect
-
或者,可以安装开发版本:
pip install git+https://github.com/SeldonIO/alibi-detect.git
-
要安装 TensorFlow 后端:
pip install alibi-detect[tensorflow]
-
要安装 PyTorch 后端:
pip install alibi-detect[torch]
-
要安装 KeOps 后端:
pip install alibi-detect[keops]
-
要使用
Prophet
时间序列异常值检测器:pip install alibi-detect[prophet]
使用conda
要从 conda-forge 安装,建议使用 mamba, 可以通过以下命令将其安装到 base conda 环境中:
conda install mamba -n base -c conda-forge
要安装 alibi-detect:
mamba install -c conda-forge alibi-detect
使用方法
我们将使用 VAE 异常值检测器 来说明 API。
from alibi_detect.od import OutlierVAE
from alibi_detect.saving import save_detector, load_detector
# 初始化并拟合检测器
od = OutlierVAE(threshold=0.1, encoder_net=encoder_net, decoder_net=decoder_net, latent_dim=1024)
od.fit(x_train)
# 进行预测
preds = od.predict(x_test)
# 保存和加载检测器
filepath = './my_detector/'
save_detector(od, filepath)
od = load_detector(filepath)
预测结果以字典形式返回,键为meta
和data
。meta
包含检测器的元数据,而data
本身是一个字典,包含实际预测结果。它包含异常值、对抗性或漂移分数和阈值,以及实例是否为异常值等预测结果。具体细节可能因方法而略有不同,因此我们建议读者熟悉支持的算法类型。
支持的算法
下表展示了每种算法的建议使用场景。"特征级别"列表示是否可以在特征级别进行检测,例如对图像进行逐像素检测。查看算法参考列表以获取更多信息,包括每个检测器的文档链接、原始论文以及示例。
异常检测
检测器 | 表格数据 | 图像 | 时间序列 | 文本 | 类别特征 | 在线 | 特征级别 |
---|---|---|---|---|---|---|---|
隔离森林 | ✔ | ✔ | |||||
马哈拉诺比斯距离 | ✔ | ✔ | ✔ | ||||
自编码器 | ✔ | ✔ | ✔ | ||||
变分自编码器 | ✔ | ✔ | ✔ | ||||
AEGMM | ✔ | ✔ | |||||
VAEGMM | ✔ | ✔ | |||||
似然比 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
Prophet | ✔ | ||||||
光谱残差 | ✔ | ✔ | ✔ | ||||
序列到序列 | ✔ | ✔ |
对抗性检测
检测器 | 表格数据 | 图像 | 时间序列 | 文本 | 类别特征 | 在线 | 特征级别 |
---|---|---|---|---|---|---|---|
对抗性自编码器 | ✔ | ✔ | |||||
模型蒸馏 | ✔ | ✔ | ✔ | ✔ | ✔ |
漂移检测
检测器 | 表格数据 | 图像 | 时间序列 | 文本 | 类别特征 | 在线 | 特征级别 |
---|---|---|---|---|---|---|---|
Kolmogorov-Smirnov检验 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
Cramér-von Mises检验 | ✔ | ✔ | ✔ | ✔ | |||
Fisher精确检验 | ✔ | ✔ | ✔ | ✔ | |||
最大平均差异(MMD) | ✔ | ✔ | ✔ | ✔ | ✔ | ||
学习核MMD | ✔ | ✔ | ✔ | ✔ | |||
上下文感知MMD | ✔ | ✔ | ✔ | ✔ | ✔ | ||
最小二乘密度差 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
卡方检验 | ✔ | ✔ | ✔ | ||||
混合类型表格数据 | ✔ | ✔ | ✔ | ||||
分类器 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
发现差异 | ✔ | ✔ | ✔ | ✔ | ✔ | ✔ | |
分类器不确定性 | ✔ | ✔ | ✔ | ✔ | ✔ | ||
回归器不确定性 | ✔ | ✔ | ✔ | ✔ | ✔ |
TensorFlow和PyTorch支持
漂移检测器支持TensorFlow、PyTorch和(在适用的情况下)KeOps后端。 但是,Alibi Detect默认不安装这些库。有关更多详细信息,请参阅安装选项。
from alibi_detect.cd import MMDDrift
cd = MMDDrift(x_ref, backend='tensorflow', p_val=.05)
preds = cd.predict(x)
同样的检测器在PyTorch中:
cd = MMDDrift(x_ref, backend='pytorch', p_val=.05)
preds = cd.predict(x)
或在KeOps中:
cd = MMDDrift(x_ref, backend='keops', p_val=.05)
preds = cd.predict(x)
内置预处理步骤
Alibi Detect还提供了各种预处理步骤,如随机初始化的编码器、使用transformers库的预训练文本嵌入来检测漂移,以及从机器学习模型中提取隐藏层。这允许检测不同类型的漂移,如协变量和预测分布漂移。预处理步骤同样支持TensorFlow和PyTorch。
from alibi_detect.cd.tensorflow import HiddenOutput, preprocess_drift
model = # TensorFlow模型;tf.keras.Model或tf.keras.Sequential
preprocess_fn = partial(preprocess_drift, model=HiddenOutput(model, layer=-1), batch_size=128)
cd = MMDDrift(x_ref, backend='tensorflow', p_val=.05, preprocess_fn=preprocess_fn)
preds = cd.predict(x)
查看示例笔记本(如CIFAR10、电影评论)以获取更多详细信息。
参考列表
异常检测
-
- 示例:网络入侵
-
- 示例:网络入侵
-
- 示例:CIFAR10
-
自编码高斯混合模型 (AEGMM) (Zong et al., 2018)
- 示例:网络入侵
-
- 示例:网络入侵
-
Prophet 时间序列异常检测器 (Taylor et al., 2018)
- 示例:天气预报
-
谱残差时间序列异常检测器 (Ren et al., 2019)
- 示例:合成数据集
-
序列到序列 (Seq2Seq) 异常检测器 (Sutskever et al., 2014; Park et al., 2017)
对抗性检测
漂移检测
-
- 示例:企鹅
-
- 示例:企鹅
-
- 示例:CIFAR10
-
- 示例:收入预测
-
- 示例:收入预测
-
发现差异 (改编自Jitkrittum等人,2016)
- 示例:MNIST和葡萄酒质量
-
- 示例:CIFAR10和葡萄酒、分子图
-
- 示例:葡萄酒质量
数据集
该软件包还在alibi_detect.datasets
中提供了功能,可以轻松获取各种模态的多个数据集。对于每个数据集,返回的是数据和标签,或者包含数据、标签和可选元数据的Bunch对象。示例:
from alibi_detect.datasets import fetch_ecg
(X_train, y_train), (X_test, y_test) = fetch_ecg(return_X_y=True)
序列数据和时间序列
-
基因组数据集:
fetch_genome
- 用于分布外检测的细菌基因组数据集,作为分布外检测的似然比的一部分发布。原文摘要:该数据集包含10个分布内细菌类别的250个碱基对的基因组序列用于训练,60个分布外细菌类别用于验证,以及另外60个不同的分布外细菌类别用于测试。训练、验证和测试集分别包含1百万、7百万和7百万个序列。有关数据集的详细信息,请查看README。
from alibi_detect.datasets import fetch_genome (X_train, y_train), (X_val, y_val), (X_test, y_test) = fetch_genome(return_X_y=True)
-
ECG 5000:
fetch_ecg
- 5000个心电图,原始数据来自Physionet。
-
NAB:
fetch_nab
- Numenta异常基准中的任何单变量时间序列,以DataFrame形式返回。可以使用
alibi_detect.datasets.get_list_nab()
获取可用时间序列的列表。
- Numenta异常基准中的任何单变量时间序列,以DataFrame形式返回。可以使用
图像
-
CIFAR-10-C:
fetch_cifar10c
- CIFAR-10-C(Hendrycks & Dietterich, 2019)包含CIFAR-10的测试集,但经过各种类型的噪声、模糊、亮度等不同程度的破坏和扰动,导致在CIFAR-10上训练的分类模型性能逐渐下降。
fetch_cifar10c
允许您选择任何严重程度或破坏类型。可以通过alibi_detect.datasets.corruption_types_cifar10c()
获取可用破坏类型列表。该数据集可用于鲁棒性和漂移研究。原始数据可在这里找到。示例:
from alibi_detect.datasets import fetch_cifar10c corruption = ['gaussian_noise', 'motion_blur', 'brightness', 'pixelate'] X, y = fetch_cifar10c(corruption=corruption, severity=5, return_X_y=True)
- CIFAR-10-C(Hendrycks & Dietterich, 2019)包含CIFAR-10的测试集,但经过各种类型的噪声、模糊、亮度等不同程度的破坏和扰动,导致在CIFAR-10上训练的分类模型性能逐渐下降。
-
对抗性CIFAR-10:
fetch_attack
- 加载对在CIFAR-10上训练的ResNet-56分类器的对抗性实例。可用攻击:Carlini-Wagner('cw')和SLIDE('slide')。示例:
from alibi_detect.datasets import fetch_attack (X_train, y_train), (X_test, y_test) = fetch_attack('cifar10', 'resnet56', 'cw', return_X_y=True)
表格数据
- KDD Cup '99:
fetch_kdd
- 包含不同类型计算机网络入侵的数据集。
fetch_kdd
允许您选择一部分网络入侵作为目标或仅选择指定特征。原始数据可在这里找到。
- 包含不同类型计算机网络入侵的数据集。
模型
在异常值、对抗性或漂移检测之外可能有用的模型和/或构建块可以在alibi_detect.models
下找到。主要实现:
-
PixelCNN++:
alibi_detect.models.pixelcnn.PixelCNN
-
变分自编码器:
alibi_detect.models.autoencoder.VAE
-
序列到序列模型:
alibi_detect.models.autoencoder.Seq2Seq
-
ResNet:
alibi_detect.models.resnet
- 在CIFAR-10上预训练的ResNet-20/32/44模型可以在我们的Google Cloud Bucket上找到,可以如下获取:
from alibi_detect.utils.fetching import fetch_tf_model model = fetch_tf_model('cifar10', 'resnet32')
集成
Alibi-detect已集成到机器学习模型部署平台Seldon Core和模型服务框架KFServing中。
引用
如果您在研究中使用alibi-detect,请考虑引用它。
BibTeX条目:
@software{alibi-detect,
title = {Alibi Detect: Algorithms for outlier, adversarial and drift detection},
author = {Van Looveren, Arnaud and Klaise, Janis and Vacanti, Giovanni and Cobb, Oliver and Scillitoe, Ashley and Samoilescu, Robert and Athorne, Alex},
url = {https://github.com/SeldonIO/alibi-detect},
version = {0.12.1.dev0},
date = {2024-04-17},
year = {2019}
}