fairnessThresholder
説明
作成
構文
説明
は、バイナリ分類器 fairnessMdl = fairnessThresholder(Mdl,Tbl,AttributeName,ResponseVarName)Mdl のスコアのしきい値を公平性の範囲を満たしながら最適化します。この関数では、検証データ table Tbl 内の観測値を table 変数 ResponseVarName 内のクラス ラベルで分類するしきい値のベクトルについて試行します。最適なしきい値を下回る臨界領域の観測値については、センシティブ属性 AttributeName の参照グループと非参照グループで公平性の制約が保たれるように関数でラベルが調整されます。詳細については、棄却オプションベース分類を参照してください。
では、前の構文におけるいずれかの入力引数の組み合わせに加えて、1 つ以上の名前と値の引数を使用してオプションを指定します。たとえば、名前と値の引数 fairnessMdl = fairnessThresholder(___,Name=Value)BiasMetric を使用してバイアス メトリクスを指定します。
入力引数
バイナリ分類器。完全またはコンパクトな分類モデル オブジェクトか関数ハンドルとして指定します。
完全またはコンパクトなモデル オブジェクト — オブジェクト関数
predictをもつ、完全またはコンパクトな分類モデル オブジェクトを指定できます。モデルに学習させる場合は、行が各観測値に対応する数値行列または table を予測子データに使用してください。サポートされているモデル 完全またはコンパクトな分類モデル オブジェクト 判別分析分類器 ClassificationDiscriminant,CompactClassificationDiscriminant分類用のアンサンブル学習器 ClassificationEnsemble,CompactClassificationEnsemble,ClassificationBaggedEnsembleランダムな特徴量拡張を使用したガウス カーネル分類モデル ClassificationKernel一般化加法モデル ClassificationGAM,CompactClassificationGAMk 最近傍分類器 ClassificationKNN線形分類モデル ClassificationLinear単純ベイズ モデル ClassificationNaiveBayes,CompactClassificationNaiveBayesニューラル ネットワーク分類器 ClassificationNeuralNetwork,CompactClassificationNeuralNetworkバイナリ分類用のサポート ベクター マシン分類器 ClassificationSVM,CompactClassificationSVM分類に使用される二分決定木 ClassificationTree,CompactClassificationTree関数ハンドル — 予測子データを受け入れ、予測子データの各観測値についての予測スコアが格納された列ベクトルを返す関数ハンドルを指定できます。各予測スコアは 0 から 1 までの値でなければなりません。ここで、範囲 [0, 0.5] のスコアが陰性クラスに対応し、範囲 (0.5, 1] のスコアが陽性クラスに対応します。名前と値の引数
PositiveClassを使用して陽性クラスを指定する必要があります。
検証データ セット。table として指定します。Tbl の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。Mdl の学習に使用したすべての予測子変数、センシティブ属性、および応答変数を table に含める必要があります。観測値の重みなどの追加の変数も table に含めることができます。文字ベクトルの cell 配列ではない cell 配列と複数列の変数は使用できません。
データ型: table
センシティブ属性の名前。Tbl 内の変数の名前として指定します。AttributeName は文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、センシティブ属性が Tbl.Attribute として格納されている場合、"Attribute" として指定します。
センシティブ属性は、数値ベクトル、logical ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、または categorical ベクトルでなければなりません。
データ型: char | string
応答変数の名前。Tbl 内の変数の名前で指定します。ResponseVarName は文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、応答変数が Tbl.Y として格納されている場合、"Y" として指定します。
応答変数は、数値ベクトル、logical ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、または categorical ベクトルでなければなりません。データ型は Mdl の学習に使用した応答変数のデータ型と同じでなければなりません。
データ型: char | string
検証予測子データ。数値行列として指定します。X の各行は 1 つの観測値に、各列は 1 つの予測子変数に対応します。
X、attribute、およびYの行数は同じでなければなりません。Xの列の順序はMdlの学習に使用した予測子変数と同じでなければなりません。
データ型: single | double
センシティブ属性。数値列ベクトル、logical 列ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、または categorical 列ベクトルとして指定します。
X、attribute、およびYの行数は同じでなければなりません。attributeが文字配列の場合、配列の各行がセンシティブ属性のグループに対応していなければなりません。
データ型: single | double | logical | char | string | cell | categorical
クラス ラベル。数値列ベクトル、logical 列ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、または categorical 列ベクトルとして指定します。
X、attribute、およびYの行数は同じでなければなりません。Yが文字配列の場合、配列の各行がクラス ラベルに対応していなければなりません。Yのデータ型はMdlの学習に使用した応答変数のデータ型と同じでなければなりません。Mdlが分類モデル オブジェクトの場合、Yの各クラスはMdl.ClassNamesのクラスのサブセットでなければなりません。
データ型: single | double | logical | char | string | cell | categorical
スコアのしきい値。数値スカラーとして指定します。最大スコアが threshold の値より小さい各観測値のラベルが fairnessThresholder で調整されます。
Mdlまたはそのオブジェクト関数predictが事後確率の分類スコアを返す場合、範囲 [0.5, 1] のthresholdの値を指定します。Mdlのオブジェクト関数predictが範囲 (–∞,∞) の分類スコアを返す場合、非負のthresholdの値を指定します。
データ型: single | double
名前と値の引数
オプションの引数のペアを Name1=Value1,...,NameN=ValueN として指定します。ここで、Name は引数名で、Value は対応する値です。名前と値の引数は他の引数の後に指定しなければなりませんが、ペアの順序は重要ではありません。
例: fairnessThresholder(Mdl,Tbl,"Gender","Smoker",BiasMetric="spd",BiasMetricRange=[–0.1 0.1]) は、センシティブ属性 Gender の非参照グループの統計的均一性差が範囲 [–0.1, 0.1] になるスコアのしきい値を見つけるように指定します。
しきい値の最適化で公平性の制約として使用するバイアス メトリクス。次の表のメトリクス名のいずれかとして指定します。
| メトリクス名 | 説明 |
|---|---|
"DisparateImpact" または "di" (既定の設定) | 差異の影響 (DI) |
"AverageAbsoluteOddsDifference" または "aaod" | 平均絶対オッズ差 (AAOD) |
"EqualOpportunityDifference" または "eod" | 機会均等差 (EOD) |
"StatisticalParityDifference" または "spd" | 統計的均一性差 (SPD) |
バイアス メトリクスの定義の詳細については、バイアス メトリクスを参照してください。
関数 fairnessThresholder は、非参照グループ (つまり ReferenceGroups の補数) のバイアス メトリクスを計算し、値がバイアス メトリクスの範囲 (BiasMetricRange) に収まっているかどうかをチェックします。
例: BiasMetric="spd"
例: BiasMetric="EqualOpportunityDifference"
データ型: char | string
しきい値の最適化で制約として使用するバイアス メトリクスの範囲。2 要素の数値ベクトルとして指定します。次の表に、各バイアス メトリクスについて、サポートされるバイアス メトリクスの値と既定のバイアス メトリクスの範囲を示します。
| メトリクス名 | サポートされるバイアス メトリクスの値 | BiasMetricRange の既定値 |
|---|---|---|
"DisparateImpact" または "di" | [0, ∞) | [0.8, 1.25] |
"AverageAbsoluteOddsDifference" または "aaod" | [0, 1] | [0, 0.05] |
"EqualOpportunityDifference" または "eod" | [–1, 1] | [–0.05, 0.05] |
"StatisticalParityDifference" または "spd" | [–1, 1] | [–0.05, 0.05] |
関数 fairnessThresholder は、非参照グループ (つまり ReferenceGroups の補数) のバイアス メトリクス (BiasMetric) を計算し、値がバイアス メトリクスの範囲に収まっているかどうかをチェックします。
例: BiasMetricRange=[-0.1 0.1]
データ型: single | double
バイアス メトリクスの計算で参照グループとして使用するセンシティブ属性のグループ。スカラーまたはベクトルとして指定します。既定では、fairnessThresholder は、検証データ内の最も頻繁に出現するグループを参照グループとして選択します。ReferenceGroups の値の各要素は、センシティブ属性と同じデータ型でなければなりません。
この関数では、参照グループと非参照グループを含む二項のセンシティブ属性用に設計された手法を使用します。非参照グループは、ReferenceGroups の値に含まれていないセンシティブ属性のグループで形成されます。
例: ReferenceGroups=categorical(["Husband","Unmarried"])
データ型: single | double | logical | char | string | cell | categorical
陽性クラスのラベル。数値スカラー、logical スカラー、文字ベクトル、string スカラー、1 つの文字ベクトルを含む cell 配列、または categorical スカラーとして指定します。PositiveClass のデータ型は真のクラス ラベルの変数と同じでなければなりません。
PositiveClass の既定値は、バイナリ ラベルの 2 番目のクラスです。クラスの順序は、真のクラス ラベルの変数に対して関数 unique で "sorted" オプションを指定して返される順序になります。
例: PositiveClass=categorical(">50K")
データ型: single | double | logical | char | string | cell | categorical
しきい値の最適化で最小化する損失。"classiferror"、"classifcost"、または関数ハンドルとして指定します。
次の表は、使用できる損失関数の一覧です。対応する文字ベクトルまたは string スカラーを使用して、いずれかを指定します。
| 値 | 説明 | 式 |
|---|---|---|
"classifcost" | 観測誤分類コスト | |
"classiferror" | 10 進数の誤分類率 | |
C は誤分類コスト行列、I はインジケーター関数です。
Mdlが分類モデル オブジェクトの場合、誤分類コスト行列はMdlのCostプロパティに対応します。Mdlが関数ハンドルの場合は、C は既定のコスト行列であり、"classifcost"と"classiferror"の損失の値は同じです。yj は観測値 j に対する真のクラス ラベル、yj はクラス kj に属しています。
は観測値 j に対して最大の予測スコアをもつクラス ラベル、 はクラス に属しています。
n は検証データ セット内の観測値の数です。
カスタム損失関数を指定するには、Mdl を分類モデル オブジェクトとして指定しなければなりません。関数ハンドル表記 (@) を使用します。関数の形式は次のとおりです。lossfun
lossvalue = lossfun(Class,Score,Cost)
出力引数
lossvalueはスカラーです。関数名 (
lossfun) を指定します。Classはn行K列の logical 行列であり、対応する観測値が属するクラスを各行が示します。nはTblまたはX内の観測値の数、Kは応答変数内の異なるクラスの数です。列の順序はMdl.ClassNamesのクラスの順序に対応します。各行について観測値pがクラスqに属する場合はClass(p,q) = 1を設定することにより、Classを作成します。行pの他のすべての要素を0に設定します。Scoreは、分類スコアのn行K列の行列です。列の順序はMdl.ClassNamesのクラスの順序に対応します。Scoreは分類スコアの行列で、predictの出力と同様です。Costは、誤分類コストの、K行K列の数値行列です。たとえば、Cost = ones(K) – eye(K)は、正しい分類のコストとして0を、誤分類のコストとして1を指定します。
例: LossFun="classifcost"
データ型: char | string | function_handle
しきい値の最適化で評価するしきい値の最大数。正の整数として指定します。fairnessThresholder は、min(n,MaxNumThresholds) 個のしきい値のベクトルを最適化プロセスの一部として使用します。ここで、n は検証データ内の観測値の数です。
例: MaxNumThresholds=250
データ型: single | double
プロパティ
この プロパティ は読み取り専用です。
バイナリ分類器。完全またはコンパクトな分類モデル オブジェクトか関数ハンドルとして返されます。
この プロパティ は読み取り専用です。
センシティブ属性。変数名、数値列ベクトル、logical 列ベクトル、文字配列、文字ベクトルの cell 配列、または categorical 列ベクトルとして返されます。
table を使用して
fairnessThresholderオブジェクトを作成する場合、SensitiveAttributeはセンシティブ属性の名前になります。名前は文字ベクトルとして格納されます。行列を使用して
fairnessThresholderオブジェクトを作成する場合、SensitiveAttributeのサイズとデータ型はオブジェクトの作成に使用されるセンシティブ属性と同じになります。(string 配列は文字ベクトルの cell 配列として扱われます)。
データ型: single | double | logical | char | cell | categorical
この プロパティ は読み取り専用です。
参照グループとして使用するセンシティブ属性のグループ。スカラーまたはベクトルとして返されます。(string 配列は文字ベクトルの cell 配列として扱われます)。
名前と値の引数 ReferenceGroups によってこのプロパティが設定されます。
データ型: single | double | logical | char | cell | categorical
この プロパティ は読み取り専用です。
真のクラス ラベルの変数の名前。応答変数の名前を含む文字ベクトルとして返されます。(string スカラーは文字ベクトルとして扱われます。)
入力引数
ResponseVarNameを指定した場合、その値に応じてこのプロパティが決まります。入力引数
Yを指定した場合、このプロパティの値は'Y'になります。
データ型: char
この プロパティ は読み取り専用です。
陽性クラスのラベル。数値スカラー、logical スカラー、文字ベクトル、1 つの文字ベクトルを含む cell 配列、または categorical スカラーとして返されます。(string スカラーは文字ベクトルとして扱われます。)
名前と値の引数 PositiveClass によってこのプロパティが設定されます。
データ型: single | double | logical | char | cell | categorical
この プロパティ は読み取り専用です。
スコアのしきい値。数値スカラーとして返されます。このスコアのしきい値は、fairnessThresolder によって導出された最適なスコアのしきい値か入力引数 threshold の値になります。
ScoreThreshold プロパティは、元のモデルの予測が既に公平性の制約を満たしている場合やいずれの潜在的なスコアのしきい値も公平性の制約を満たさない場合は空になります。
データ型: single | double
この プロパティ は読み取り専用です。
非参照グループのバイアス メトリクスの値。数値スカラーとして返されます。非参照グループは、ReferenceGroups の値に含まれていないセンシティブ属性のグループで形成されます。
fairnessThresholder は、ScoreThreshold の値を使用して調整された検証データ セットの予測を使用してバイアス メトリクスの値を計算します。
BiasMetricValue プロパティは、元のモデルの予測が既に公平性の制約を満たしている場合やいずれの潜在的なスコアのしきい値も公平性の制約を満たさない場合は空になります。
データ型: double
この プロパティ は読み取り専用です。
バイアス メトリクスの範囲。2 要素の数値ベクトルとして返されます。
名前と値の引数 BiasMetricRange によってこのプロパティが設定されます。
データ型: single | double
この プロパティ は読み取り専用です。
検証分類損失。数値スカラーとして返されます。fairnessThresholder は、名前と値の引数 LossFun で指定された分類スコアを計算します。ScoreThreshold の値を使用して調整された検証データ セットの予測が関数で使用されます。
ValidationLoss プロパティは、元のモデルの予測が既に公平性の制約を満たしている場合やいずれの潜在的なスコアのしきい値も公平性の制約を満たさない場合は空になります。
データ型: double
例
バイナリ分類用の木アンサンブルに学習させ、センシティブ属性の各グループについての差異の影響を計算します。非参照グループの差異の影響の値を小さくするために、観測値を分類するスコアのしきい値を調整します。
データ census1994 を読み込みます。これには、データ セット adultdata とテスト データ セット adulttest が含まれています。このデータ セットは、個人の年収が $50,000 を超えるかどうかを予測するために使用できる、米国国勢調査局の人口統計情報から構成されています。adultdata の最初の数行をプレビューします。
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 = rmmissing(adultdata); adulttest = rmmissing(adulttest);
adultdata を学習セットと検証セットに分割します。観測値の 60% を学習セット trainingData に使用し、観測値の 40% を検証セット validationData に使用します。
rng("default") % For reproducibility c = cvpartition(adultdata.salary,"Holdout",0.4); trainingIdx = training(c); validationIdx = test(c); trainingData = adultdata(trainingIdx,:); validationData = adultdata(validationIdx,:);
学習データ セット trainingData を使用して木のブースティング アンサンブルに学習させます。table adultdata 内の変数名を使用して、応答変数、予測子変数、および観測値の重みを指定します。ランダム アンダーサンプリング ブースティングをアンサンブル集約法として使用します。
predictors = ["capital_gain","capital_loss","education", ... "education_num","hours_per_week","occupation","workClass"]; Mdl = fitcensemble(trainingData,"salary", ... PredictorNames=predictors, ... Weights="fnlwgt",Method="RUSBoost");
テスト データ セット adulttest 内の観測値について、給与の値を予測し、分類誤差を計算します。
labels = predict(Mdl,adulttest); L = loss(Mdl,adulttest)
L = 0.2080
テスト セットの観測値の約 80% について、給与の分類がモデルで正確に予測されています。
テスト セットのモデル予測を使用して、センシティブ属性 sex についての公平性メトリクスを計算します。特に、sex の各グループについての差異の影響を調べます。fairnessMetrics のオブジェクト関数 report と plot を使用して結果を表示します。
metricsResults = fairnessMetrics(adulttest,"salary", ... SensitiveAttributeNames="sex",Predictions=labels, ... ModelNames="Ensemble",Weights="fnlwgt"); metricsResults.PositiveClass
ans = categorical
>50K
metricsResults.ReferenceGroup
ans = 'Male'
report(metricsResults,BiasMetrics="DisparateImpact")ans=2×4 table
ModelNames SensitiveAttributeNames Groups DisparateImpact
__________ _______________________ ______ _______________
Ensemble sex Female 0.73792
Ensemble sex Male 1
plot(metricsResults,"DisparateImpact")
差異の影響の値は、非参照グループ (Female) について、そのグループの陽性クラスの値 (>50K) をもつ予測の比率を参照グループ (Male) の陽性クラスの値をもつ予測の比率で除算したものです。差異の影響の値は 1 に近くなるのが理想的です。
非参照グループの差異の影響の値が改善するか試すために、関数 fairnessThresholder を使用してモデル予測を調整できます。この関数は、検証データを使用して、公平性の範囲を満たしながら精度が最大になる最適なスコアのしきい値を探します。最適なしきい値を下回る臨界領域の観測値については、参照グループと非参照グループで公平性の制約が保たれるように関数でラベルが変更されます。既定では、この関数は非参照グループの差異の影響の値が範囲 [0.8,1.25] になるスコアのしきい値を見つけようとします。
fairnessMdl = fairnessThresholder(Mdl,validationData,"sex","salary")
fairnessMdl =
fairnessThresholder with properties:
Learner: [1×1 classreg.learning.classif.CompactClassificationEnsemble]
SensitiveAttribute: 'sex'
ReferenceGroups: Male
ResponseName: 'salary'
PositiveClass: >50K
ScoreThreshold: 1.6749
BiasMetric: 'DisparateImpact'
BiasMetricValue: 0.9702
BiasMetricRange: [0.8000 1.2500]
ValidationLoss: 0.2017
fairnessMdl は fairnessThresholder モデル オブジェクトです。アンサンブル モデル Mdl の関数 predict が返すスコアは事後確率ではないことに注意してください。スコアの範囲は であり、各観測値の最大スコアは 0 より大きくなります。最大スコアが新しいスコアのしきい値 (fairnessMdl.ScoreThreshold) より小さい観測値について、fairnessMdl オブジェクトの関数 predict で予測が調整されます。非参照グループの観測値の場合、関数はその観測値を陽性クラスに予測します。参照グループの観測値の場合、関数はその観測値を陰性クラスに予測します。これらの調整の結果として予測ラベルが常に変わるとは限りません。
新しいスコアのしきい値を使用してテスト セットの予測を調整し、分類誤差を計算します。
fairnessLabels = predict(fairnessMdl,adulttest); fairnessLoss = loss(fairnessMdl,adulttest)
fairnessLoss = 0.2064
新しい分類誤差は元の分類誤差と同程度です。
Mdl を使用して計算した元の予測と fairnessMdl を使用して計算した調整後の予測の 2 セットのテストの予測で、それらの差異の影響の値を比較します。
newMetricsResults = fairnessMetrics(adulttest,"salary", ... SensitiveAttributeNames="sex",Predictions=[labels,fairnessLabels], ... ModelNames=["Original","Adjusted"],Weights="fnlwgt"); newMetricsResults.PositiveClass
ans = categorical
>50K
newMetricsResults.ReferenceGroup
ans = 'Male'
report(newMetricsResults,BiasMetrics="DisparateImpact")ans=2×5 table
Metrics SensitiveAttributeNames Groups Original Adjusted
_______________ _______________________ ______ ________ ________
DisparateImpact sex Female 0.73792 1.0048
DisparateImpact sex Male 1 1
plot(newMetricsResults,"di")
調整後の予測を使用した場合の方が、非参照グループ (Female) の差異の影響の値が 1 に近くなっています。
サポート ベクター マシン (SVM) モデルに学習させ、センシティブ属性の各グループについての統計的均一性差 (SPD) を計算します。非参照グループの SPD の値を小さくするために、観測値を分類するスコアのしきい値を調整します。
100 人の患者の医療情報を含む patients データ セットを読み込みます。変数 Gender と Smoker を categorical 変数に変換します。1 と 0 の代わりに、Smoker と Nonsmoker というわかりやすいカテゴリ名を指定します。
load patients Gender = categorical(Gender); Smoker = categorical(Smoker,logical([1 0]), ... ["Smoker","Nonsmoker"]);
連続予測子 Diastolic と Systolic を含む行列を作成します。センシティブ属性として Gender、応答変数として Smoker を指定します。
X = [Diastolic,Systolic]; attribute = Gender; Y = Smoker;
データを学習セットと検証セットに分割します。半分の観測値を学習に使用し、半分の観測値を検証に使用します。
rng("default") % For reproducibility cv = cvpartition(Y,"Holdout",0.5); trainX = X(training(cv),:); trainAttribute = attribute(training(cv)); trainY = Y(training(cv)); validationX = X(test(cv),:); validationAttribute = attribute(test(cv)); validationY = Y(test(cv));
学習データでサポート ベクター マシン (SVM) バイナリ分類器に学習させます。モデルを当てはめる前に予測子を標準化します。学習させたモデルを使用してラベルを予測し、検証データ セットのスコアを計算します。
mdl = fitcsvm(trainX,trainY,Standardize=true); [labels,scores] = predict(mdl,validationX);
検証データ セットについて、センシティブ属性と応答変数の情報を 1 つのグループ化変数 groupTest に結合します。
groupTest = validationAttribute.*validationY; names = string(categories(groupTest))
names = 4×1 string
"Female Smoker"
"Female Nonsmoker"
"Male Smoker"
"Male Nonsmoker"
SVM モデルで誤分類される検証観測値を見つけます。
wrongIdx = (validationY ~= labels);
wrongX = validationX(wrongIdx,:);
names(5) = "Misclassified";検証データをプロットします。各点の色は、その観測値のセンシティブ属性のグループとクラス ラベルを示します。円で囲まれた点は、誤分類された観測値を示します。
figure hold on gscatter(validationX(:,1),validationX(:,2), ... validationAttribute.*validationY) plot(wrongX(:,1),wrongX(:,2), ... "ko",MarkerSize=8) legend(names) xlabel("Diastolic") ylabel("Systolic") title("Validation Data") hold off

