使用 YAML 和 Python 生成负责任 AI 见解
适用范围:Azure CLI ml 扩展 v2(最新版)Python SDK azure-ai-ml v2(最新版)
可使用负责任 AI 组件通过管道作业生成负责任 AI 仪表板和记分卡。 有六个用于创建负责任 AI 仪表板的核心组件以及几个帮助程序组件。 示例试验图如下所示:
负责任 AI 组件
用于在 Azure 机器学习中构建负责任 AI 仪表板的核心组件包括:
RAI Insights dashboard constructor
- 工具组件:
Add Explanation to RAI Insights dashboard
Add Causal to RAI Insights dashboard
Add Counterfactuals to RAI Insights dashboard
Add Error Analysis to RAI Insights dashboard
Gather RAI Insights dashboard
Gather RAI Insights score card
始终需要 RAI Insights dashboard constructor
和 Gather RAI Insights dashboard
组件,以及至少一个工具组件。 但是,不需要在每个负责任 AI 仪表板中使用所有工具。
以下部分是 YAML 和 Python 中负责任 AI 组件和代码片段示例的规范。
重要
本文中标记了“(预览版)”的项目目前为公共预览版。 该预览版在提供时没有附带服务级别协议,建议不要将其用于生产工作负载。 某些功能可能不受支持或者受限。 有关详细信息,请参阅适用于 Azure 预览版的补充使用条款。
限制
当前的组件集在使用上有很多限制:
- 所有模型都必须在 Azure 机器学习中以 MLflow 格式注册,并采用 sklearn (scikit-learn) 风格。
- 模型在组件环境中必须可加载。
- 模型必须可选取。
- 必须使用我们提供的
Fetch Registered Model
组件将模型提供给负责任 AI 组件。 - 数据集输入必须采用
mltable
格式。 - 即使只对数据执行因果分析,也必须提供模型。 你可以使用 scikit-learn 中的
DummyClassifier
和DummyRegressor
估算器来实现此目的。
RAI 见解仪表板构造函数
此组件有三个输入端口:
- 机器学习模型
- 训练数据集
- 测试数据集
若要使用错误分析和模型说明等组件生成模型调试见解,请使用训练模型时使用的训练数据集和测试数据集。 对于不需要模型的因果分析等组件,可使用训练数据集训练因果模型来生成因果见解。 使用测试数据集来填充负责任 AI 仪表板的可视化效果。
提供模型的最简单方法是注册输入模型,并在 RAI Insight Constructor
组件的模型输入端口中引用同一模型,本文稍后将对此进行讨论。
注意
目前仅支持采用 MLFlow 格式且采用 sklearn
风格的模型。
两个数据集应当采用 mltable
格式。 提供的训练数据集和测试数据集不必与用于训练模型的数据集相同(但它们也可以相同)。 默认情况下,出于性能原因,测试数据集限制为可视化 UI 的 5,000 行。
构造函数组件还接受以下参数:
参数名称 | 说明 | 类型 |
---|---|---|
title |
仪表板的简要说明。 | 字符串 |
task_type |
指定模型是分类模型、回归模型还是预测模型。 | 字符串,classification 、regression 或 forecasting |
target_column_name |
输入数据集中列的名称,模型正尝试预测该列的名称。 | 字符串 |
maximum_rows_for_test_dataset |
出于性能方面的原因,测试数据集中允许的最大行数。 | 整数,默认为 5,000 |
categorical_column_names |
数据集中的列,表示分类数据。 | 字符串的可选列表1 |
classes |
训练数据集中类标签的完整列表。 | 字符串的可选列表1 |
feature_metadata |
根据任务类型指定仪表板可能需要的其他信息。 对于预测,这包括指定哪个列是 datetime 列,而哪个列是 time_series_id 列。 对于视觉,这可能包括图像的平均像素值或位置数据。 |
字符串的可选列表1 |
use_model_dependency |
指定由于与 RAI 仪表板的依赖关系冲突,模型是否需要单独的 docker 容器来提供服务。 对于预测,必须启用此功能。 通常,对于其他方案,未启用此功能。 | 布尔 |
1 列表应以单个 JSON 编码字符串的形式提供给 categorical_column_names
、classes
和 feature_metadata
输入。
构造函数组件有一个名为 rai_insights_dashboard
的输出。 这是一个空仪表板,各个工具组件都在其上运行。 所有结果都由末尾的 Gather RAI Insights dashboard
组件进行组合。
create_rai_job:
type: command
component: azureml://registries/azureml/components/microsoft_azureml_rai_tabular_insight_constructor/versions/<get current version>
inputs:
title: From YAML snippet
task_type: regression
type: mlflow_model
path: azureml:<registered_model_name>:<registered model version>
train_dataset: ${{parent.inputs.my_training_data}}
test_dataset: ${{parent.inputs.my_test_data}}
target_column_name: ${{parent.inputs.target_column_name}}
categorical_column_names: '["location", "style", "job title", "OS", "Employer", "IDE", "Programming language"]'
将因果关系添加到 RAI 见解仪表板
此组件对提供的数据集执行因果分析。 它具有一个输入端口,该端口接受 RAI Insights dashboard constructor
的输出。 也接受以下参数:
参数名称 | 说明 | 键入 |
---|---|---|
treatment_features |
数据集中的特征名称列表,可能“可处理”这些特征来获取不同的结果。 | 字符串列表2。 |
heterogeneity_features |
数据集中的特征名称列表,可能会影响“可处理”特征的行为方式。 默认情况下,将考虑所有特征。 | 字符串的可选列表2。 |
nuisance_model |
用于估计更改处理特征的结果的模型。 | 可选的字符串。 必须为 linear 或 AutoML ,默认为 linear 。 |
heterogeneity_model |
用于估计异质性特征对结果的影响的模型。 | 可选的字符串。 必须为 linear 或 forest ,默认为 linear 。 |
alpha |
置信区间的置信度。 | 可选浮点数,默认值为 0.05。 |
upper_bound_on_cat_expansion |
分类特征的最大扩展数。 | 可选整数,默认值为 50。 |
treatment_cost |
处理成本。 如果为 0,则没有任何处理成本。 如果传递列表,每个元素将应用于其中一个 treatment_features 。每个元素可以是一个标量值,表示应用该处理的固定成本,也可以是一个数组,表示每个样本的成本。 如果是离散处理,该特征的数组应该是二维的,第一维代表样本,第二维代表非默认值和默认值之间的成本差异。 |
可选整数或列表2。 |
min_tree_leaf_samples |
策略树中每片叶子的最小样本数。 | 可选整数,默认值为 2。 |
max_tree_depth |
策略树的最大深度。 | 可选整数,默认值为 2。 |
skip_cat_limit_checks |
默认情况下,分类特征需要具有每个类别的多个实例,以便模型能够稳健地拟合。 将此值设置为 True 可跳过这些检查。 |
可选布尔值,默认值为 False 。 |
categories |
用于分类列的类别。 如果为 auto ,会为所有分类列推断类别。 否则,此参数应具有与分类列一样多的条目。每个条目都应为 auto 以推断该列的值或列的值列表。 如果提供了显式值,则第一个值被视为该列的“control”值,而其他值将与之进行比较。 |
可选 auto 或列表2。 |
n_jobs |
要使用的并行度。 | 可选整数,默认值为 1。 |
verbose |
表示是否在计算期间提供详细的输出。 | 可选整数,默认值为 1。 |
random_state |
伪随机数生成器 (PRNG) 的种子。 | 可选整数。 |
2 对于 list
参数:一些参数接受其他类型的列表(字符串、数字,甚至其他列表)。 要将这些字符串传递到组件中,必须先使用 JSON 将其编码为单个字符串。
此组件有一个输出端口,可连接到 Gather RAI Insights Dashboard
组件的 insight_[n]
输入端口之一。
causal_01:
type: command
component: azureml://registries/azureml/components/microsoft_azureml_rai_tabular_causal/versions/<version>
inputs:
rai_insights_dashboard: ${{parent.jobs.create_rai_job.outputs.rai_insights_dashboard}}
treatment_features: `["Number of GitHub repos contributed to", "YOE"]'
向 RAI 见解仪表板添加反事实
此组件为提供的测试数据集生成反事实点。 它具有单个输入端口,该端口接受 RAI 见解仪表板构造函数的输出。 也接受以下参数:
参数名称 | 说明 | 类型 |
---|---|---|
total_CFs |
测试数据集中每行要生成的反事实点数。 | 可选整数,默认值为 10。 |
method |
可使用的 dice-ml 解释器。 |
可选的字符串。 random 、genetic 或 kdtree 。 默认为 random 。 |
desired_class |
标识所需反事实类的索引。 对于二进制分类,应将其设置为 opposite 。 |
可选字符串或整数。 默认值为 0。 |
desired_range |
要解决回归问题,请确定所需的结果范围。 | 两个数字的可选列表3。 |
permitted_range |
将特征名称作为键,将列表中的允许范围作为值的字典。 默认为根据训练数据推断的范围。 | 可选字符串或列表3。 |
features_to_vary |
字符串 all 或特征名称有所不同的列表。 |
可选字符串或列表3。 |
feature_importance |
通过使用 dice-ml 启用特征重要性计算的标志。 |
可选的布尔值。 默认为 True 。 |
3 对于非标量参数:属于列表或字典的参数应作为单个 JSON 编码字符串传递。
此组件有一个输出端口,可连接到 Gather RAI Insights dashboard
组件的 insight_[n]
输入端口之一。
counterfactual_01:
type: command
component: azureml://registries/azureml/components/microsoft_azureml_rai_tabular_counterfactual/versions/<version>
inputs:
rai_insights_dashboard: ${{parent.jobs.create_rai_job.outputs.rai_insights_dashboard}}
total_CFs: 10
desired_range: "[5, 10]"
向 RAI 见解仪表板添加错误分析
此组件为模型生成错误分析。 它具有一个输入端口,该端口接受 RAI Insights Dashboard Constructor
的输出。 也接受以下参数:
参数名称 | 说明 | 类型 |
---|---|---|
max_depth |
错误分析树的最大深度。 | 可选整数。 默认值为 3。 |
num_leaves |
错误树中最大叶数。 | 可选整数。 默认值为 31。 |
min_child_samples |
生成叶所需的最小数据点数。 | 可选整数。 默认为“20”。 |
filter_features |
用于矩阵筛选器的一个或两个特征的列表。 | 可选列表,作为单个 JSON 编码字符串传递。 |
此组件有一个输出端口,可连接到 Gather RAI Insights Dashboard
组件的 insight_[n]
输入端口之一。
error_analysis_01:
type: command
component: azureml://registries/azureml/components/microsoft_azureml_rai_tabular_erroranalysis/versions/<version>
inputs:
rai_insights_dashboard: ${{parent.jobs.create_rai_job.outputs.rai_insights_dashboard}}
filter_features: `["style", "Employer"]'
向 RAI 见解仪表板添加说明
此组件为模板生成解释。 它具有一个输入端口,该端口接受 RAI Insights Dashboard Constructor
的输出。 它接受单个可选注释字符串作为参数。
此组件有一个输出端口,可连接到“收集 RAI 见解”仪表板组件的 insight_[n]
输入端口之一。
explain_01:
type: command
component: azureml://registries/azureml/components/microsoft_azureml_rai_tabular_explanation/versions/<version>
inputs:
comment: My comment
rai_insights_dashboard: ${{parent.jobs.create_rai_job.outputs.rai_insights_dashboard}}
“收集 RAI 见解”仪表板
此组件可将生成的见解汇总到单个负责任 AI 仪表板。 它有五个输入端口:
- 必须连接到 RAI 见解仪表板构造函数组件的
constructor
端口。 - 四个
insight_[n]
端口,可连接到工具组件的输出。 必须至少连接其中一个端口。
有两个输出端口:
dashboard
端口包含已完成的RAIInsights
对象。ux_json
端口包含显示最小仪表板所需的数据。
gather_01:
type: command
component: azureml://registries/azureml/components/microsoft_azureml_rai_tabular_insight_gather/versions/<version>
inputs:
constructor: ${{parent.jobs.create_rai_job.outputs.rai_insights_dashboard}}
insight_1: ${{parent.jobs.causal_01.outputs.causal}}
insight_2: ${{parent.jobs.counterfactual_01.outputs.counterfactual}}
insight_3: ${{parent.jobs.error_analysis_01.outputs.error_analysis}}
insight_4: ${{parent.jobs.explain_01.outputs.explanation}}
如何生成负责任 AI 记分卡(预览版)
在配置阶段,你需要利用关于该问题的领域专业知识,来设置模型性能和公平性指标的所需目标值。
与 YAML 管道中配置的其他负责任 AI 仪表板组件一样,你可以添加组件以在 YAML 管道中生成记分卡:
scorecard_01:
type: command
component: azureml:rai_score_card@latest
inputs:
dashboard: ${{parent.jobs.gather_01.outputs.dashboard}}
pdf_generation_config:
type: uri_file
path: ./pdf_gen.json
mode: download
predefined_cohorts_json:
type: uri_file
path: ./cohorts.json
mode: download
其中,pdf_gen.json 是记分卡生成配置 json 文件,predifined_cohorts_json 是预生成队列定义 json 文件。
下面是队列定义和记分卡生成配置的示例 JSON 文件:
队列定义:
[
{
"name": "High Yoe",
"cohort_filter_list": [
{
"method": "greater",
"arg": [
5
],
"column": "YOE"
}
]
},
{
"name": "Low Yoe",
"cohort_filter_list": [
{
"method": "less",
"arg": [
6.5
],
"column": "YOE"
}
]
}
]
下面是记分卡生成配置文件的回归示例:
{
"Model": {
"ModelName": "GPT-2 Access",
"ModelType": "Regression",
"ModelSummary": "This is a regression model to analyze how likely a programmer is given access to GPT-2"
},
"Metrics": {
"mean_absolute_error": {
"threshold": "<=20"
},
"mean_squared_error": {}
},
"FeatureImportance": {
"top_n": 6
},
"DataExplorer": {
"features": [
"YOE",
"age"
]
},
"Fairness": {
"metric": ["mean_squared_error"],
"sensitive_features": ["YOUR SENSITIVE ATTRIBUTE"],
"fairness_evaluation_kind": "difference OR ratio"
},
"Cohorts": [
"High Yoe",
"Low Yoe"
]
}
下面是记分卡生成配置文件的分类示例:
{
"Model": {
"ModelName": "Housing Price Range Prediction",
"ModelType": "Classification",
"ModelSummary": "This model is a classifier that predicts whether the house will sell for more than the median price."
},
"Metrics" :{
"accuracy_score": {
"threshold": ">=0.85"
},
}
"FeatureImportance": {
"top_n": 6
},
"DataExplorer": {
"features": [
"YearBuilt",
"OverallQual",
"GarageCars"
]
},
"Fairness": {
"metric": ["accuracy_score", "selection_rate"],
"sensitive_features": ["YOUR SENSITIVE ATTRIBUTE"],
"fairness_evaluation_kind": "difference OR ratio"
}
}
负责任 AI 记分卡组件的输入定义
本部分列出并定义了配置负责任 AI 记分卡组件所需的参数。
型号
ModelName | 模型的名称 |
---|---|
ModelType |
['classification', 'regression'] 中的值。 |
ModelSummary |
输入汇总模型用途的文本。 |
注意
对于多类分类,应首先使用“一对多”策略来选择引用类,然后将多类分类模型拆分为所选引用类与其余类的二元分类问题。
指标
性能指标 | 定义 | 模型类型 |
---|---|---|
accuracy_score |
正确分类的数据点的分数。 | 分类 |
precision_score |
分类为 1 的数据中正确分类的数据点的分数。 | 分类 |
recall_score |
真实标签为 1 的数据中正确分类的数据点的分数。 可选名称:真正率、敏感度。 | 分类 |
f1_score |
F1 分数是精准率和召回率的调和平均值。 | 分类 |
error_rate |
在整个实例集中错误分类的实例比例。 | 分类 |
mean_absolute_error |
绝对误差值的平均值。 与 mean_squared_error 相比,离群值更可靠。 |
回归 |
mean_squared_error |
平方误差的平均值。 | 回归 |
median_absolute_error |
平方误差的中值。 | 回归 |
r2_score |
模型解释的标签差异的分数。 | 回归 |
阈值:所选指标的所需阈值。 允许的数学标记是 >、<、>= 和 <=m(后跟一个实数)。 例如,>= 0.75 表示所选指标的目标大于或等于 0.75。
功能重要性
top_n:最多显示 10 个特征数。 允许的最大正整数为 10。
公平性
指标 | 定义 |
---|---|
metric |
评估公平性的主要指标。 |
sensitive_features |
输入数据集中的特征名称列表,指定为公平性报告的敏感特征。 |
fairness_evaluation_kind |
['difference', 'ratio'] 中的值。 |
threshold |
公平性评估的所需目标值。 允许的数学标记是 >、<、>= 和 <=(后跟一个实数)。 例如,metric="accuracy"、fairness_evaluation_kind="difference"。 <= 0.05 表示准确度差异的目标小于等于 0.05。 |
注意
所选 fairness_evaluation_kind
(选择“差异”与“比率”)会影响目标值的规模。 在选择中,请务必选择有意义的目标值。
可以通过以下指标进行选择,并搭配 fairness_evaluation_kind
来配置记分卡的公平性评估组件:
指标 | fairness_evaluation_kind | 定义 | 模型类型 |
---|---|---|---|
accuracy_score |
差异 | 任意两组之间准确度得分的最大差异。 | 分类 |
accuracy_score |
比率 | 任意两组之间准确度得分的最小比率。 | 分类 |
precision_score |
差异 | 任意两组之间精准率得分的最大差异。 | 分类 |
precision_score |
比率 | 任意两组之间精确率得分的最大比率。 | 分类 |
recall_score |
差异 | 任何两组之间召回分数的最大差异。 | 分类 |
recall_score |
比率 | 任意两组之间召回分数的最大比率。 | 分类 |
f1_score |
差异 | 任意两组之间 f1 分数的最大差异。 | 分类 |
f1_score |
比率 | 任意两组之间 f1 得分的最大比率。 | 分类 |
error_rate |
差异 | 任意两组之间错误率的最大差异。 | 分类 |
error_rate |
比率 | 任意两组之间错误率的最大比率。 | 分类 |
Selection_rate |
差异 | 任意两组之间选择率的最大差异。 | 分类 |
Selection_rate |
比率 | 任意两组之间选择率的最大比率。 | 分类 |
mean_absolute_error |
差异 | 任意两组之间平均绝对误差的最大差异。 | 回归 |
mean_absolute_error |
比率 | 任意两组之间平均绝对误差的最大比率。 | 回归 |
mean_squared_error |
差异 | 任意两组之间均方误差的最大差异。 | 回归 |
mean_squared_error |
比率 | 任意两组之间均方误差的最大比率。 | 回归 |
median_absolute_error |
差异 | 任意两组之间中值绝对误差的最大差异。 | 回归 |
median_absolute_error |
比率 | 任意两组之间中值绝对误差的最大比率。 | 回归 |
r2_score |
差异 | 任意两组之间 R2 得分的最大差异。 | 回归 |
r2_Score |
比率 | 任意两组之间 R2 得分的最大比率。 | 回归 |
输入约束
支持哪些模型格式和风格?
该模型必须位于提供 sklearn 风格的 MLflow 目录中。 此外,需要能够在负责任 AI 组件使用的环境中加载该模型。
支持哪些数据格式?
提供的数据集应当是包含表格数据的 mltable
。
后续步骤
- 生成负责任 AI 仪表板后,请查看如何在 Azure 机器学习工作室中访问和使用它。
- 使用导出为 PDF 的负责任 AI 记分卡汇总和共享负责任 AI 见解。
- 详细了解负责任 AI 仪表板背后的概念和技术。
- 详细了解如何负责地收集数据。
- 要使用 YAML 或 Python 生成负责任 AI 仪表板,请查看示例 YAML 和 Python 笔记本。
- 参阅此技术社区博客文章,详细了解如何使用负责任 AI 仪表板和记分卡来调试数据和模型,并为更好的决策提供信息。
- 参阅真实客户案例,了解英国国家医疗服务体系 (NHS) 如何使用负责任 AI 仪表板和记分卡。
- 通过此交互式 AI 实验室 Web 演示探索负责任 AI 仪表板的功能。