Main Content

fairnessWeights

バイナリ分類の公平性のために観測値を再重み付け

R2022b 以降

    説明

    weights = fairnessWeights(Tbl,AttributeName,ResponseVarName) は、データ セット Tbl のセンシティブ属性 AttributeName と応答変数 ResponseVarName を使用して観測値を再重み付けします。センシティブ属性のグループと応答変数のクラス ラベルのすべての組み合わせについて、それぞれの重みの値が計算されます。その後、関数によって Tbl 内の各観測値に対応する重みが割り当てられます。返されるベクトル weights により、センシティブ属性のグループ間に公平性が導入されます。詳細については、アルゴリズムを参照してください。

    weights = fairnessWeights(Tbl,AttributeName,Y) は、応答変数 Y のクラス ラベルを使用して公平性の重みを計算します。

    weights = fairnessWeights(attribute,Y) は、attribute で指定されたセンシティブ属性と応答変数 Y を使用して公平性の重みを計算します。

    weights = fairnessWeights(___,Weights=initialWeights) は、前の構文におけるいずれかの入力引数の組み合わせを使用して、公平性の重みの計算前に観測値の重み initialWeights を使用するように指定します。これらの初期の重みは、想定されるクラス分布など、センシティブ属性に無関係な何らかのデータ セットの側面を取得するために一般に使用されます。

    すべて折りたたむ

    公平性の重みを計算します。その後、グループ化された散布図を使用して、公平性の重みを既定の観測値の重みと比較します。

    患者の拡張期および収縮期の血圧の値に基づいて患者が喫煙者であるかどうかを予測するバイナリ分類器を作成するとします。さらに、モデル予測が患者の性別に依存しないように独立させます。モデルに学習させる前に、公平性の重みを使用することで喫煙状況の予測に対する性別状況の影響を軽減できます。

    100 人の患者の医療情報を含む patients データ セットを読み込みます。変数 GenderSmokercategorical 変数に変換します。10 の代わりに、SmokerNonsmoker というわかりやすいカテゴリ名を指定します。

    load patients
    Gender = categorical(Gender);
    Smoker = categorical(Smoker,logical([1 0]), ...
        ["Smoker","Nonsmoker"]);

    変数 DiastolicSystolic に加え、変数 GenderSmoker を使用して table を作成します。

    tbl = table(Diastolic,Gender,Smoker,Systolic)
    tbl=100×4 table
        Diastolic    Gender     Smoker      Systolic
        _________    ______    _________    ________
    
           93        Male      Smoker         124   
           77        Male      Nonsmoker      109   
           83        Female    Nonsmoker      125   
           75        Female    Nonsmoker      117   
           80        Female    Nonsmoker      122   
           70        Female    Nonsmoker      121   
           88        Female    Smoker         130   
           82        Male      Nonsmoker      115   
           78        Male      Nonsmoker      115   
           86        Female    Nonsmoker      118   
           77        Female    Nonsmoker      114   
           68        Female    Nonsmoker      115   
           74        Male      Nonsmoker      127   
           95        Male      Smoker         130   
           79        Female    Nonsmoker      114   
           92        Male      Smoker         130   
          ⋮
    
    

    センシティブ属性 Gender と二項応答変数 Smoker についての公平性の重みを計算し、公平性の重みを tbl に追加します。

    fairWeights = fairnessWeights(tbl,"Gender","Smoker");
    tbl.Weights = fairWeights;

    性別と喫煙状況のそれぞれの組み合わせについての公平性の重みを表示します。

    tblstats = grpstats(tbl,["Gender","Smoker"],@(x)unique(x), ...
        DataVars="Weights", ...
        VarNames=["Gender","Smoker","NumObservations","FairnessWeight"])
    tblstats=4×4 table
                            Gender     Smoker      NumObservations    FairnessWeight
                            ______    _________    _______________    ______________
    
        Female_Smoker       Female    Smoker             13               1.3862    
        Female_Nonsmoker    Female    Nonsmoker          40               0.8745    
        Male_Smoker         Male      Smoker             21              0.76095    
        Male_Nonsmoker      Male      Nonsmoker          26               1.1931    
    
    

    公平性の重みの計算は、tblstats の出力を使用して複製できます。たとえば、女性の喫煙者のグループについて、公平性の重みを直接計算します。

    numSmoker = sum(tblstats.NumObservations([1 3]));
    numTotal = sum(tblstats.NumObservations);
    numFemale = sum(tblstats.NumObservations([1 2]));
    numFemaleSmoker = tblstats.NumObservations(1);
    
    pIdealFemaleSmoker = (numSmoker/numTotal)*(numFemale/numTotal)
    pIdealFemaleSmoker = 0.1802
    
    pObservedFemaleSmoker = numFemaleSmoker/numTotal
    pObservedFemaleSmoker = 0.1300
    
    weightFemaleSmoker = pIdealFemaleSmoker/pObservedFemaleSmoker
    weightFemaleSmoker = 1.3862
    

    このグループでは、理想的な確率 pIdealFemaleSmoker が観測確率 pObservedFemaleSmoker よりも大きくなっています。この結果は、女性患者の喫煙者のクラスについて、元のデータ セットに負のバイアスがあることを示しています。

    グループ化された散布図を使用して公平性の重みを可視化します。公平性の重みがない場合、すべての観測値の重みが既定で同じになります。

    markSize = 20;
    
    tiledlayout(1,2)
    nexttile
    gscatter(Diastolic,Systolic,Gender.*Smoker,[],[], ...
        markSize)
    legend(Location="southoutside")
    title("Original Observations")
    nexttile
    gscatter(Diastolic,Systolic,Gender.*Smoker,[],[], ...
        markSize*tblstats.FairnessWeight)
    legend(Location="southoutside")
    title("Weighted Observations")

    Figure contains 2 axes objects. Axes object 1 with title Original Observations, xlabel Diastolic, ylabel Systolic contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Female Smoker, Female Nonsmoker, Male Smoker, Male Nonsmoker. Axes object 2 with title Weighted Observations, xlabel Diastolic, ylabel Systolic contains 4 objects of type line. One or more of the lines displays its values using only markers These objects represent Female Smoker, Female Nonsmoker, Male Smoker, Male Nonsmoker.

    重み付けしたスキームでは、女性の喫煙者と男性の非喫煙者の観測値の重みが元のスキームよりも大きくなっています。

    観測値に対する公平性の重みの影響を調べるために、Gender の各グループについて、公平性の重みを適用した後の統計的均一性差 (SPD) を求めます。データ セットまたはバイナリ分類モデルのセンシティブ属性についてのバイアス メトリクスとグループ メトリクスを計算する関数fairnessMetricsを使用します。

    metrics = fairnessMetrics(tbl,"Smoker", ...
        SensitiveAttributeNames="Gender",Weights="Weights");
    metrics.PositiveClass
    ans = categorical
         Nonsmoker 
    
    
    report(metrics,BiasMetrics="StatisticalParityDifference")
    ans=2×3 table
        SensitiveAttributeNames    Groups    StatisticalParityDifference
        _______________________    ______    ___________________________
    
                Gender             Female                      0        
                Gender             Male              -6.6613e-16        
    
    

    センシティブ属性の各グループの SPD がほぼ 0 になっています。この結果は、公平性の重みにより、女性患者に対する女性の非喫煙者の比率が男性患者に対する男性の非喫煙者の比率と同じになったことを示しています。

    これで、公平性の重みを使用してバイナリ分類器に学習させることができます。たとえば、木分類器に学習させます。

    tree = fitctree(tbl,"Smoker",Weights="Weights")
    tree = 
      ClassificationTree
               PredictorNames: {'Diastolic'  'Gender'  'Systolic'}
                 ResponseName: 'Smoker'
        CategoricalPredictors: 2
                   ClassNames: [Smoker    Nonsmoker]
               ScoreTransform: 'none'
              NumObservations: 100
    
    
    

    公平性の重みを使用してバイナリ分類器に学習させた場合に予測がどのように変わるかを調べます。特に、予測の差異の影響と精度について比較します。

    学習データ 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 人の人口統計情報が格納されています。最後の列 salary は個人の年収が $50,000 以下か $50,000 を超えるかを示します。

    adultdataadulttest から欠損値を含む観測値を削除します。

    adultdata = rmmissing(adultdata);
    adulttest = rmmissing(adulttest);

    学習セット adultdata を使用してニューラル ネットワーク分類器に学習させます。応答変数として salary、観測値の重みとして fnlwgt を指定します。モデルに学習させる前に予測子変数を標準化します。モデルに学習させた後、テスト セット adulttest の観測値の給与 (クラス ラベル) を予測します。

    rng("default") % For reproducibility
    mdl = fitcnet(adultdata,"salary",Weights="fnlwgt", ...
        Standardize=true);
    labels = predict(mdl,adulttest);

    センシティブ属性 race についての公平性の重みを計算します。初期の観測値の重み fnlwgt を使用して公平性の重みの計算を調整します。初期の観測値の重みの代わりに調整後の公平性の重みを格納する新しい table newadultdata を作成します。

    fw = fairnessWeights(adultdata,"race","salary", ...
        Weights="fnlwgt");
    newadultdata = adultdata;
    newadultdata.fnlwgt = fw;

    mdl と同じタイプのニューラル ネットワーク分類器に今度は調整後の公平性の重みを使用して学習させます。前と同じように、テスト セット adulttest の観測値の給与 (クラス ラベル) を予測します。

    rng("default") % For reproducibility
    newMdl = fitcnet(newadultdata,"salary",Weights="fnlwgt", ...
        Standardize=true);
    newLabels = predict(newMdl,adulttest);

    元のモデル (mdl) による予測と公平性の重みを使用して学習させたモデル (newMdl) による予測について、差異の影響の値を比較します。差異の影響は、センシティブ属性のグループごとに、そのグループの陽性クラスの値をもつ予測の比率 (pg+) を参照グループの陽性クラスの値をもつ予測の比率 (pr+) で除算したものです。理想的な分類器による予測では、各グループの pg+pr+ に近くなります (つまり、差異の影響の値が 1 に近くなります)。

    関数fairnessMetricsを使用して、mdl による予測と newMdl による予測の差異の影響の値を計算します。観測値の重みを含めるように指定します。オブジェクト関数 report を使用して、evaluator オブジェクトに格納された差異の影響などのバイアス メトリクスを表示できます。

    evaluator = fairnessMetrics(adulttest,"salary", ...
        SensitiveAttributeNames="race",Predictions=[labels,newLabels], ...
        Weights="fnlwgt",ModelNames=["Original Model","New Model"]);
    evaluator.PositiveClass
    ans = categorical
         >50K 
    
    
    evaluator.ReferenceGroup
    ans = 
    'White'
    
    report(evaluator,BiasMetrics="DisparateImpact")
    ans=5×5 table
            Metrics        SensitiveAttributeNames          Groups          Original Model    New Model
        _______________    _______________________    __________________    ______________    _________
    
        DisparateImpact             race              Amer-Indian-Eskimo        0.2066         0.49699 
        DisparateImpact             race              Asian-Pac-Islander        1.1909          1.2503 
        DisparateImpact             race              Black                    0.45908         0.69805 
        DisparateImpact             race              Other                    0.33573         0.84832 
        DisparateImpact             race              White                          1               1 
    
    

    mdl による予測について、いくつかの差異の影響の値が 1 をはるかに下回っており、これらは陽性クラス >50K とセンシティブ属性 race を基準とする予測のバイアスを示しています。mdl による予測の差異の影響の値に比べ、newMdl による予測の差異の影響のほとんどの値が 1 に近くなっています。

    オブジェクト関数 plot で返される棒グラフを使用して、差異の影響の値を視覚的に比較します。

    plot(evaluator,"DisparateImpact")
    legend(Location="southwest")

    Figure contains an axes object. The axes object with title Disparate Impact, xlabel Fairness Metric Value, ylabel race contains 2 objects of type bar. These objects represent Original Model, New Model.

    公平性の重みにより、差異の影響のメトリクスに関しては、テスト セットに対するモデル予測が改善しているように見えます。

    公平性の重みがモデル予測の精度にマイナスの影響を与えていないかどうかをチェックします。2 つのモデル mdlnewMdl について、テスト セットの予測の精度を計算します。

    accuracy = 1-loss(mdl,adulttest,"salary")
    accuracy = 0.8432
    
    newAccuracy = 1-loss(newMdl,adulttest,"salary")
    newAccuracy = 0.8434
    

    テスト セットの精度について、公平性の重みを使用して学習させたモデル (newMdl) でも公平性の重みなしで学習させたモデル (mdl) と同等の精度になっています。

    入力引数

    すべて折りたたむ

    データ セット。table として指定します。Tbl の各行は 1 つの観測値に対応し、各列は 1 つの変数に対応します。関数 fairnessWeights で table を使用する場合は、table にセンシティブ属性を含める必要があります。クラス ラベル (ResponseVarName) や観測値の重み (initialWeights) を格納する追加の変数も 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 ベクトルでなければなりません。

    データ型: char | string

    応答変数。数値ベクトル、logical ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、または categorical ベクトルとして指定します。

    • Y が文字配列の場合、配列の各行がクラス ラベルに対応していなければなりません。

    • Y の長さは Tbl の行数または attribute の長さと等しくなければなりません。

    データ型: single | double | logical | char | string | cell | categorical

    センシティブ属性。数値列ベクトル、logical 列ベクトル、文字配列、string 配列、文字ベクトルの cell 配列、または categorical 列ベクトルとして指定します。

    • attribute が配列の場合、配列の各行がセンシティブ属性のグループに対応していなければなりません。

    • attributeY は同じ長さでなければなりません。

    データ型: single | double | logical | char | string | cell | categorical

    観測値の重み。非負の列ベクトルまたは Tbl 内の変数の名前として指定します。initialWeights の長さは Tbl または attribute の観測値の数と等しくなければなりません。

    データ セット Tbl を使用する場合、initialWeights は数値ベクトルが格納されている Tbl 内の変数の名前にすることができます。この場合、initialWeights は文字ベクトルまたは string スカラーとして指定しなければなりません。たとえば、初期の重みのベクトル WTbl.W として格納されている場合、"W" として指定します。

    初期の重みは公平性の重みの調整に使用されます。詳細については、アルゴリズムを参照してください。

    データ型: single | double | char | string

    出力引数

    すべて折りたたむ

    公平性の重み。各行が観測値に対応する非負の列ベクトルとして返されます。名前と値の引数 Weights を使用して、これらの重みを適切な学習関数に渡すことができます。例については、公平性の重みについての理解と可視化を参照してください。

    センシティブ属性、クラス ラベル、または初期の重みに欠損がある観測値については、公平性の重みとして 0 が返されます。NaN、空の文字ベクトル ('')、空の string ("")、<missing>、および <undefined> の要素が欠損値として扱われます。

    公平性の重みの計算方法の詳細については、アルゴリズムを参照してください。

    アルゴリズム

    クラス k 内のセンシティブ属性 g をもつ観測値を x とします。初期の重み (initialWeights) を指定しない場合、関数 fairnessWeights が観測値に割り当てる公平性の重みは fw(x)=p˜gkp^gk=(ngngk)(nkn) になります。

    • ng はセンシティブ属性 g をもつ観測数です。

    • nk はクラス k 内の観測数です。

    • ngk はクラス k 内のセンシティブ属性 g をもつ観測数です。

    • n は、観測の合計数です。

    • p˜gk=(ngn)(nkn) は、観測値がセンシティブ属性 g をもち、かつクラス k に属する理想的な確率です。つまり、観測値がセンシティブ属性 g をもつ確率と観測値がクラス k に属する確率の積になります。この方程式はセンシティブ属性と応答変数が独立している場合に真の確率となることに注意してください。

    • p^gk=(ngkn) は、観測値がセンシティブ属性 g をもち、かつクラス k に属する観測確率です。

    詳細については、[1]を参照してください。

    初期の重みを指定した場合、関数は観測数の代わりに初期の重みの合計を使用して fw(x) を計算します。たとえば、関数は ng を使用する代わりに、センシティブ属性 g をもつ観測値の初期の重みの合計を使用します。

    参照

    [1] Kamiran, Faisal, and Toon Calders. “Data Preprocessing Techniques for Classification without Discrimination.” Knowledge and Information Systems 33, no. 1 (October 2012): 1–33. https://doi.org/10.1007/s10115-011-0463-8.

    バージョン履歴

    R2022b で導入