fairnessMetrics
説明
fairnessMetrics は、データ セットまたはバイナリ分類モデルのセンシティブ属性についての公平性メトリクス (バイアス メトリクスとグループ メトリクス) を計算します。データレベルの評価では、データの真のバイナリ ラベルを調べます。モデルレベルの評価では、1 つ以上のバイナリ分類モデルによって返される予測ラベルを真のラベルと予測ラベルの両方を使用して調べます。
バイアス メトリクスでグループ間の差異が測定され、グループ メトリクスでグループ内に情報が格納されます。これらのメトリクスを使用して、データまたはモデルについて、各センシティブ属性のグループに対するバイアスがないかどうかを判別できます。
fairnessMetrics オブジェクトを作成した後、関数 report を使用して公平性メトリクス レポートを生成したり、関数 plot を使用してメトリクスの棒グラフを作成したりできます。
作成
構文
説明
は、ベクトル metricsResults = fairnessMetrics(SensitiveAttributes,Y)Y の真のバイナリ クラス ラベルについて、行列 SensitiveAttributes のセンシティブ属性についての公平性メトリクスを計算します。fairnessMetrics 関数は fairnessMetrics オブジェクト metricsResults を返します。このオブジェクトの BiasMetrics プロパティと GroupMetrics プロパティにバイアス メトリクスとグループ メトリクスがそれぞれ格納されます。
は、table metricsResults = fairnessMetrics(Tbl,ResponseName)Tbl のセンシティブ属性と応答変数を使用して公平性メトリクスを計算します。入力引数 ResponseName で、クラス ラベルが格納されている Tbl 内の変数の名前を指定します。
は、metricsResults = fairnessMetrics(___,SensitiveAttributeNames=sensitiveAttributeNames)Tbl 内の変数のサブセット (名前が sensitiveAttributeNames に対応) をセンシティブ属性として指定するか、sensitiveAttributeNames 内のセンシティブ属性に名前を割り当てます。この引数は、前の構文におけるいずれかの入力引数の組み合わせに加えて指定できます。
は、引数 metricsResults = fairnessMetrics(___,Predictions=predictions)predictions を使用して各モデルの予測ラベルを指定した場合に、1 つ以上のバイナリ分類モデルの公平性メトリクスを計算します。fairnessMetrics は、モデルレベルの評価に真のラベルと予測ラベルの両方を使用します。
は、1 つ以上の名前と値の引数を使用して追加オプションを指定します。たとえば、基準年齢グループ metricsResults = fairnessMetrics(___,Name=Value)30 に対する変数 age の各グループのバイアス メトリクスを計算するには、SensitiveAttributeNames="age",ReferenceGroup=30 と指定します。
入力引数
センシティブ属性。ベクトルまたは行列として指定します。SensitiveAttributes を行列として指定する場合、SensitiveAttributes の各行は 1 つの観測値に対応し、各列は 1 つのセンシティブ属性に対応します。
引数 sensitiveAttributeNames を使用して SensitiveAttributes 内の変数に名前を割り当てることができます。
データ型: single | double | logical | char | string | cell | categorical
真のバイナリ クラス ラベル。categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列として指定します。
fairnessMetricsはバイナリ分類のみをサポートします。Yには厳密に 2 つの異なるクラスが含まれていなければなりません。名前と値の引数
PositiveClassを使用して、2 つのクラスのいずれかを陽性クラスとして指定できます。Yの長さはSensitiveAttributesまたはTblの観測値の数と等しくなければなりません。Yが文字配列の場合、各ラベルは配列の 1 つの行に対応しなければなりません。
データ型: single | double | logical | char | string | cell | categorical
標本データ。table として指定します。Tbl の各行は 1 つの観測値に対応し、各列は 1 つのセンシティブ属性に対応します。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
必要に応じて、Tbl に真のクラス ラベル、予測クラス ラベル、および観測値の重みの各列を含めることができます。
真のクラス ラベルの変数は
ResponseName、予測クラス ラベルの変数はPredictions、観測値の重みの変数はWeightsを使用して指定する必要があります。fairnessMetricsは残りの変数をセンシティブ属性として使用します。Tbl内の残りの変数のサブセットをセンシティブ属性として使用するには、sensitiveAttributeNamesを使用して変数を指定します。真のクラス ラベルの変数は、categorical 配列、文字配列、string 配列、logical ベクトル、数値ベクトル、または文字ベクトルの cell 配列でなければなりません。
fairnessMetricsはバイナリ分類のみをサポートします。真のクラス ラベルの変数には厳密に 2 つの異なるクラスが含まれていなければなりません。名前と値の引数
PositiveClassを使用して、2 つのクラスのいずれかを陽性クラスとして指定できます。
重みの列は数値ベクトルでなければなりません。
Tbl に真のクラス ラベルの変数が含まれていない場合は、Y を使用して変数を指定します。応答変数 Y の長さと Tbl の行数は等しくなければなりません。Tbl 内の変数のサブセットをセンシティブ属性として使用するには、sensitiveAttributeNames を使用して変数を指定します。
データ型: table
真のクラス ラベルの変数の名前。Tbl 内の応答変数の名前を含む文字ベクトルまたは string スカラーとして指定します。
例: "trueLabel" は、Tbl の変数 trueLabel (Tbl.trueLabel) が真のクラス ラベルの変数であることを示します。
データ型: char | string
センシティブ属性の変数の名前。文字ベクトル、一意な名前の string 配列、または一意な文字ベクトルの cell 配列として指定します。sensitiveAttributeNames の機能は、標本データの提供方法によって決まります。
SensitiveAttributesとYを指定した場合、sensitiveAttributeNamesを使用してSensitiveAttributes内の変数に名前を割り当てることができます。sensitiveAttributeNames内の名前の順序は、SensitiveAttributesの列の順序に一致しなければなりません。つまり、sensitiveAttributeNames{1}はSensitiveAttributes(:,1)の名前、sensitiveAttributeNames{2}はSensitiveAttributes(:,2)の名前であり、他も同様です。また、size(SensitiveAttributes,2)とnumel(sensitiveAttributeNames)は等しくなければなりません。既定では
sensitiveAttributeNamesは{'x1','x2',...}です。
Tblを指定した場合、sensitiveAttributeNamesを使用してセンシティブ属性として使用する変数を指定できます。つまり、fairnessMetricsは、公平性メトリクスの計算にsensitiveAttributeNamesの変数のみを使用します。sensitiveAttributeNamesはTbl.Properties.VariableNamesのサブセットでなければならず、クラス ラベルの変数や観測値の重みの変数の名前を含めることはできません。既定では、
sensitiveAttributeNamesは、ResponseName、Predictions、およびWeightsで指定された変数を除くTbl内のすべての変数名のセットです。
例: SensitiveAttributeNames="Gender"
例: SensitiveAttributeNames=["age","marital_status"]
データ型: char | string | cell
予測クラス ラベル (モデル予測)。[]、Tbl 内の変数の名前、または行列として指定します。
R2023a より前: 最大 1 つのバイナリ分類器の予測ラベルを Tbl 内の変数の名前またはベクトルを使用して指定します。
[]—fairnessMetricsは、真のクラス ラベルの変数 (YまたはTbl内のResponseNameの変数) の公平性メトリクスを計算します。Tbl内の変数の名前 — 入力データを tableTblとして指定した場合、各変数に 1 つのモデルの予測クラス ラベルが格納されているTbl内の 1 つ以上の変数の名前をpredictionsで指定できます。この場合、predictionsは、文字ベクトル、string 配列、または文字ベクトルの cell 配列として指定しなければなりません。たとえば、クラス ラベルの 1 つのベクトルが table にTbl.Predとして格納されている場合、predictionsを"Pred"として指定します。行列 — 行列の各行が標本に対応し、各列が 1 つのモデルの予測クラス ラベルに対応します。
predictionsの行数はYまたはTblの標本数と等しくなければなりません。predictionsの予測クラス ラベルは真のクラス ラベルの変数の要素でなければならず、predictionsのデータ型は真のクラス ラベルの変数と同じでなければなりません。
メモ
1 つ以上のバイナリ分類モデルの予測ラベルを指定した場合、fairnessMetrics は予測ラベルを返した各モデルの公平性メトリクスを計算します。
例: Predictions="Pred"
例: Predictions=["SVMPred","TreePred"]
データ型: single | double | logical | char | string | cell | categorical
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: Predictions="P",Weights="W" は、Tbl 内の変数 P および W をモデル予測および観測値の重みとしてそれぞれ指定します。
R2023a 以降
予測クラス ラベル predictions をもつモデルの名前。文字ベクトル、一意な名前の string 配列、または一意な文字ベクトルの cell 配列として指定します。
predictionsがTbl内の名前の配列の場合、ModelNames内の名前の順序はpredictions内の名前の順序に対応していなければなりません。つまり、ModelNames{1}は table 変数predictions{1}内の予測ラベルをもつモデルの名前、ModelNames{2}は table 変数predictions{2}内の予測ラベルをもつモデルの名前であり、他も同様です。numel(ModelNames)とnumel(predictions)は等しくなければなりません。既定では、ModelNamesの値はpredictionsと等しくなります。predictionsが行列の場合、ModelNames内の名前の順序はpredictionsの列の順序に対応していなければなりません。つまり、ModelNames{1}は予測ラベルpredictions(:,1)をもつモデルの名前、ModelNames{2}は予測ラベルpredictions(:,2)をもつモデルの名前であり、他も同様です。numel(ModelNames)とsize(predictions,2)は等しくなければなりません。既定では、ModelNamesの値は{'Model1','Model2',...}になります。predictionsが[]の場合、ModelNamesの値は'Model1'になります。メモ
predictionsの値が[]の場合、ModelNamesの値は指定できません。
例: ModelNames="Ensemble"
例: ModelNames=["SVM","Tree"]
データ型: char | string | cell
陽性クラスのラベル。スカラーとして指定します。PositiveClass のデータ型は真のクラス ラベルの変数と同じでなければなりません。
PositiveClass の既定値は、バイナリ ラベルの 2 番目のクラスです。クラスの順序は、真のクラス ラベルの変数に対して関数 unique で "sorted" オプションを指定して返される順序になります。
例: PositiveClass=categorical(">50K")
データ型: categorical | char | string | logical | single | double | cell
各センシティブ属性の参照グループ。数値ベクトル、string 配列、または cell 配列として指定します。ReferenceGroup 値の各要素は、対応するセンシティブ属性と同じデータ型でなければなりません。センシティブ属性の型が混在している場合は、ReferenceGroup を cell 配列として指定してください。ReferenceGroup 値の要素数は、センシティブ属性の数と一致しなければなりません。
ReferenceGroup の既定値は、各センシティブ属性の最頻値を格納するベクトルです。最頻値は、観測値の重みは考慮せずに最も頻繁に出現する値です。
例: ReferenceGroup={30,categorical("Married-civ-spouse")}
データ型: single | double | string | cell
観測値の重み。スカラー値のベクトルまたは Tbl 内の変数の名前として指定します。SensitiveAttributes または Tbl の各行に含まれている観測値には、Weights の対応する値で重みが付けられます。Weights のサイズは、SensitiveAttributes または Tbl の行数と同じでなければなりません。
入力データを table Tbl として指定した場合、Weights は数値ベクトルが含まれている Tbl 内の変数の名前にすることができます。この場合、Weights には文字ベクトルまたは string スカラーを指定しなければなりません。たとえば、重みのベクトル W が Tbl.W に格納されている場合、Weights を "W" として指定します。
例: Weights="W"
データ型: single | double | char | string
プロパティ
この プロパティ は読み取り専用です。
バイアス メトリクス。table として指定します。
fairnessMetrics は、各センシティブ属性の各グループのバイアス メトリクスを属性の参照グループとの比較から計算します。
BiasMetrics の各行にセンシティブ属性のグループのバイアス メトリクスが格納されます。
データレベルの評価では、
BiasMetricsの 1 番目と 2 番目の変数がセンシティブ属性の名前 (SensitiveAttributeNames列) とグループの名前 (Groups列) にそれぞれ対応します。モデルレベルの評価では、1 番目の変数がモデルの名前 (
ModelNames列) に対応します。2 番目と 3 番目の変数がセンシティブ属性の名前とグループの名前にそれぞれ対応します。
残りの変数は次の表のバイアス メトリクスに対応します。
| メトリクス名 | 説明 | 評価タイプ |
|---|---|---|
StatisticalParityDifference | 統計的均一性差 (SPD) | データレベルまたはモデルレベルの評価 |
DisparateImpact | 差異の影響 (DI) | データレベルまたはモデルレベルの評価 |
EqualOpportunityDifference | 機会均等差 (EOD) | モデルレベルの評価 |
AverageAbsoluteOddsDifference | 平均絶対オッズ差 (AAOD) | モデルレベルの評価 |
サポートされるバイアス メトリクスは、fairnessMetrics オブジェクトの作成時に引数 Predictions を使用して予測ラベルを指定するかどうかによって異なります。
データレベルの評価 — 真のラベルを指定して予測ラベルを指定しなかった場合、
StatisticalParityDifferenceとDisparateImpactのみがBiasMetricsプロパティに格納されます。モデルレベルの評価 — 真のラベルと予測ラベルの両方を指定した場合、この表のすべてのメトリクスが
BiasMetricsプロパティに格納されます。
バイアス メトリクスの定義については、バイアス メトリクスを参照してください。
データ型: table
この プロパティ は読み取り専用です。
グループ メトリクス。table として指定します。
関数 fairnessMetrics は、各センシティブ属性の各グループのグループ メトリクスを計算します。観測値の重み (名前と値の引数 Weights で指定) は、各グループの標本数 (GroupCount 値) のカウントには使用されないことに注意してください。Weights は他のメトリクスの計算に使用されます。
GroupMetrics の各行にセンシティブ属性のグループのグループ メトリクスが格納されます。
データレベルの評価では、
GroupMetricsの 1 番目と 2 番目の変数がセンシティブ属性の名前 (SensitiveAttributeNames列) とグループの名前 (Groups列) にそれぞれ対応します。モデルレベルの評価では、1 番目の変数がモデルの名前 (
ModelNames列) に対応します。2 番目と 3 番目の変数がセンシティブ属性の名前とグループの名前にそれぞれ対応します。
残りの変数は次の表のグループ メトリクスに対応します。
| メトリクス名 | 説明 | 評価タイプ |
|---|---|---|
GroupCount | グループ カウント (グループの標本数) | データレベルまたはモデルレベルの評価 |
GroupSizeRatio | グループ カウントを合計標本数で除算した値 | データレベルまたはモデルレベルの評価 |
TruePositives | 真陽性の数 (TP) | モデルレベルの評価 |
TrueNegatives | 真陰性の数 (TN) | モデルレベルの評価 |
FalsePositives | 偽陽性の数 (FP) | モデルレベルの評価 |
FalseNegatives | 偽陰性の数 (FN) | モデルレベルの評価 |
TruePositiveRate | 真陽性率 (TPR) (再現率または感度とも呼ばれる)、TP/(TP+FN) | モデルレベルの評価 |
TrueNegativeRate | 真陰性率 (TNR)、特異度、TN/(TN+FP) | モデルレベルの評価 |
FalsePositiveRate | 偽陽性率 (FPR) (フォールアウトまたは 1 - 特異度とも呼ばれる)、FP/(TN+FP) | モデルレベルの評価 |
FalseNegativeRate | 偽陰性率 (FNR)、失敗率、FN/(TP+FN) | モデルレベルの評価 |
FalseDiscoveryRate | 偽発見率 (FDR)、FP/(TP+FP) | モデルレベルの評価 |
FalseOmissionRate | 偽省略率 (FOR)、FN/(TN+FN) | モデルレベルの評価 |
PositivePredictiveValue | 陽性予測値 (PPV)、適合率、TP/(TP+FP) | モデルレベルの評価 |
NegativePredictiveValue | 陰性予測値 (NPV)、TN/(TN+FN) | モデルレベルの評価 |
RateOfPositivePredictions | 陽性予測率 (RPP)、(TP+FP)/(TP+FN+FP+TN) | モデルレベルの評価 |
RateOfNegativePredictions | 陰性予測率 (RNP)、(TN+FN)/(TP+FN+FP+TN) | モデルレベルの評価 |
Accuracy | 精度、(TP+TN)/(TP+FN+FP+TN) | モデルレベルの評価 |
サポートされるグループ メトリクスは、fairnessMetrics オブジェクトの作成時に引数 Predictions を使用して予測ラベルを指定するかどうかによって異なります。
データレベルの評価 — 真のラベルを指定して予測ラベルを指定しなかった場合、
GroupCountとGroupSizeRatioのみがGroupMetricsプロパティに格納されます。モデルレベルの評価 — 真のラベルと予測ラベルの両方を指定した場合、この表のすべてのメトリクスが
GroupMetricsプロパティに格納されます。
データ型: table
R2023a 以降
この プロパティ は読み取り専用です。
予測クラス ラベル predictions をもつモデルの名前。文字ベクトルまたは一意な文字ベクトルの cell 配列として指定します。(string 配列は文字ベクトルの cell 配列として扱われます)。
名前と値の引数 ModelNames によってこのプロパティが設定されます。
データ型: char | cell
この プロパティ は読み取り専用です。
陽性クラスのラベル。スカラーとして指定します。(string スカラーは文字ベクトルとして扱われます。)
名前と値の引数 PositiveClass によってこのプロパティが設定されます。
データ型: categorical | char | logical | single | double | cell
この プロパティ は読み取り専用です。
基準ベクトル。数値ベクトルまたは cell 配列として指定します。(string 配列は文字ベクトルの cell 配列として扱われます)。
名前と値の引数 ReferenceGroup によってこのプロパティが設定されます。
データ型: single | double | cell
この プロパティ は読み取り専用です。
真のクラス ラベルの変数の名前。応答変数の名前を含む文字ベクトルとして指定します。(string スカラーは文字ベクトルとして扱われます。)
ResponseName引数を指定した場合、指定した値に応じてこのプロパティが決まります。Yを指定した場合、このプロパティの値は'Y'になります。
データ型: char
この プロパティ は読み取り専用です。
センシティブ属性の変数の名前。文字ベクトルまたは一意な文字ベクトルの cell 配列として指定します。(string 配列は文字ベクトルの cell 配列として扱われます)。
sensitiveAttributeNames 引数によってこのプロパティが設定されます。
データ型: char | cell
例
fairnessMetrics オブジェクトを作成して、真のラベルのセンシティブ属性についての公平性メトリクスを計算します。その後、関数 report を使用して公平性メトリクスの table を作成し、関数 plot を使用してメトリクスの棒グラフをプロットします。
学習データ adultdata およびテスト データ adulttest を含む、標本データ census1994 を読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するために使用できる、米国国勢調査局の人口統計情報から構成されています。学習データ セットの最初の数行をプレビューします。
load census1994
head(adultdata) age workClass fnlwgt education education_num marital_status occupation relationship race sex capital_gain capital_loss hours_per_week native_country salary
___ ________________ __________ _________ _____________ _____________________ _________________ _____________ _____ ______ ____________ ____________ ______________ ______________ ______
39 State-gov 77516 Bachelors 13 Never-married Adm-clerical Not-in-family White Male 2174 0 40 United-States <=50K
50 Self-emp-not-inc 83311 Bachelors 13 Married-civ-spouse Exec-managerial Husband White Male 0 0 13 United-States <=50K
38 Private 2.1565e+05 HS-grad 9 Divorced Handlers-cleaners Not-in-family White Male 0 0 40 United-States <=50K
53 Private 2.3472e+05 11th 7 Married-civ-spouse Handlers-cleaners Husband Black Male 0 0 40 United-States <=50K
28 Private 3.3841e+05 Bachelors 13 Married-civ-spouse Prof-specialty Wife Black Female 0 0 40 Cuba <=50K
37 Private 2.8458e+05 Masters 14 Married-civ-spouse Exec-managerial Wife White Female 0 0 40 United-States <=50K
49 Private 1.6019e+05 9th 5 Married-spouse-absent Other-service Not-in-family Black Female 0 0 16 Jamaica <=50K
52 Self-emp-not-inc 2.0964e+05 HS-grad 9 Married-civ-spouse Exec-managerial Husband White Male 0 0 45 United-States >50K
各行には、成人 1 人の人口統計情報が格納されています。age、marital_status、relationship、race、sex などのセンシティブ属性の情報が含まれます。3 列目の flnwgt に観測値の重みが格納されており、最後の列 salary は個人の年収が $50,000 以下 (<=50K) か $50,000 を超える (>50K) かを示します。
この例では、変数 salary の年齢についての公平性を評価します。変数 age を 4 つのビンにグループ化します。
ageGroups = ["Age<30","30<=Age<45","45<=Age<60","Age>=60"]; adultdata.age_group = discretize(adultdata.age, ... [min(adultdata.age) 30 45 60 max(adultdata.age)], ... categorical=ageGroups);
それぞれのクラス (<=50K と >50K) の個体のカウントを年齢別にプロットします。
figure gc = groupcounts(adultdata,["age_group","salary"]); bar([gc.GroupCount(1:2:end),gc.GroupCount(2:2:end)]) xticklabels(ageGroups) xlabel("Age Group") ylabel("Group Count") legend(["<=50K",">50K"]) grid on