モデル予測を使用して、センシティブ属性についての公平性メトリクスを計算します。特に、validationAttribute の各グループについての統計的均一性差 (SPD) を調べます。
metricsResults = fairnessMetrics(validationAttribute,validationY, ...
Predictions=labels);
metricsResults.ReferenceGroupans = 'Female'
metricsResults.PositiveClass
ans = categorical
Nonsmoker
report(metricsResults,BiasMetrics="StatisticalParityDifference")ans=2×4 table
ModelNames SensitiveAttributeNames Groups StatisticalParityDifference
__________ _______________________ ______ ___________________________
Model1 x1 Female 0
Model1 x1 Male -0.064412
figure
plot(metricsResults,"StatisticalParityDifference")
SPD の値は、非参照グループ (Male) において、センシティブ属性の値が Male の場合に患者が陽性クラス (Nonsmoker) になる確率とセンシティブ属性の値が Female の場合に患者が陽性クラスになる確率 (参照グループでの確率) の差です。SPD の値は 0 に近くなるのが理想的です。
非参照グループの SPD の値が改善するか試すために、関数 fairnessThresholder を使用してモデル予測を調整できます。この関数は、公平性の範囲を満たしながら精度が最大になるように最適なスコアのしきい値を探します。最適なしきい値を下回る臨界領域の観測値については、参照グループと非参照グループで公平性の制約が保たれるように関数でラベルが変更されます。既定では、SPD のバイアス メトリクスを使用する場合、この関数は非参照グループの SPD の値が範囲 [–0.05,0.05] になるスコアのしきい値を見つけようとします。
fairnessMdl = fairnessThresholder(mdl,validationX, ... validationAttribute,validationY, ... BiasMetric="StatisticalParityDifference")
fairnessMdl =
fairnessThresholder with properties:
Learner: [1×1 classreg.learning.classif.CompactClassificationSVM]
SensitiveAttribute: [50×1 categorical]
ReferenceGroups: Female
ResponseName: 'Y'
PositiveClass: Nonsmoker
ScoreThreshold: 0.5116
BiasMetric: 'StatisticalParityDifference'
BiasMetricValue: -0.0209
BiasMetricRange: [-0.0500 0.0500]
ValidationLoss: 0.1200
fairnessMdl は fairnessThresholder モデル オブジェクトです。
更新後の方が非参照グループの SPD の値が 0 に近いことに注目してください。
newNonReferenceSPD = fairnessMdl.BiasMetricValue
newNonReferenceSPD = -0.0209
新しいスコアのしきい値を使用して検証データの予測を調整します。fairnessMdl オブジェクトの関数 predict で、最大スコアがスコアのしきい値より小さい各観測値の予測が調整されます。非参照グループの観測値の場合、関数はその観測値を陽性クラスに予測します。参照グループの観測値の場合、関数はその観測値を陰性クラスに予測します。これらの調整の結果として予測ラベルが常に変わるとは限りません。
fairnessLabels = predict(fairnessMdl,validationX, ...
validationAttribute);予測が fairnessMdl で切り替えられた観測値を見つけます。
differentIdx = (labels ~= fairnessLabels);
differentX = validationX(differentIdx,:);
names(5) = "Switched Prediction";検証データをプロットします。各点の色は、その観測値のセンシティブ属性のグループとクラス ラベルを示します。四角で囲まれた点は、ラベルが fairnessThresholder モデルで切り替えられた観測値を示します。
figure hold on gscatter(validationX(:,1),validationX(:,2), ... validationAttribute.*validationY) plot(differentX(:,1),differentX(:,2), ... "ks",MarkerSize=8) legend(names) xlabel("Diastolic") ylabel("Systolic") title("Validation Data") hold off

