💡 什么是NannyML?
NannyML是一个开源Python库,允许您估计部署后的模型性能(无需访问目标数据),检测数据漂移,并智能地将数据漂移警报与模型性能变化联系起来。NannyML专为数据科学家设计,具有易用的界面、交互式可视化功能,完全与模型无关,目前支持所有表格用例、分类和回归。
NannyML的核心贡献者研究并开发了多种用于估计模型性能的新算法:基于置信度的性能估计(CBPE)和直接损失估计(DLE)。 Nansters还发明了一种使用基于PCA的数据重构来检测多变量数据漂移的新方法。
如果您喜欢我们正在做的工作,请务必成为一名Nanster,加入我们的社区slack ,并在GitHub上给我们一个星⭐。
☔ 为什么使用NannyML?
NannyML通过性能监控和部署后数据科学完善了闭环,使数据科学家能够快速理解并自动检测静默模型失效。通过使用NannyML,数据科学家终于可以保持对部署的机器学习模型的完全可见性和信任。 使用NannyML可以带来以下好处:
- 结束因不知道模型性能而导致的失眠之夜😴
- 分析随时间变化的数据漂移和模型性能
- 发现模型性能不如预期的根本原因
- **不会产生警报疲劳!**只有在模型性能受到影响时才需要反应
- 在任何环境中轻松设置
🧠 深入了解
NannyML资源 | 描述 |
---|---|
☎️ NannyML 101 | 新手入门NannyML?从这里开始! |
🔮 性能估计 | 魔法是如何运作的。 |
🌍 真实世界示例 | 查看NannyML的真实世界示例。 |
🔑 关键概念 | 我们使用的关键概念词汇表。 |
🔬 技术参考 | 监控您的ML模型性能。 |
🔎 博客 | NannyML团队对部署后数据科学的思考。 |
📬 新闻简报 | 部署后数据科学的所有内容。订阅以查看最新论文和博客。 |
💎 v0.11.0新功能 | 新特性、bug修复。 |
🧑💻 贡献 | 如何为NannyML项目和代码库做出贡献。 |
加入slack | 需要针对您特定用例的帮助?在slack上跟我们打个招呼吧! |
🔱 特性
1. 性能估计和监控
当您部署的预测模型的实际结果延迟,或者甚至完全缺少部署后的目标标签时,您可以使用NannyML的CBPE算法为分类问题估计模型性能,或使用NannyML的DLE算法为回归问题估计性能。这些算法可以为您提供任何您想要的估计指标,例如ROC AUC或RSME。CBPE和DLE并不是估计未来模型预测的性能,而是估计在推理时做出的预测的预期模型性能。
NannyML 还可以在目标可用时跟踪机器学习模型的实际性能。
2. 数据漂移检测
为了检测多变量特征漂移,NannyML 使用基于 PCA 的数据重构。随时间监控重构误差的变化,当某个时期的重构误差超过阈值时,会记录数据漂移警报。这个阈值是根据参考期间观察到的重构误差计算的。
NannyML 利用统计测试来检测单变量特征漂移。我们刚刚添加了一批新的单变量测试,包括 Jensen-Shannon 距离和 L-无穷距离,请查看完整列表。这些测试的结果会随时间追踪,适当校正以抵消多重性,并叠加在时间特征分布上。(也可以可视化测试统计量随时间的变化,以了解漂移的大小。)
NannyML 使用相同的统计测试来检测模型输出漂移。
目标分布漂移也可以使用相同的统计测试进行监控。请记住,这个操作需要实际值的存在。
3. 智能警报
由于 NannyML 可以估计性能,因此可以筛选出不影响预期性能的数据漂移警报,从而避免警报疲劳。除了将数据漂移问题与性能下降联系起来之外,还可以使用 NannyML 的排序器根据其他标准对警报进行优先级排序。
🚀 开始使用
安装 NannyML
NannyML 依赖于 LightGBM。这可能需要你安装额外的特定操作系统二进制文件。你可以按照官方安装指南进行操作。
从 PyPI 安装:
pip install nannyml
从 Conda 安装:
conda install -c conda-forge nannyml
通过 Docker 运行:
docker -v /local/config/dir/:/config/ run nannyml/nannyml nml run
注意风险! 使用最新的 NannyML 开发版本需自担风险:
python -m pip install git+https://github.com/NannyML/nannyml
快速开始
以下代码片段基于我们的最新发布版本。
import nannyml as nml
import pandas as pd
from IPython.display import display
# 加载真实世界数据:
reference_df, analysis_df, _ = nml.load_us_census_ma_employment_data()
display(reference_df.head())
display(analysis_df.head())
# 选择分块器或设置块大小:
chunk_size = 5000
# 初始化,指定所需的数据列,拟合估计器并进行估计:
estimator = nml.CBPE(
problem_type='classification_binary',
y_pred_proba='predicted_probability',
y_pred='prediction',
y_true='employed',
metrics=['roc_auc'],
chunk_size=chunk_size,
)
estimator = estimator.fit(reference_df)
estimated_performance = estimator.estimate(analysis_df)
# 显示结果:
figure = estimated_performance.plot()
figure.show()
# 定义特征列:
features = ['AGEP', 'SCHL', 'MAR', 'RELP', 'DIS', 'ESP', 'CIT', 'MIG', 'MIL', 'ANC',
'NATIVITY', 'DEAR', 'DEYE', 'DREM', 'SEX', 'RAC1P']
# 初始化执行单变量漂移计算的对象:
univariate_calculator = nml.UnivariateDriftCalculator(
column_names=features,
chunk_size=chunk_size
)
univariate_calculator.fit(reference_df)
univariate_drift = univariate_calculator.calculate(analysis_df)
# 使用基于计数的排序器获取漂移最严重的特征:
alert_count_ranker = nml.AlertCountRanker()
alert_count_ranked_features = alert_count_ranker.rank(univariate_drift)
display(alert_count_ranked_features.head())
# 绘制前3个特征的漂移结果:
figure = univariate_drift.filter(column_names=['RELP','AGEP', 'SCHL']).plot()
figure.show()
# 比较选定特征的漂移与估计性能
uni_drift_AGEP_analysis = univariate_drift.filter(column_names=['AGEP'], period='analysis')
figure = estimated_performance.compare(uni_drift_AGEP_analysis).plot()
figure.show()
# 绘制选定特征的分布变化:
figure = univariate_drift.filter(period='analysis', column_names=['RELP','AGEP', 'SCHL']).plot(kind='distribution')
figure.show()
# 获取目标数据,计算、绘制并比较实际性能与估计性能:
_, _, analysis_targets_df = nml.load_us_census_ma_employment_data()
analysis_with_targets_df = pd.concat([analysis_df, analysis_targets_df], axis=1)
display(analysis_with_targets_df.head())
performance_calculator = nml.PerformanceCalculator(
problem_type='classification_binary',
y_pred_proba='predicted_probability',
y_pred='prediction',
y_true='employed',
metrics=['roc_auc'],
chunk_size=chunk_size)
performance_calculator.fit(reference_df)
calculated_performance = performance_calculator.calculate(analysis_with_targets_df)
figure = estimated_performance.filter(period='analysis').compare(calculated_performance).plot()
figure.show()
📖 文档
🦸 贡献和社区
我们希望与社区一起构建 NannyML!目前最简单的贡献方式是在问题下提出新功能或记录错误。有关更多信息,请查看如何贡献。
感谢所有贡献者!
🙋 获取帮助
寻求帮助的最佳场所是在社区Slack。欢迎加入并提出问题或反馈问题。一定会有人回复你。
🥷 保持更新
如果你想及时了解NannyML库的最新变化,可以订阅我们的发布说明。如果你想了解NannyML团队对部署后数据科学的看法,欢迎访问我们的博客。你还可以订阅我们的新闻通讯,它汇集了突出显示部署后ML挑战的最佳论文、文章、新闻和开源库。
📍 路线图
想知道我们接下来要做什么吗?看看我们的路线图。如果你有任何问题,或者希望看到不同的优先事项,请告诉我们!
📝 引用NannyML
在学术论文中引用NannyML时,请使用以下BibTeX条目。
版本0.11.0
@misc{nannyml,
title = {{N}anny{ML} (release 0.11.0)},
howpublished = {\url{https://github.com/NannyML/nannyml}},
month = mar,
year = 2023,
note = {NannyML, Belgium, OHL.},
key = {NannyML}
}
📄 许可证
NannyML根据Apache许可证2.0版分发。完整版本可以在这里找到。所有贡献都将在此许可证下分发。