fairnessMetrics を使用して、変数 salary の変数 age_group についての公平性メトリクスを計算します。
metricsResults = fairnessMetrics(adultdata,"salary", ... SensitiveAttributeNames="age_group",Weights="fnlwgt")
metricsResults =
fairnessMetrics with properties:
SensitiveAttributeNames: 'age_group'
ReferenceGroup: '30<=Age<45'
ResponseName: 'salary'
PositiveClass: >50K
BiasMetrics: [4×4 table]
GroupMetrics: [4×4 table]
Properties, Methods
metricsResults は fairnessMetrics オブジェクトです。既定では、関数 fairnessMetrics は、センシティブ属性の多数派グループ (個体数が最も多いグループ) を属性の参照グループとして選択します。さらに、関数 fairnessMetrics は、関数uniqueで "sorted" オプションを使用してラベルを並べ替え、ラベルの 2 番目のクラスを陽性クラスとして指定します。このデータ セットでは、age_group の参照グループはグループ 30<=Age<45、陽性クラスは >50K になります。オブジェクトの BiasMetrics プロパティと GroupMetrics プロパティにバイアス メトリクスとグループ メトリクスがそれぞれ格納されます。プロパティを表示します。
metricsResults.BiasMetrics
ans=4×4 table
SensitiveAttributeNames Groups StatisticalParityDifference DisparateImpact
_______________________ __________ ___________________________ _______________
age_group Age<30 -0.24365 0.17661
age_group 30<=Age<45 0 1
age_group 45<=Age<60 0.098497 1.3329
age_group Age>=60 -0.05041 0.82965
metricsResults.GroupMetrics
ans=4×4 table
SensitiveAttributeNames Groups GroupCount GroupSizeRatio
_______________________ __________ __________ ______________
age_group Age<30 9711 0.29824
age_group 30<=Age<45 12489 0.38356
age_group 45<=Age<60 7717 0.237
age_group Age>=60 2644 0.081201
バイアス メトリクスから、変数 salary には、参照グループ (30<=Age<45) と比較して 45 ~ 60 歳の年齢グループに正のバイアスがあり、30 歳未満の年齢グループに負のバイアスがあります。
関数 report を使用して、バイアス メトリクスとグループ メトリクスの両方を格納する table を作成できます。GroupMetrics を "all" と指定して、すべてのグループ メトリクスを含めます。"all" が既定値であるため、名前と値の引数 BiasMetrics を指定する必要はありません。
metricsTbl = report(metricsResults,GroupMetrics="all")metricsTbl=4×6 table
SensitiveAttributeNames Groups StatisticalParityDifference DisparateImpact GroupCount GroupSizeRatio
_______________________ __________ ___________________________ _______________ __________ ______________
age_group Age<30 -0.24365 0.17661 9711 0.29824
age_group 30<=Age<45 0 1 12489 0.38356
age_group 45<=Age<60 0.098497 1.3329 7717 0.237
age_group Age>=60 -0.05041 0.82965 2644 0.081201
関数 plot を使用してバイアス メトリクスを可視化します。
figure t = tiledlayout(2,1); nexttile plot(metricsResults,"spd") xlabel("") ylabel("") nexttile plot(metricsResults,"di") xlabel("") ylabel("") xlabel(t,"Fairness Metric Value") ylabel(t,"Age Group")