関数 fairnessThresholder では、参照グループと非参照グループを含む二項のセンシティブ属性用に設計された手法を使用します。この例では、センシティブ属性に 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;
データを学習セット、検証セット、テスト セットに分割します。観測値を約 3 分の 1 ずつ使用して、それぞれのセットを作成します。
rng("default") cv1 = cvpartition(creditrating.Rating,"Holdout",1/3); tblNotForTest = creditrating(training(cv1),:); tblTest = creditrating(test(cv1),:); cv2 = cvpartition(tblNotForTest.Rating,"Holdout",1/2); tblTrain = tblNotForTest(training(cv2),:); tblValidation = tblNotForTest(test(cv2),:);
この例では、poor の格付けに対する good の格付けの比率が高い業種をセンシティブ属性 Industry の参照グループとします。学習データ セット tblTrain と関数 grpstats を使用して比率を計算します。
info = grpstats(tblTrain,["Industry","Rating"]); goodInfo = info(info.Rating == "good",1:3); poorInfo = info(info.Rating == "poor",1:3); goodToPoorRatio = goodInfo.GroupCount./poorInfo.GroupCount
goodToPoorRatio = 12×1
2.0000
1.5122
2.1212
1.3061
1.7778
2.5152
2.4118
1.9394
1.4186
1.1875
2.8846
2.1667
⋮
goodToPoorRatio の値が 2.5 より大きい業種を優良な業種と定義します。goodToPoorRatio の値が最も高い業種を最も優れた業種と見なします。
wellRatedIndustries = goodInfo.Industry(goodToPoorRatio > 2.5,:)
wellRatedIndustries = 2×1 categorical
6
11
maximumRatio = max(goodToPoorRatio); bestRatedIndustry = goodInfo.Industry(goodToPoorRatio == maximumRatio,:)
bestRatedIndustry = categorical
11
学習データを使用して、センシティブ属性についての公平性メトリクスを計算します。特に、Industy の各グループについての統計的均一性差 (SPD) を調べます。good の格付けを陽性クラスとして指定し、最も優れた業種 (11) を参照グループとして指定します。fairnessMetrics のオブジェクト関数 report と plot を使用して結果を表示します。
dataMetricsResults = fairnessMetrics(tblTrain,"Rating", ... SensitiveAttributeNames="Industry", ... PositiveClass="good",ReferenceGroup=bestRatedIndustry); report(dataMetricsResults,BiasMetrics="StatisticalParityDifference")
ans=12×3 table
SensitiveAttributeNames Groups StatisticalParityDifference
_______________________ ______ ___________________________
Industry 1 -0.075908
Industry 2 -0.14063
Industry 3 -0.062963
Industry 4 -0.1762
Industry 5 -0.10257
Industry 6 -0.027057
Industry 7 -0.035678
Industry 8 -0.08278
Industry 9 -0.15604
Industry 10 -0.19972
Industry 11 0
Industry 12 -0.058364
plot(dataMetricsResults,"StatisticalParityDifference")
SPD の値は、センシティブ属性の各グループ "g" について、センシティブ属性の値が "g" の場合に陽性クラス (good) になる確率とセンシティブ属性の値が参照グループの値 (11) の場合に陽性クラスになる確率の差です。SPD の値は 0 に近くなるのが理想的です。
箱ひげ図を使用して SPD の値の分布を可視化します。
boxchart(dataMetricsResults.BiasMetrics.StatisticalParityDifference) ylabel("Statistical Parity Difference") legend("Training Data")

