FACET是用于人类可解释AI的开源库

2021-02-28 22:23:17

FACET是一个用于人类可解释的AI的开源库,它将复杂的模型检查和基于模型的仿真相结合,可以更好地解释您的受监督机器学习模型。

FACET引入了一种新的算法来量化ML模型中特征之间的依赖关系和交互作用。该用于人类可解释的AI的新工具为流行的SHAP方法提供的观察级解释增加了新的全局视角。下面的入门示例。

FACET的模型仿真算法使用ML模型进行虚拟实验,以帮助识别可预测结果的场景。为了量化仿真中的不确定性,FACET利用了一系列自举算法,包括固定和分层自举。有关FACET的自举仿真的示例,请参见下面的quickstart示例。

FACET提供了有效而透明的机器学习工作流程,并通过模型选择,检查和仿真的新功能增强了scikit学习和测试的流水范式。熊猫数据框,确保要素的端到端可追溯性。

以下快速入门指南提供了一个最小的示例工作流程,以帮助您入门并使用FACET运行。有关其他教程和API指南,请参阅FACET文档。

为了演示FACET的模型检查功能,我们首先创建了适合学习者的管道。在这个简单的示例中,我们使用包含年龄,性别,BMI和血压以及6个血清测量值的糖尿病数据集作为特征。此数据集的转换版本也可以在scikit-learn上获得。

在本快速入门中,我们将使用10个重复的5倍CV训练随机森林回归,以预测一年后的疾病进展。通过使用sklearndf,我们可以创建与DataFrame兼容的熊猫工作流。但是,FACET提供了其他增强功能,可以使用样本对象(样本)来跟踪我们的特征矩阵和目标向量,并使用LearnerRanker轻松比较超参数配置,甚至可以比较多个学习者。

#标准进口从sklearn以pd进口大熊猫。 model_selection import RepeatedKFold#从sklearndf从sklearndf进行一些有用的导入。从sklearndf导入管道RegressorPipelineDF。回归导入RandomForestRegressorDF#从构面导入相关的FACET。数据导入来自构面的样本。选择导入LearnerRanker,LearnerGrid#加载糖尿病数据集diadia_df = pd。 read_csv(&diabetes_quickstart.csv')#创建FACET样本对象diadia_sample = Sample(观测值=糖尿病_df,target_name =" Disease_progression")#为随机森林回归器rnd_forest_reg创建一个(简单的)管道= RegressorPipelineDF(regressor = RandomForestRegressorDF(random_state = 42))#定义竞争模型的网格。彼此相对rnd_forest_grid = [LearnerGrid(管道= rnd_forest_reg,learner_parameters = {" min_samples_leaf&#34 ;: [8,11,15]}),]#创建重复的k倍CV迭代器rkf_cv = RepeatedKFold(n_splits = 5 ,n_repeats = 10,random_state = 42)#通过性能对候选模型进行排名(默认为平均CV分数-2 * SD)ranker = LearnerRanker(grids = rnd_forest_grid,cv = rkf_cv,n_jobs =-3)。适合(样本=糖尿病样本)#获取摘要报告排名。总结报告()

基于这种最小的工作流程,我们可以看到叶中最小样本的值为11是三个考虑值中表现最好的一种。这种方法很容易扩展到学习者和多个学习者的多个超参数。

FACET为scikit-learn估计器实现了多种模型检查方法.FACET通过提供补充SHAP本地视角的全局指标来增强模型检查。模型中每对功能的关键全局指标是:

模型将一个要素的信息与另一个要素的信息组合在一起以预测目标的程度。例如,假设我们正在使用年龄和性别来预测心血管健康,而拟合模型则包含了两者之间的复杂相互作用。这意味着这两个特征在预测心血管健康方面是协同的。此外,这两个功能对于模型都很重要,并且删除其中任何一个都会显着影响性能。假设年龄比性别给联合会贡献了更多的信息。这种不对称的贡献意味着(年龄,性别)的协同作用小于(性别,年龄)的协同作用。换个角度考虑一下,想象一下预测是您要达到的坐标。从起点开始,年龄比性别离您更接近这一点,但是,两者都需要达到这一点。协同作用反映了这样一个事实:性别从年龄获得更多的帮助(从性别的角度来看协同作用更高)比年龄从性别获得的帮助(从年龄角度来看协同作用较低)达到预测。这导致了一个重要的观点:协同作用是全局信息的自然不对称属性,两个相互作用的特征对模型预测有所贡献。协同作用表示为百分比,范围从0%(完全自治)到100%(完全协同)。

模型中某个特征复制第二个特征的信息以预测目标的程度。例如,假设我们有房子的大小和卧室的数量来预测房价。这些功能捕获相似的信息,因为卧室越多,房屋越大,平均价格可能就越高。 (卧室数量,房屋大小)的冗余度将大于(房屋大小,卧室数)的冗余度。这是因为房子的大小知道反之,更多的卧室数量可以用来预测房价。因此,从卧室数量的角度来看,存在更大的冗余。考虑它的另一种方法是,删除房屋的大小比删除卧室的数目更不利于模型性能,因为房屋大小可以更好地补偿缺少卧室的数目。这也意味着房屋面积将比模型中的卧室数量更为重要。这里的重点是,像协同作用一样,冗余是全局信息特征对预测结果的自然不对称属性。冗余表示为百分比,范围从0%(完全唯一)到100%(完全冗余)。