各プロットの垂直線 (統計的均一性差の 、差異の影響の ) は、参照グループのメトリクス値を示します。ラベルに参照グループと比較してターゲット グループに対するバイアスがなければ、ターゲット グループのメトリクス値は参照グループのメトリクス値と同じになります。
fairnessMetrics オブジェクトを作成して、予測ラベルのセンシティブ属性についての公平性メトリクスを計算します。その後、関数 report を使用して公平性メトリクスの table を作成し、関数 plot を使用してメトリクスの棒グラフをプロットします。
学習データ adultdata およびテスト データ adulttest を含む、標本データ census1994 を読み込みます。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するために使用できる、米国国勢調査局の人口統計情報から構成されています。学習データ セットの最初の数行をプレビューします。
load census1994
head(adultdata) age workClass fnlwgt education education_num marital_status occupation relationship race sex capital_gain capital_loss hours_per_week native_country salary
___ ________________ __________ _________ _____________ _____________________ _________________ _____________ _____ ______ ____________ ____________ ______________ ______________ ______
39 State-gov 77516 Bachelors 13 Never-married Adm-clerical Not-in-family White Male 2174 0 40 United-States <=50K
50 Self-emp-not-inc 83311 Bachelors 13 Married-civ-spouse Exec-managerial Husband White Male 0 0 13 United-States <=50K
38 Private 2.1565e+05 HS-grad 9 Divorced Handlers-cleaners Not-in-family White Male 0 0 40 United-States <=50K
53 Private 2.3472e+05 11th 7 Married-civ-spouse Handlers-cleaners Husband Black Male 0 0 40 United-States <=50K
28 Private 3.3841e+05 Bachelors 13 Married-civ-spouse Prof-specialty Wife Black Female 0 0 40 Cuba <=50K
37 Private 2.8458e+05 Masters 14 Married-civ-spouse Exec-managerial Wife White Female 0 0 40 United-States <=50K
49 Private 1.6019e+05 9th 5 Married-spouse-absent Other-service Not-in-family Black Female 0 0 16 Jamaica <=50K
52 Self-emp-not-inc 2.0964e+05 HS-grad 9 Married-civ-spouse Exec-managerial Husband White Male 0 0 45 United-States >50K
各行には、成人 1 人の人口統計情報が格納されています。age、marital_status、relationship、race、sex などのセンシティブ属性の情報が含まれます。3 列目の flnwgt に観測値の重みが格納されており、最後の列 salary は個人の年収が $50,000 以下 (<=50K) か $50,000 を超える (>50K) かを示します。
学習データ セット adultdata を使用して分類木に学習させます。table adultdata 内の変数名を使用して、応答変数、予測子変数、および観測値の重みを指定します。
predictorNames = ["capital_gain","capital_loss","education", ... "education_num","hours_per_week","occupation","workClass"]; Mdl = fitctree(adultdata,"salary", ... PredictorNames=predictorNames,Weights="fnlwgt");
学習させた木 Mdl を使用して、テスト標本のラベルを予測します。
labels = predict(Mdl,adulttest);
この例では、予測ラベルの年齢および婚姻区分についての公平性を評価します。変数 age を 4 つのビンにグループ化します。
ageGroups = ["Age<30","30<=Age<45","45<=Age<60","Age>=60"]; adulttest.age_group = discretize(adulttest.age, ... [min(adulttest.age) 30 45 60 max(adulttest.age)], ... categorical=ageGroups);
それぞれの予測クラス (<=50K と >50K) の個体のカウントを年齢別にプロットします。
figure
gs_age = groupcounts({adulttest.age_group,labels});
b_age = bar([gs_age(1:2:end),gs_age(2:2:end)]);
xticklabels(ageGroups)
xlabel("Age Group")
ylabel("Group Count")
legend(["<=50K",">50K"])
grid minor
個体のカウントを婚姻区分別にプロットします。カウント値が 100 より小さい場合はバーの先端付近に値を表示します。
figure
gs_status = groupcounts({adulttest.marital_status,labels});
b_status = bar([gs_status(1:2:end),gs_status(2:2:end)]);
xticklabels(unique(adulttest.marital_status))
xlabel("Marital Status")
ylabel("Group Count")
legend(["<=50K",">50K"])
grid minor
xtips1 = b_status(1).XEndPoints;
ytips1 = b_status(1).YEndPoints;
labels1 = string(b_status(1).YData);
ind1 = ytips1 < 100;
text(xtips1(ind1),ytips1(ind1),labels1(ind1), ...
HorizontalAlignment="center",VerticalAlignment="bottom", ...
Color=b_status(1).FaceColor)
xtips2 = b_status(2).XEndPoints;
ytips2 = b_status(2).YEndPoints;
labels2 = string(b_status(2).YData);
ind2 = ytips2 < 100;
text(xtips2(ind2),ytips2(ind2),labels2(ind2), ...
HorizontalAlignment="center",VerticalAlignment="bottom", ...
Color=b_status(2).FaceColor)
fairnessMetrics を使用して、予測 (labels) の変数 age_group および marital_status についての公平性メトリクスを計算します。
metricsResults = fairnessMetrics(adulttest,"salary", ... SensitiveAttributeNames=["age_group","marital_status"], ... Predictions=labels,Weights="fnlwgt")
metricsResults =
fairnessMetrics with properties:
SensitiveAttributeNames: {'age_group' 'marital_status'}
ReferenceGroup: {'30<=Age<45' 'Married-civ-spouse'}
ResponseName: 'salary'
PositiveClass: >50K
BiasMetrics: [11×7 table]
GroupMetrics: [11×20 table]
ModelNames: 'Model1'
Properties, Methods
metricsResults は fairnessMetrics オブジェクトです。既定では、関数 fairnessMetrics は、各センシティブ属性の多数派グループ (個体数が最も多いグループ) を属性の参照グループとして選択します。さらに、関数 fairnessMetrics は、関数uniqueで "sorted" オプションを使用してラベルを並べ替え、ラベルの 2 番目のクラスを陽性クラスとして指定します。このデータ セットでは、age_group および marital_status の参照グループはそれぞれグループ 30<=Age<45 および Married-civ-spouse、陽性クラスは >50K になります。オブジェクトの BiasMetrics プロパティと GroupMetrics プロパティにバイアス メトリクスとグループ メトリクスがそれぞれ格納されます。
関数 report を使用して公平性メトリクスの table を作成します。BiasMetrics を ["eod","aaod"] と指定して、機会均等差 (EOD) と平均絶対オッズ差 (AAOD) のメトリクスをレポートの table に含めます。関数 fairnessMetrics では、これらの 2 つのメトリクスの計算に真陽性率 (TPR) と偽陽性率 (FPR) を使用します。GroupMetrics を ["tpr","fpr"] と指定して、TPR と FPR の値を table に含めます。
metricsTbl = report(metricsResults, ... BiasMetrics=["eod","aaod"],GroupMetrics=["tpr","fpr"])
metricsTbl=11×7 table
ModelNames SensitiveAttributeNames Groups EqualOpportunityDifference AverageAbsoluteOddsDifference TruePositiveRate FalsePositiveRate
__________ _______________________ _____________________ __________________________ _____________________________ ________________ _________________
Model1 age_group Age<30 -0.041319 0.044114 0.41333 0.041709
Model1 age_group 30<=Age<45 0 0 0.45465 0.088618
Model1 age_group 45<=Age<60 0.061495 0.031809 0.51614 0.086495
Model1 age_group Age>=60 0.0060387 0.011955 0.46069 0.070746
Model1 marital_status Divorced 0.078541 0.043643 0.54263 0.075653
Model1 marital_status Married-AF-spouse 0.073166 0.078782 0.53726 0
Model1 marital_status Married-civ-spouse 0 0 0.46409 0.084398
Model1 marital_status Married-spouse-absent -0.067098 0.048093 0.39699 0.055311
Model1 marital_status Never-married 0.0886 0.057557 0.55269 0.057883
Model1 marital_status Separated 0.027256 0.026751 0.49135 0.058151
Model1 marital_status Widowed 0.12442 0.080073 0.58851 0.048675
センシティブ属性 age_group の EOD と AAOD の値をプロットします。age_group は metricsResults の SensitiveAttributeNames プロパティの最初の要素であるため、プロパティの既定値です。そのため、plot の引数 SensitiveAttributeName を指定する必要はありません。
figure t = tiledlayout(1,2); nexttile plot(metricsResults,"eod") title("EOD") xlabel("") ylabel("") nexttile plot(metricsResults,"aaod") title("AAOD") xlabel("") ylabel("") yticklabels("") xlabel(t,"Fairness Metric Value") ylabel(t,"Age Group")