SPD の値の中央値は約 –0.08 です。
学習データ セットを使用して二分木分類器に学習させます。学習させたモデルを使用してラベルを予測し、テスト データ セットで分類誤差を計算します。
predictorNames = ["WC_TA","RE_TA","EBIT_TA","MVE_BVTD","S_TA"]; treeMdl = fitctree(tblTrain,"Rating", ... PredictorNames=predictorNames); treePredictions = predict(treeMdl,tblTest); L = loss(treeMdl,tblTest)
L = 0.1107
関数 fairnessThresholder を使用してモデル予測を調整できます。この関数は、検証データを使用して、公平性の範囲を満たしながら精度が最大になる最適なスコアのしきい値を探します。名前と値の引数 ReferenceGroups を使用して、優良な業種 (6 および 11) を参照グループとして指定します。それ以外のすべての業種で非参照グループが形成されます。バイアス メトリクスを統計的均一性差、バイアス メトリクスの範囲を [–0.005,0.005] と指定します。これらの範囲は、センシティブ属性の個々の業種ではなく、それらをまとめた非参照グループの SPD の値に適用されることに注意してください。
fairnessMdl = fairnessThresholder(treeMdl,tblValidation, ... "Industry","Rating", ... PositiveClass="good",ReferenceGroups=wellRatedIndustries, ... BiasMetric="StatisticalParityDifference", ... BiasMetricRange=[-0.005 0.005])
fairnessMdl =
fairnessThresholder with properties:
Learner: [1×1 classreg.learning.classif.CompactClassificationTree]
SensitiveAttribute: 'Industry'
ReferenceGroups: [2×1 categorical]
ResponseName: 'Rating'
PositiveClass: 'good'
ScoreThreshold: 0.5444
BiasMetric: 'StatisticalParityDifference'
BiasMetricValue: 0.0034
BiasMetricRange: [-0.0050 0.0050]
ValidationLoss: 0.1198
fairnessMdl は fairnessThresholder モデル オブジェクトです。
新しいスコアのしきい値を使用してテスト セットの予測を調整し、分類誤差を計算します。
newPredictions = predict(fairnessMdl,tblTest); newL = loss(fairnessMdl,tblTest)
newL = 0.1183
新しい分類誤差は元の分類誤差と同程度です。
treeMdl を使用して計算した元の予測と fairnessMdl を使用して計算した調整後の予測の 2 セットのテストの予測で、それらの SPD の値を比較します。good の格付けを陽性クラスとして指定し、最も優れた業種 (11) を参照グループとして指定します。fairnessMetrics のオブジェクト関数 report と plot を使用して結果を表示します。
predMetricsResults = fairnessMetrics(tblTest,"Rating", ... SensitiveAttributeNames="Industry", ... Predictions=[treePredictions,newPredictions], ... PositiveClass="good", ... ModelNames=["Original Model","Adjusted Model"], ... ReferenceGroup=bestRatedIndustry); report(predMetricsResults,BiasMetric="DisparateImpact")
ans=12×5 table
Metrics SensitiveAttributeNames Groups Original Model Adjusted Model
_______________ _______________________ ______ ______________ ______________
DisparateImpact Industry 1 0.96499 0.95014
DisparateImpact Industry 2 1.0755 1.0634
DisparateImpact Industry 3 0.94643 0.94643
DisparateImpact Industry 4 1.0541 1.0392
DisparateImpact Industry 5 1.0262 1.0132
DisparateImpact Industry 6 1.0186 1.0186
DisparateImpact Industry 7 0.99692 0.96067
DisparateImpact Industry 8 1.077 1.077
DisparateImpact Industry 9 1.0392 1.0103
DisparateImpact Industry 10 1.0781 1.0635
DisparateImpact Industry 11 1 1
DisparateImpact Industry 12 1.0392 1.0225
plot(predMetricsResults,"spd")
箱ひげ図を使用して SPD の値の 2 つの分布を可視化します。
boxchart(predMetricsResults.BiasMetrics.StatisticalParityDifference, ... GroupByColor=predMetricsResults.BiasMetrics.ModelNames) ylabel("Statistical Parity Difference") legend

