【.com速译】我们生活在一个日益分裂的世界。在世界某些地区,种族和性别差异和不平等正在加剧。用于建模的数据通常表示数据源。世界可能存在偏见,因此数据和模型可以反映这一点。我们提出了一种方法,机器学习工程师可以通过该方法轻松检查模型是否存在偏差。目前,我们的公平性工具仅适用于分类模型。案例研究为了演示dalex公平模块(https://dalex.drwhy.ai/)的功能,我们将使用著名的德国信用数据集(https://archive.ics.uci.edu/ml/datasets/statlog+(german+credit+data)为每个信用申请人分配一个风险。这个简单的任务可能需要使用可解释的决策树分类器。#importsimportdalexasdximportnumpyasnpfromsklearn.composeimportColumnTransformerfromsklearn.pipelineimportPipelinefromsklearn.preprocessingimportOneHotEncoderfromsklearn.treeimportDecisionTreeClassifier#creditdata=dx.datasets.load_german()#riskisthetargetX=data.drop(columns='risk')y=data.jobcategorical'housing_features','[','saving_accounts',"checking_account",'purpose']categorical_transformer=Pipeline(steps=[('onehot',OneHotEncoder(handle_unknown='ignore'))])preprocessor=ColumnTransformer(transformers=[('cat',categorical_transformer,categorical_features)])clf=Pipeline(steps=[('preprocessor',preprocessor),('classifier',DecisionTreeClassifier(max_depth=7,random_state=123))])clf.fit(X,y)exp=dx。Explainer(clf,X,y)一旦我们有了dx.Explainer,我们需要实现方法model_fairness()以便它可以使用受保护的向量计算子组中的所有必要指标,该向量是指示敏感属性的数组或列表例如每个观察对象(个体)的性别、种族或国籍。除此之外,我们需要指出哪个子组(即protected的哪个唯一元素)具有最高特权,这可以通过特权参数来完成,在这种情况下它将是年长的男性。#arraywithvalueslikemale_old,female_young,etc.protected=data.sex+'_'+np.where(data.age<25,'young','old')privileged='male_old'fobject=exp.model_fairness(protected=protected,privileged=privileged)这个对象有很多属性,我们将重点关注一种方法和两个图,而不是逐一逐一分析。那么,我们的模型有偏见吗?问题很简单,但由于偏见的性质,答案将视情况而定。但这种方法从不同的角度衡量偏见,从而确保没有偏见的模型会从裂缝中溜走。要检查公平性,请使用fairness_check()方法。fobject.fairness_check(epsilon=0.8)#defaultepsilon以下是上述代码的控制台输出。Biasdetectedin1metric:FPRConclusion:yourmodelcannotbecalledfairbecause1metricscoreexceededacceptablelimitssetbyepsilon.Itdoesnotmeanthatyourmodelisunfairbutitcannotbeautomaticallyapprovedbasedonthesemetrics.Ratiosofmetrics,basedon'male_old'.Parameter'epsilon'wassetto0.8andthereforemetricsshouldbewithin(0.8,1.25)TPRACCPPVFPRSTPfemale_old1.0065081.0275591.0000000.7650510.927739female_young0.9718000.9370080.8795940.7753300.860140male_young1.0303690.9291340.8757920.9985320.986014FPR(误报率)该措施检测偏差。上面的输出表明模型不能被自动批准(如上面的输出中所述),因此由用户决定。我不认为这是一个公平的模式。较低的FPR意味着特权子组比非特权子组更容易出现误报。通过详细说明fairness_check(),我们获得了有关原始DataFrame的偏差、结论和指标比率的信息。有几个指标:TPR(阳性率)、ACC(准确性)、PPV(阳性预测值)、FPR(假阳性率)和STP(统计奇偶校验)。这些指标来自每个非特权子组的混淆矩阵(https://en.wikipedia.org/wiki/Confusion_matrix),然后除以基于特权子组的指标。有三种可能的结论:#notfairConclusion:yourmodelisnotfairbecause2ormoremetricscoresexceededacceptablelimitssetbyepsilon.#neitherfairornotConclusion:yourmodelcannotbecalledfairbecause1metricscoreexceededacceptablelimitssetbyepsilon.Itdoesnotmeanthatyourmodelisunfairbutitcannotbeautomaticallyapprovedbasedonthesemetrics.#fairConclusion:yourmodelisfairintermsofcheckedfairnessmetrics.DA真正公平模型不会超出任何度量,但是当真实值(目标)依赖敏感属性时,事情会变得复杂,andisbeyondthescopeofthispaper.总之,有些指标会有所不同,但不一定超出用户的阈值。如果你想了解更多,我建议你阅读《公平性和机器学习》这本书(https://fairmlbook.org/),尤其是第二章。但有人可能会问:为什么我们的模型不公平?我们做决定的依据是什么?回答这个问题很棘手,但判断公平性的方法似乎是迄今为止最好的方法。每个子组的分数通常应该接近特权子组的分数。从数学的角度来看,特权指标和非特权指标的得分之比应该接近于1。值越接近1,模型就越公平。但是稍微放宽标准,更合理的说法是当ε是0到1之间的值时,它应该是比率的最小可接受值。默认情况下,它是0.8,遵循招聘中常见的五分之四规则(80%规则)。很难在一项措施的公平性和歧视性差异之间找到一个非任意的界限;检查一个度量的比率是否恰好为1是没有意义的,因为如果比率为0.99会发生什么?这就是我们决定选择0.8作为默认值ε的原因,因为它是可接受歧视程度的有形阈值的唯一已知值。当然,用户可以根据需要更改这个值。也可以使用两个可用的偏差检测图来绘制偏差(尽管有更多方法可以可视化偏差)。fairness_check-可视化fairness_check()方法metric_scores-可视化metric_scores属性,它是指标的原始分数。类型只需要传递给plot方法的类型参数。上面的fbject.plot()显示了类似于公平性检查输出的内容。指标名称已更改为更标准的公平等效项,但公式指示我们正在引用哪个指标。上图很直观:如果条形到达红色区域,则表示指标超出基于ε的范围。bin长度等于|1-M|,其中M是非特权度分数除以特权度量分数(因此就像之前的公平性检查一样)。fobject.plot(type='metric_scores')由公平性检查补充的指标分数图很好地表明了指标及其比率。在这里,分数是原始指标分数。垂直线表示权限度量分数。离那条线越近越好。多个模型可以放在一个图中,以便于相互比较。不添加几个模型,直接显示metric_scores:fromsklearn.ensembleimportRandomForestClassifierfromsklearn.linear_modelimportLogisticRegressionfromsklearn.preprocessingimportStandardScaler#createmodelsnumeric_features=['credit_amount','duration','age']numeric_transformer=Pipe(step()]numeric_transformer=Pipe())categorical_transformer=Pipeline(steps=[('onehot',OneHotEncoder(handle_unknown='ignore'))])preprocessor=ColumnTransformer(transformers=[('cat',categorical_transformer,categorical_features),('num',numeric_transformer,numeric_features)])clf_forest=Pipeline(steps=[('preprocessor',preprocessor),('classifier',RandomForestClassifier(random_state=123,max_depth=4))]).fit(X,y)clf_logreg=Pipeline(steps=[('预处理器',预处理器),('分类器',LogisticRegression(random_state=123))]).fit(X,y)#createExplainerobjectsexp_forest=dx.Explainer(clf_forest,X,y,verbose=False)exp_logreg=dx.Explainer(clf_logreg,X,y,verbose=False)#createfairnessexplanationsfobject_forest=exp_forest.model_fairness(protected,privileged)fobject_logreg=exp_logreg.model_fairness(protected,privileged)#lettseetheirmetricscoresfobject.plot(objects=[fobject_forest,fobject_logreg],type="metric_scores")上面代码的输出现在让我们检查一下基于fairness_check的图:我们可以看到RandomForestClassifier在绿色区域,所以就这些指标而言是公平的。另一方面,LogisticRegression在三个指标方面达到了红色区域,因此不能称为公平。每个图都是交互式的,并且是使用python可视化包plotly绘制的。结语Dalex中的公平性模块是确保模型公平性的统一且可访问的方式。还有其他方法可以可视化模型偏差,一定要检查一下!将来会添加减轻偏差的方法。长期的计划是在回归中加入对个体公平和公平的支持。请务必检查一下。你可以通过以下命令安装dalex:pipinstalldalex–U原标题:如何轻松检查你的机器学习模型是否公平?,作者:JakubWi?niewski】