の垂直線は、参照グループ (30<=Age<45) のメトリクス値を示します。ラベルに参照グループと比較してターゲット グループに対するバイアスがなければ、ターゲット グループのメトリクス値は参照グループのメトリクス値と同じになります。EOD の値 (TPR の差) では、変数 salary の予測の参照グループと比較したバイアスがグループ 45<=Age<60 で最も大きくなっています。AAOD の値 (TPR と FPR の差の平均) では、予測のバイアスがグループ Age<30 で最も大きくなっています。
関数 plot の引数 SensitiveAttributeName を marital_status と指定して、センシティブ属性 marital_status の EOD と AAOD の値をプロットします。
figure t = tiledlayout(1,2); nexttile plot(metricsResults,"eod",SensitiveAttributeName="marital_status") title("EOD") xlabel("") ylabel("") nexttile plot(metricsResults,"aaod",SensitiveAttributeName="marital_status") title("AAOD") xlabel("") ylabel("") yticklabels("") xlabel(t,"Fairness Metric Value") ylabel(t,"Marital Status")

の垂直線は、参照グループ (Married-civ-spouse) のメトリクス値を示します。EOD の値では、変数 salary の予測の参照グループと比較したバイアスがグループ Widowed で最も大きくなっています。AAOD の値では、予測のバイアスがグループ Widowed とMarried-AF-spouse で同様になっています。
2 つの分類モデルに学習させ、公平性メトリクスを使用してモデル予測を比較します。
標本ファイル CreditRating_Historical.dat を table に読み取ります。予測子データは、法人顧客リストの財務比率と業種の情報で構成されます。応答変数は、格付機関が割り当てた格付けから構成されます。
creditrating = readtable("CreditRating_Historical.dat");変数 ID の各値は一意の顧客 ID であるため (つまり、length(unique(creditrating.ID)) は creditrating に含まれる観測値の数に等しい)、変数 ID は予測子としては適切ではありません。変数 ID を table から削除し、変数 Industry を categorical 変数に変換します。
creditrating.ID = []; creditrating.Industry = categorical(creditrating.Industry);
応答変数 Rating について、AAA、AA、A、および BBB の格付けを "good" の格付けのカテゴリに結合し、BB、B、および CCC の格付けを "poor" の格付けのカテゴリに結合します。
Rating = categorical(creditrating.Rating); Rating = mergecats(Rating,["AAA","AA","A","BBB"],"good"); Rating = mergecats(Rating,["BB","B","CCC"],"poor"); creditrating.Rating = Rating;
サポート ベクター マシン (SVM) モデルに creditrating データで学習させます。より良い結果を得るために、モデルを当てはめる前に予測子を標準化します。学習させたモデルを使用してラベルを予測し、学習データ セットの誤分類率を計算します。
predictorNames = ["WC_TA","RE_TA","EBIT_TA","MVE_BVTD","S_TA"]; SVMMdl = fitcsvm(creditrating,"Rating", ... PredictorNames=predictorNames,Standardize=true); SVMPredictions = resubPredict(SVMMdl); resubLoss(SVMMdl)
ans = 0.0872
一般化加法モデル (GAM) に学習させます。
GAMMdl = fitcgam(creditrating,"Rating", ... PredictorNames=predictorNames); GAMPredictions = resubPredict(GAMMdl); resubLoss(GAMMdl)
ans = 0.0542
学習データ セットに対する精度は GAMMdl の方が高くなっています。
両方のモデルのモデル予測を使用して、センシティブ属性 Industry についての公平性メトリクスを計算します。
predictions = [SVMPredictions,GAMPredictions]; metricsResults = fairnessMetrics(creditrating,"Rating", ... SensitiveAttributeNames="Industry",Predictions=predictions, ... ModelNames=["SVM","GAM"]);
関数 report を使用してバイアス メトリクスを表示します。
report(metricsResults)
ans=48×5 table
Metrics SensitiveAttributeNames Groups SVM GAM
___________________________ _______________________ ______ _________ __________
StatisticalParityDifference Industry 1 -0.028441 0.0058208
StatisticalParityDifference Industry 2 -0.04014 0.0063339
StatisticalParityDifference Industry 3 0 0
StatisticalParityDifference Industry 4 -0.04905 -0.0043007
StatisticalParityDifference Industry 5 -0.015615 0.0041607
StatisticalParityDifference Industry 6 -0.03818 -0.024515
StatisticalParityDifference Industry 7 -0.01514 0.007326
StatisticalParityDifference Industry 8 0.0078632 0.036581
StatisticalParityDifference Industry 9 -0.013863 0.042266
StatisticalParityDifference Industry 10 0.0090218 0.050095
StatisticalParityDifference Industry 11 -0.004188 0.001453
StatisticalParityDifference Industry 12 -0.041572 -0.028589
DisparateImpact Industry 1 0.92261 1.017
DisparateImpact Industry 2 0.89078 1.0185
DisparateImpact Industry 3 1 1
DisparateImpact Industry 4 0.86654 0.98742
⋮
バイアス メトリクスのうち、機会均等差 (EOD) の値を比較します。関数 plot を使用して、EOD の値の棒グラフを作成します。
b = plot(metricsResults,"eod"); b(1).FaceAlpha = 0.2; b(2).FaceAlpha = 0.2; legend(Location="southwest")