元のテスト セットの予測は、SPD の値が 0 に近く、中央値は約 0.02 です。調整後のテスト セットの予測は、SPD の値の中央値がそれよりもさらに少し 0 に近くなっています。
関数 fitglm を使用してロジスティック回帰モデルに学習させます。観測値を分類するスコアのしきい値を調整するために、そのモデルを fairnessThresholder に関数ハンドルを使用して入力として渡します。
100 人の患者の医療情報を含む patients データ セットを読み込みます。変数 Gender と Smoker をカテゴリカル変数に変換します。1 と 0 の代わりに、Smoker と Nonsmoker というわかりやすいカテゴリ名を指定します。
load patients Gender = categorical(Gender); Smoker = categorical(Smoker,logical([1 0]), ... ["Smoker","Nonsmoker"]);
連続予測子 Diastolic および Systolic、センシティブ属性 Gender、応答変数 Smoker を含む table を作成します。
Tbl = table(Diastolic,Systolic,Gender,Smoker);
データを学習セットと検証セットに分割します。半分の観測値を学習に使用し、半分の観測値を検証に使用します。
rng("default") % For reproducibility cv = cvpartition(Tbl.Smoker,"Holdout",0.5); trainTbl = Tbl(training(cv),:); validationTbl = Tbl(test(cv),:);
学習データ trainTbl と関数 fitglm を使用してロジスティック回帰モデルに学習させます。
modelspec = "Smoker ~ Diastolic + Systolic"; glmMdl = fitglm(trainTbl,modelspec,Distribution="binomial")
glmMdl =
Generalized linear regression model:
logit(P(Smoker='Nonsmoker')) ~ 1 + Diastolic + Systolic
Distribution = Binomial
Estimated Coefficients:
Estimate SE tStat pValue
________ _______ _______ _________
(Intercept) 116.98 44.939 2.6032 0.0092356
Diastolic -0.54261 0.21577 -2.5147 0.011913
Systolic -0.57999 0.28697 -2.0211 0.043268
50 observations, 47 error degrees of freedom
Dispersion: 1
Chi^2-statistic vs. constant model: 54, p-value = 1.89e-12
線形回帰モデルの方程式で示されているように、Nonsmoker が陽性クラスです。つまり、予測スコアが 0.5 より大きい観測値が非喫煙者として予測されます。
GeneralizedLinearModel オブジェクト glmMdl の関数 predict の関数ハンドルを作成します。
f = @(T) predict(glmMdl,T);
関数ハンドル f と検証データ validationTbl を使用して fairnessThresholder オブジェクトを作成します。この関数は、公平性の範囲を満たしながら精度が最大になるように最適なスコアのしきい値を探します。非参照グループの差異の影響の値が範囲 [0.9,1.1] になるようにバイアス メトリクスの範囲を指定します。
分類モデルを関数ハンドルとして渡すときは、陽性クラスを指定しなければなりません。
fairnessMdl = fairnessThresholder(f,validationTbl, ... "Gender","Smoker", ... BiasMetricRange=[0.9 1.1], ... PositiveClass=categorical("Nonsmoker"))
fairnessMdl =
fairnessThresholder with properties:
Learner: @(T)predict(glmMdl,T)
SensitiveAttribute: 'Gender'
ReferenceGroups: Female
ResponseName: 'Smoker'
PositiveClass: Nonsmoker
ScoreThreshold: 0.8087
BiasMetric: 'DisparateImpact'
BiasMetricValue: 0.9538
BiasMetricRange: [0.9000 1.1000]
ValidationLoss: 0.1600
omega = fairnessMdl.ScoreThreshold
omega = 0.8087
fairnessMdl は fairnessThresholder モデル オブジェクトです。スコアが範囲 (1–omega,omega) になる各観測値について、fairnessMdl オブジェクトの関数 predict で予測が調整されます。非参照グループ (Male) の観測値の場合、関数はその観測値を陽性クラス (Nonsmoker) に予測します。参照グループ (Female) の観測値の場合、関数はその観測値を陰性クラス (Smoker) に予測します。
新しいスコアのしきい値を使用して、データ セット Tbl 全体の予測を調整します。
fairnessLabels = predict(fairnessMdl,Tbl)
fairnessLabels = 100×1 categorical
Smoker
Nonsmoker
Smoker
Nonsmoker
Nonsmoker
Nonsmoker
Smoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Smoker
Nonsmoker
Smoker
Smoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Smoker
Smoker
Nonsmoker
Nonsmoker
Nonsmoker
Nonsmoker
Smoker
⋮
アルゴリズム
fairnessThresholder では、棄却オプションベース分類 (ROC) と呼ばれるバイアス軽減の後処理手法を使用しています。この手法は、判定境界の近くの観測値でバイアスが生じるという前提に基づくものです。このバイアスに対する補正として、予測クラスについての分類スコアが低い観測値の予測がアルゴリズムで調整されます。
fairnessThresholder は、次の方法で最適なスコアのしきい値を探します。
m 個の潜在的なスコアのしきい値のベクトルを作成します。ここで、m は検証データ内の観測値の数と
MaxNumThresholdsの値のうちの小さい方です。それぞれの潜在的なスコアのしきい値は、検証データ内の観測値についての最大スコアのセットの分位数であり、関数quantileを使用して計算されます。それぞれの潜在的なスコアのしきい値について、最大スコアがスコアのしきい値より小さい各観測値の予測を調整します。非参照グループの観測値の場合、関数はその観測値を陽性クラス (
PositiveClass) に予測します。参照グループ (ReferenceGroups) の観測値の場合、関数はその観測値を陰性クラスに予測します。次に、非参照グループの公平性メトリクス (
BiasMetric) の値を計算します。メトリクスの値がメトリクスの範囲 (BiasMetricRange) に収まっていれば、そのしきい値は選択の候補になります。そうでない場合、そのスコアのしきい値が棄却されます。スコアのしきい値の候補から分類精度が最大になるものを選択します。
詳細については、[1]を参照してください。
元のモデルの予測が既に公平性の制約を満たしている場合やいずれの潜在的なスコアのしきい値も公平性の制約を満たさない場合、関数は警告を返します。
fairnessThresholder は、NaN、'' (空の文字ベクトル)、"" (空の string)、<missing>、および <undefined> の要素を欠損データとして扱います。センシティブ属性および応答変数の欠損値に対応するデータの行は削除されます。ただし、検証予測子データ X または Tbl の欠損値の処理は、モデル (Mdl) によって異なります。
参照
[1] Kamiran, Faisal, Asim Karim, and Xiangliang Zhang. "Decision Theory for Discrimination-Aware Classification." 2012 IEEE 12th International Conference on Data Mining: 924-929.
バージョン履歴
R2023a で導入
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)