【公平性】等化オッズを用いた機械学習
1. イントロダクション
近年、機械学習モデルは多くの分野で活用され、その応用範囲は日々拡大しています。しかし、これらのモデルが常に公平であるとは限りません。むしろ、訓練データに含まれる偏りが、モデルの予測結果に偏りをもたらし、特定のグループが不利な扱いを受ける可能性が指摘されています。このような問題を解決するために、公平性を考慮した機械学習の手法が注目されており、その中でも特に「equalized odds(等化オッズ)」という指標が注目を集めています。
本記事では、equalized oddsの数式的な解説とともに、実際のデータを用いた分析を通じて、この手法がどのようにモデルの公平性を向上させるのかを考察していきます。さらに、equalized oddsを適用した場合としなかった場合の結果を比較し、機械学習モデルにおける公平性と精度のトレードオフについても検討します。
公平性については、以下の記事もご参照ください。
AIにおける公平性とは何か?対処方法についても解説 – Controudit AI | AI監査を見据えたAIガバナンスツール
目次
- イントロダクション
- 公平性を考慮した機械学習の重要性
- 2-1. 機械学習とバイアスの問題
- 2-2. 公平性の指標としてのequalized odds
- equalized oddsの数式的な解説
- 3-1. equalized oddsの定義
- 3-2. 数式による表現
- 3-3. 異なるグループ間の公平性の評価
- 公開データを使ったequalized oddsの効果測定
- 4-1. 使用するデータセットの概要
- 4-2. equalized oddsを適用しない場合の分析
- 4-3. equalized oddsを適用した場合の分析
- 4-4. equalized oddsの適用有無の結果比較
- 4-5. 考察
- まとめと今後の展望
2. 公平性を考慮した機械学習の重要性
2-1. 機械学習とバイアスの問題
機械学習モデルは、訓練データに基づいて予測を行いますが、そのデータが人為的または社会的な偏りを含んでいる場合、モデルの予測も偏ったものとなる可能性があります。たとえば、過去の雇用データが男性優位である場合、モデルがそのデータを基に予測を行うと、女性候補者に対して不利な結果を導き出す可能性があります。こうしたバイアスは、機械学習の普及に伴い、社会的に重大な問題となりつつあります。
2-2. 公平性の指標としてのequalized odds
公平性を測る指標として、いくつかのアプローチがありますが、その中でもequalized oddsは、モデルの予測結果が異なるグループ間で均等であることを求める手法です。具体的には、ある属性(例:性別、年齢、人種)に基づくグループ間で、予測が真陽性および偽陰性率において等しいことを求めます。この手法は、特定のグループが不利な扱いを受けないようにするための有効なアプローチです。
3. equalized oddsの数式的な解説
3-1. equalized oddsの定義
equalized oddsは、以下の条件を満たす場合に成立します。すなわち、特定のアウトカムに対するモデルの予測が、異なるグループ間で同じ確率で真陽性(True Positive)および偽陰性(False Negative)を生成することです。
3-2. 数式による表現
数式で表すと、equalized oddsは次のように定義されます。以下の数式の等号条件が満たされるとき、モデルは異なるグループ間で均等なオッズを持つとされます。
\[P(\hat{Y} = 1 | A = 0, y = 1 ) = P(\hat{Y} = 1 | A = 1, y = 1 ) \]\[P(\hat{Y} = 0 | A = 0, y = 0 ) = P(\hat{Y} = 1 | A = 1, y = 0 ) \]
変数 | 内容 |
---|---|
\[\hat{Y}\] | モデルの予測 |
\[Y\] | 実際のラベル |
\[A\] | グループを示す属性(例:性別や人種など) |
3-3. 異なるグループ間の公平性の評価
equalized oddsを用いることで、モデルが特定のグループに対して不利な予測をしていないかどうかを確認することができます。この指標を用いることで、モデルが公平であるかどうかを定量的に評価し、公平性を向上させるための改善策を講じることが可能となります。
4. 公開データを使ったequalized oddsの効果測定
以下で、データセットの概要説明、およびequalized oddsを適用した場合と適用しない場合について、実際のPythonコードを見せながら解説していきたいと思います。
4-1.使用するデータセットの概要
ここでは、一般的に利用可能な「Adult」データセットを使用して、equalized oddsを適用するケーススタディを行います。このデータセットは、収入が50,000ドル以上かどうかを予測するタスクに使用され、性別や人種などの属性が含まれており、公平性の分析に適しています。今回は、性別のフラグ内容が、収入を50,000ドル以上かどうか予測するタスクに影響を与えていないか、与えているならばequalized oddsを使うことで影響を低減させられるかを確認していきます。
データセットの構成
データセットには、32,561行のトレーニングデータと16,281行のテストデータが含まれています。各行は1人の個人のデータを表しています。
特徴量(属性):
- 年齢 (age): 被験者の年齢
- 職業 (workclass): 職業の種類(民間、政府職員、自営業など)
- 最終学歴 (education): 学歴の最終到達点
- 学歴の年数 (education-num): 学歴の年数(数値データ)
- 婚姻状況 (marital-status): 婚姻の状況(既婚、未婚、離婚など)
- 職業分類 (occupation): 職業の詳細分類(管理職、技術職、営業など)
- 親族関係 (relationship): 家族内での役割(妻、夫、自身、子供など)
- 人種 (race): 人種(白人、黒人、アジア系など)
- 性別 (sex): 性別(男性、女性)
- 資産収入 (capital-gain): 資本収益(数値データ)
- 資産損失 (capital-loss): 資本損失(数値データ)
- 週当たり労働時間 (hours-per-week): 週当たりの労働時間(数値データ)
- 出身国 (native-country): 出身国
ターゲット変数: 年収が50,000ドルを超えるかどうか(>50K
または <=50K
)
サンプルコード
以下のコードでは、訓練データとテストデータの分離、およびデータの確認を実施しています。
import pandas as pd
import numpy as np
from sklearn.model_selection import train_test_split
from xgboost import XGBClassifier
from sklearn.metrics import accuracy_score, confusion_matrix, f1_score
from fairlearn.metrics import demographic_parity_difference, equalized_odds_difference
from fairlearn.reductions import EqualizedOdds, ExponentiatedGradient
import warnings
warnings.simplefilter('ignore')
# データの読み込み
url = "https://archive.ics.uci.edu/ml/machine-learning-databases/adult/adult.data"
columns = ["age", "workclass", "fnlwgt", "education", "education-num", "marital-status",
"occupation", "relationship", "race", "sex", "capital-gain", "capital-loss",
"hours-per-week", "native-country", "income"]
data = pd.read_csv(url, names=columns, na_values=" ?", skipinitialspace=True)
data = data.dropna()
# データセットの確認
print(pd.pivot_table(data, index="sex", columns="income", aggfunc="count", values="age"))
# 特徴量とラベルの定義
X = data.drop("income", axis=1)
y = (data["income"] == ">50K").astype(int)
# カテゴリ変数のエンコード
X = pd.get_dummies(X)
# トレーニングとテストの分割
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=42)
# データ確認用
train_viz = pd.DataFrame(np.vstack([X_train["sex_Male"], y_train.values]).T, columns=["sex_Male", ">50k"])
test_viz = pd.DataFrame(np.vstack([X_test["sex_Male"], y_test.values]).T, columns=["sex_Male", ">50k"])
# データセットの確認
print( train_viz.groupby(["sex_Male"])[">50k"].value_counts() )
print( test_viz.groupby(["sex_Male"])[">50k"].value_counts() )
データの分離結果
5万ドル未満 | 5万ドル以上 | |
---|---|---|
男性 | 15,128 | 6,662 |
女性 | 9,592 | 1,179 |
5万ドル未満 | 5万ドル以上 | |
---|---|---|
男性 | 10,571 | 4,688 |
女性 | 6,694 | 839 |
5万ドル未満 | 5万ドル以上 | |
---|---|---|
男性 | 4,557 | 1,974 |
女性 | 2,898 | 340 |
4-2. equalized oddsを適用しない場合
まず、equalized oddsを適用せずにモデルを訓練し、予測結果を確認します。通常のロジスティック回帰モデルを使用し、性別や人種を含む属性を考慮してモデルを構築します。この段階では、特定のグループにおける真陽性率や偽陰性率が異なることが予測されます。分析結果として、例えば、女性やマイノリティのグループにおいて不利な結果が出る可能性があります。
以下のコードでは、XGBOOSTという機械学習モデルを用いて、equalized oddsを適用しないモデルを作成します。
# モデルの訓練
model = XGBClassifier(random_state=2)
model.fit(X_train, y_train)
# 通常のモデルの評価
y_pred = model.predict(X_test)
print(f"Accuracy: {accuracy_score(y_test, y_pred)}")
print(f"Confusion Matrix:\n{confusion_matrix(y_test, y_pred)}")
print(f"f1-Score:\n{f1_score(y_test, y_pred)}")
pred_viz = pd.DataFrame(np.vstack([X_test["sex_Male"], y_pred]).T, columns=["sex_Male", ">50k"])
print( pred_viz.groupby(["sex_Male"])[">50k"].value_counts() )
# 公平性の評価
dp_diff = demographic_parity_difference(y_test, y_pred, sensitive_features=X_test["sex_Male"])
eo_diff = equalized_odds_difference(y_test, y_pred, sensitive_features=X_test["sex_Male"])
print(f"Demographic Parity Difference: {dp_diff}")
print(f"Equalized Odds Difference: {eo_diff}")
4-3. equalized oddsを適用した場合
次に、equalized oddsを適用してモデルを再訓練します。ここでは、特定のライブラリ(例:fairlearn
)を使用して、モデルの予測が異なるグループ間(今回は性別)で均等になるように制約を加えます。この制約により、各グループに対する真陽性率および偽陰性率が均等になるように調整されます。分析結果として、以前のモデルに比べて、各グループ間でより公平な予測が得られることが期待されます。
以下のコードでは、fairlearnと呼ばれるequalized oddsを適用させることが出来るライブラリを用い、先ほどのXGBOOSTでequalized oddsを適用したモデルを作成します。
# Equalized Oddsを考慮したモデル
# ExponentiatedGradientでモデルの訓練
mitigator = ExponentiatedGradient(
XGBClassifier(random_state=2),
constraints=EqualizedOdds(),
max_iter=100000000)
mitigator.fit(X_train, y_train, sensitive_features=X_train["sex_Male"])
# 公平性を考慮したモデルの評価
y_pred_mitigated = mitigator.predict(X_test)
print(f"Accuracy (mitigated): {accuracy_score(y_test, y_pred_mitigated)}")
print(f"Confusion Matrix (mitigated):\n{confusion_matrix(y_test, y_pred_mitigated)}")
print(f"f1-Score:\n{f1_score(y_test, y_pred_mitigated)}")
pred_mitigated_viz = pd.DataFrame(np.vstack([X_test["sex_Male"], y_pred_mitigated]).T, columns=["sex_Male", ">50k"])
print( pred_mitigated_viz.groupby(["sex_Male"])[">50k"].value_counts() )
dp_diff_mitigated = demographic_parity_difference(y_test, y_pred_mitigated, sensitive_features=X_test["sex_Male"])
eo_diff_mitigated = equalized_odds_difference(y_test, y_pred_mitigated, sensitive_features=X_test["sex_Male"])
print(f"Demographic Parity Difference (mitigated): {dp_diff_mitigated}")
print(f"Equalized Odds Difference (mitigated): {eo_diff_mitigated}")
4-4. equalized oddsの適用有無の結果比較
以下は、equalized oddsを適用した場合と適用しない場合の予測結果です。
5万ドル未満 | 5万ドル以上 | |
---|---|---|
男性 | 4,783 | 1,748 |
女性 | 2,961 | 277 |
5万ドル未満 | 5万ドル以上 | |
---|---|---|
男性 | 4,942 | 1,589 |
女性 | 2,912 | 326 |
区分 | Equalized Odds Difference | f1-Score |
---|---|---|
equalized oddsを適用しない場合 | 0.08318 | 0.7093 |
equalized oddsを適用した場合 | 0.03772 | 0.6966 |
4-5. 考察
- 公平性の向上とその影響
equalized oddsを使用したモデルでは、異なるグループ間での公平性が向上することが確認できます(Equalized Odds Differenceが、0.08→0.03に低下)。今回は、女性のグループで、より正確かつ公平な予測が得られるようになります。この結果は、特定のグループが不利な扱いを受けることなく、公平な機会を提供するために重要です。
- モデルの精度と公平性のトレードオフ
しかしながら、公平性を向上させることによって、モデルの全体的な精度が低下する可能性があります(f1-scoreが、0.70→0.69へ低下)。これは、equalized oddsを達成するために、モデルが一部のグループの予測精度を犠牲にする必要があるからです。ビジネスや社会においては、このトレードオフを慎重に検討し、公平性と精度のバランスを取る必要があります。
5. まとめと今後の展望
本記事では、equalized oddsを用いた公平性を考慮した機械学習について解説し、実際のデータを用いた分析を通じて、その効果を示しました。equalized oddsは、特定のグループが不利な扱いを受けることなく、公平な予測を行うための重要な手法です。しかし、モデルの精度とのトレードオフを考慮する必要があり、そのバランスを取ることが重要です。今後は、さらに精度を維持しつつ公平性を向上させる手法の研究が期待されます。企業や社会が公平なAIの活用を進めるためには、equalized oddsのような手法を積極的に取り入れていくことが求められます。