EOD の値の分布が理解しやすくなるように、箱ひげ図を使用して値をプロットします。
boxchart(metricsResults.BiasMetrics.EqualOpportunityDifference, ... GroupByColor=metricsResults.BiasMetrics.ModelNames) ax = gca; ax.XTick = []; ylabel("Equal Opportunity Difference") legend

EOD の値は、SVM の値に比べて GAM の方が 0 に近くなっています。
詳細
fairnessMetrics オブジェクトは、統計的均一性差 (SPD)、差異の影響 (DI)、機会均等差 (EOD)、および平均絶対オッズ差 (AAOD) の 4 つのバイアス メトリクスをサポートします。オブジェクトは EOD と AAOD はモデル予測の評価でのみサポートされます。
fairnessMetrics オブジェクトは、各センシティブ属性の各グループのバイアス メトリクスを属性の参照グループに基づいて計算します。
統計的均一性 (デモグラフィック パリティ) 差 (SPD)
グループ sij の i 番目のセンシティブ属性 (Si) の参照グループ sir に対する SPD の値は、次のように定義されます。
SPD の値は、センシティブ属性の値が sij の場合に陽性クラスになる確率とセンシティブ属性の値が sir (参照グループ) の場合に陽性クラスになる確率の差です。このメトリクスでは、ラベルにセンシティブ属性によるバイアスがない場合に 2 つの確率 (統計的パリティ) が等しくなるものと仮定されます。
引数
Predictionsを指定した場合、真のラベル Y の代わりに、モデル予測 の確率についての SPD が計算されます。差異の影響 (DI)
グループ sij の i 番目のセンシティブ属性 (Si) の参照グループ sir に対する DI の値は、次のように定義されます。
DI の値は、センシティブ属性の値が sij の場合に陽性クラスになる確率とセンシティブ属性の値が sir (参照グループ) の場合に陽性クラスになる確率の比です。このメトリクスでは、ラベルにセンシティブ属性によるバイアスがない場合に 2 つの確率が等しくなるものと仮定されます。一般に、DI の値が
0.8より小さいか1.25より大きいと、参照グループに対してバイアスがあることを示します[2]。引数
Predictionsを指定した場合、真のラベル Y の代わりに、モデル予測 の確率についての DI が計算されます。機会均等差 (EOD)
グループ sij の i 番目のセンシティブ属性 (Si) の参照グループ sir に対する EOD の値は、次のように定義されます。
EOD の値は、グループ sij と参照グループ sir の間の真陽性率 (TPR) の差です。このメトリクスでは、予測ラベルにセンシティブ属性によるバイアスがない場合に 2 つの率が等しくなるものと仮定されます。
平均絶対オッズ差 (AAOD)
グループ sij の i 番目のセンシティブ属性 (Si) の参照グループ sir に対する AAOD の値は、次のように定義されます。
AAOD の値は、グループ sij と参照グループ sir の間の真陽性率 (TPR) と偽陽性率 (FPR) の差を表します。このメトリクスでは、予測ラベルにセンシティブ属性によるバイアスがない場合に TPR と FPR の差がないものと仮定されます。
アルゴリズム
fairnessMetrics は、Tbl、Y、および SensitiveAttributes に含まれている NaN、'' (空の文字ベクトル)、"" (空の string)、<missing>、および <undefined> の値を欠損値と見なします。fairnessMetrics は、欠損値がある観測値を使用しません。
参照
[1] Mehrabi, Ninareh, et al. “A Survey on Bias and Fairness in Machine Learning.” ArXiv:1908.09635 [cs.LG], Sept. 2019. arXiv.org.
[2] Saleiro, Pedro, et al. “Aequitas: A Bias and Fairness Audit Toolkit.” ArXiv:1811.05577 [cs.LG], April 2019. arXiv.org.
バージョン履歴
R2022b で導入関数 fairnessMetrics を使用して、複数のバイナリ分類器の公平性メトリクスを比較できます。関数の呼び出しで、引数 predictions を使用して各モデルの予測クラス ラベルを指定します。モデルの名前の指定には、名前と値の引数 ModelNames を使用できます。モデルの名前の情報は、fairnessMetrics オブジェクトの BiasMetrics、GroupMetrics、および ModelNames の各プロパティに格納されます。
fairnessMetrics オブジェクトを作成した後、オブジェクト関数 report または plot を使用します。
オブジェクト関数
reportは、公平性メトリクスの table を返します。その形式は、名前と値の引数DisplayMetricsInRowsの値に応じて異なります。(詳細については、metricsTblを参照してください。) 名前と値の引数ModelNamesを使用して、レポートの table に含めるモデルのサブセットを指定できます。オブジェクト関数
plotは、棒グラフをBarオブジェクトの配列として返します。指定されたメトリクスの計算に予測ラベルが使用されたモデルがバーの色で示されます。名前と値の引数ModelNamesを使用して、プロットに含めるモデルのサブセットを指定できます。
以前のリリースでは、fairnessMetrics オブジェクトの BiasMetrics プロパティおよび GroupMetrics プロパティの 1 番目と 2 番目の変数は、常にセンシティブ属性の名前 (SensitiveAttributeNames 列) とグループの名前 (Groups 列) にそれぞれ対応していました。現在の動作の詳細については、BiasMetrics および GroupMetrics を参照してください。
参考
トピック
- バイナリ分類の公平性の紹介
- Explore Fairness Metrics for Credit Scoring Model (Risk Management Toolbox)
MATLAB Command
You clicked a link that corresponds to this MATLAB command:
Run the command by entering it in the MATLAB Command Window. Web browsers do not support MATLAB commands.
Web サイトの選択
Web サイトを選択すると、翻訳されたコンテンツにアクセスし、地域のイベントやサービスを確認できます。現在の位置情報に基づき、次のサイトの選択を推奨します:
また、以下のリストから Web サイトを選択することもできます。
最適なサイトパフォーマンスの取得方法
中国のサイト (中国語または英語) を選択することで、最適なサイトパフォーマンスが得られます。その他の国の MathWorks のサイトは、お客様の地域からのアクセスが最適化されていません。
南北アメリカ
- América Latina (Español)
- Canada (English)
- United States (English)
ヨーロッパ
- Belgium (English)
- Denmark (English)
- Deutschland (Deutsch)
- España (Español)
- Finland (English)
- France (Français)
- Ireland (English)
- Italia (Italiano)
- Luxembourg (English)
- Netherlands (English)
- Norway (English)
- Österreich (Deutsch)
- Portugal (English)
- Sweden (English)
- Switzerland
- United Kingdom (English)