对于任何要素对(A,B),第一个要素(A)是行,第二个要素(B)是列。例如,在行中查找LTG(拉莫三嗪)与模型中的其他功能的协同作用相对最小(≤14%)。但是,在列中向下查找LTG(即与LTG配对的其他功能的透视图),发现许多功能(行)与LTG有协同作用(12%至34%)。我们可以得出以下结论:

LTG是一种高度自主的功能,与其他功能的协同作用最小,可预测一年后的疾病进展。

LTG的强大贡献部分地使得了其他功能对一年后疾病进展的预测的贡献。

在调查影响时,必须谨慎考虑高协同功能,因为它们协同工作以预测结果。考虑到TC与LTG的34%协同作用以预测一年后的进展,考虑没有LTG的TC(T细胞)并没有多大意义。

对于任何要素对(A,B),第一个要素(A)是行,第二个要素(B)是列。例如,如果我们从LDL(低密度脂蛋白)的角度来看特征对(LDL,TC),那么我们查找LDL的行和TC的列,发现47%的冗余。这意味着LDL中47%的信息会与TC重复,以预测一年后的疾病进展。从TC的角度看,TC(LDL)为50%时,这种冗余度是相似的。

如果我们查看LTG行的列,我们可以看到,除了BMI具有32%的冗余之外,LTG具有模型中包含的其他功能的最小冗余(<9%)。此外,如果我们跨LTG列的行查看,我们可以看到许多功能具有LTG的适度冗余性。

如上文所详述,特征对的冗余和协同作用来自“视角”。对中的一个特征,因此产生两个不同的值。但是,还可以计算对称版本,该对称版本不仅提供简化的透视图,而且允许使用(1-度量)作为特征距离。通过这种距离分层,可以应用单联动聚类来创建树状图可视化。这有助于识别低距离的组,这些特征可以串联激活。预测结果。然后,可以使用此类信息将高度冗余的特征的聚类简化为子集,或者突出显示应该始终一起考虑的高度协同特征的聚类。

根据树状图,我们可以看到特征对(LDL,TC)和(LTG,BMI:体重指数)分别代表树状图中的簇,而LTG和BMI的重要性最高。 TC并探讨了删除LTG或BMI之一的影响,以进一步简化模型并获得简化的独立功能集。

我们使用FACET的ContinuousRangePartitioner将BMI的观测值范围分成相等大小的间隔。每个分区由该分区的中心值表示。

对于每个分区,模拟器会创建原始样本的人工副本,假设要模拟的变量在所有观察值中都具有相同的值-这是代表分区的值。现在,使用从排名者那里获得的最佳学习者交叉适应度,模拟器可以使用针对所有折叠训练的模型来重新预测所有目标,并确定由此得出的目标变量的平均提升量。

FACET SimulationDrawer使我们可以可视化结果;无论是amatplotlib还是纯文本样式。

最后,由于FACET可以使用引导交叉验证,因此我们可以从以前的LearnerRanker最佳模型创建一个交叉拟合来执行仿真,因此可以使用引导置信区间来量化不确定性。

#FACET从构面导入。验证从方面导入BootstrapCV。 crossfit从方面导入LearnerCrossfit。模拟从构面导入UnivariateUpliftSimulator。模拟。分区从构面导入ContinuousRangePartitioner。模拟。 viz import SimulationDrawer#创建引导CV迭代器bscv = BootstrapCV(n_splits = 1000,random_state = 42)#使用最佳模型boot_crossfit = LearnerCrossfit(pipeline = ranker。详细= False,)。适合(样本=糖尿病样本)SIM_FEAT =&#34; BMI&#34;模拟器= UnivariateUpliftSimulator(crossfit = boot_crossfit,n_jobs =-3)#将模拟范围分成相等大小的分区partitioner = ContinuousRangePartitioner()#运行模拟Simulation =模拟器。 Simulate_feature(feature_name = SIM_FEAT,partitioner = partitioner)#可视化结果SimulationDrawer()。绘制(数据=模拟,标题= SIM_FEAT)

从图中我们可以得出结论,较高的BMI值与一年后疾病进展的增加有关,对于29岁及以上的BMI,一年后疾病进展显着增加至少26分。

欢迎和赞赏对FACET的贡献。对于任何错误报告或功能请求/增强,请使用适当的GitHub表单,如果您愿意,请打开一个PR解决此问题。

我们确实要求进行任何重大更改,请先通过问题或使用我们的团队电子邮件:[email protected]与我们讨论这些重大更改。

scikit学习器和流水线构成了基础算法的实现。 此外,我们尝试设计FACET API以与scikit-learn API保持一致。 SHAP实现用于估计Shapley向量,然后FACET将其分解为协同向量,冗余向量和独立向量。 如果您想进一步了解FACET背后的团队,请参阅关于我们页面。 我们一直在寻找充满激情和才华的数据科学家加入BCG GAMMA团队。 如果您想了解更多信息,可以查找有关BCG GAMMA的信息,或查看职业机会。