はじめに
機械学習モデルの運用において、「なぜこの予測結果になったのか?」という問いに答えることは、ビジネス上の意思決定やモデルの改善に不可欠です。特に、「もしこの特徴量がこうだったら、予測結果はどう変わるのか?」という疑問は、具体的なアクションに繋がる重要な洞察を与えてくれます。この記事では、このような問いに答える反実仮想サンプル(Counterfactual Examples)の生成と、そのためのツールであるDiCE(Diverse Counterfactual Explanations)について解説します。
対象読者:
- 機械学習モデルの解釈可能性に関心のあるデータサイエンティスト、機械学習エンジニア
- モデルの予測結果をビジネス上の意思決定に活用したいと考えているビジネスアナリスト、プロダクトマネージャー
- Pythonを用いて実際にDiCEを動かしてみたい方
記事のポイント:
- 反実仮想サンプルがなぜ重要なのか、その4つのメリット(意思決定支援、公平性検証、説明可能性向上、頑健性評価)を具体的な活用シーンとともに解説
- DiCEがどのように反実仮想サンプルを生成するのか、そのメカニズムと主要パラメータ(
proximity_weight
,diversity_weight
,features_to_vary
)の役割を説明 - 優れた反実仮想サンプルが満たすべき4つの条件(実現可能性、最小変更、解釈可能性、多様性)を提示
- PythonとDiCEライブラリを用いた実践的なコード例と、生成された反実仮想サンプルの可視化方法を紹介
なぜランダムな特徴量の変更ではなくDiCEを使うのか
反実仮想サンプルを生成する最も単純な方法は、特徴量の値をランダムに変更することです。しかし、DiCEを使うことには、以下の様な、ビジネスの現場で有用な、明確なメリットがあります。
- 最適化された変更の提案: DiCEは、目標とする予測結果(例えば、ローン審査の承認)を得るために、どの特徴量をどのように変更すれば良いかを最適化された形で提案します。ランダムな変更では、望ましい結果が得られる保証はありません。
- 現実的な変更の生成: DiCEの
proximity_weight
パラメータは、生成される反実仮想サンプルを元のデータポイントに近づける働きをします。これにより、現実的に起こりうる範囲での変更が提案され、非現実的な値や極端な値の生成を防ぎます。 - 多様な選択肢の提供:
diversity_weight
パラメータにより、DiCEは異なるアプローチを持つ複数の反実仮想サンプルを提示します。これにより、ユーザーは自身の状況や制約に合わせて最適な選択肢を選ぶことができます。 - 最小限の変更: DiCEは、目標を達成するために必要最小限の特徴量の変更を探索します。これにより、ユーザーは何を変更すれば良いのかをより簡単に理解できます。
- 制約の考慮:
features_to_vary
パラメータにより、変更可能な特徴量のみを指定できます。例えば、年齢や性別など、現実世界で変更できない特徴量を除外できます。
DiCEによる反実仮想サンプル生成
DiCE (Diverse Counterfactual Explanations) は、その名の通り、多様な反実仮想サンプルを生成するためのオープンソースライブラリです。DiCEは以下の特徴を持ち、これらを実現するために内部で最適化問題を解いています。
- 多様性 (Diversity): 複数の異なる反実仮想サンプルを提示し、ユーザーに選択肢を提供します。
- 近接性 (Proximity): 生成される反実仮想サンプルは、元のデータポイントにできるだけ近いものが選ばれます。
- スパース性 (Sparsity): 変更される特徴量の数を最小限に抑えられます。
DiCEが解く最適化問題では、以下の要素が考慮されます。
- 予測の変化: 反実仮想サンプルに対するモデルの予測が、元のデータポイントに対する予測と異なること(望ましいクラスに近づくこと)。
- 元のデータとの距離: 反実仮想サンプルが元のデータポイントから大きく離れすぎていないこと(
proximity_weight
で調整)。 - 多様性: 生成される複数の反実仮想サンプルが互いに異なること(
diversity_weight
で調整)。 - スパース性:変更される特徴量の数が少ないこと。
DiCEの使用例
ここでは、簡単なローン審査モデルを例に、DiCEを使って反実仮想サンプルを生成するPythonコードを示します。
import dice_ml
from dice_ml.utils import helpers
import pandas as pd
# データとモデルの準備(サンプルデータを使用)
data = pd.DataFrame({'age': [25, 30, 45],
'income': [400, 500, 700],
'education': [12, 16, 20],
'loan_approval': [0, 1, 1]})
# ダミーモデルの作成
def dummy_model(df):
# 年収と学歴に基づいて単純なルールで予測
return (df['income'] > 450) & (df['education'] > 14)
# DiCEの初期化
d = dice_ml.Data(dataframe=data, continuous_features=['age', 'income', 'education'],
outcome_name='loan_approval')
m = dice_ml.Model(model=dummy_model, backend='sklearn') # backendは'sklearn'を使用
exp = dice_ml.Dice(d, m)
# 反実仮想サンプルの生成
query_instance = data.iloc[0:1] # 説明したいインスタンス(最初のデータ、ローン不承認)
dice_exp = exp.generate_counterfactuals(
query_instance,
total_CFs=3, # 生成する反実仮想サンプルの数
desired_class=1, # 目標とするクラス(ローン承認)
proximity_weight=1.5, # 近接性の重み
diversity_weight=1.0, # 多様性の重み
features_to_vary=['age', 'income', 'education'] # 変更を許可する特徴量
)
# 結果の表示
dice_exp.visualize_as_dataframe()
このコードでは、まず簡単なデータセットとダミーのローン審査モデルを作成しています。次に、DiCEのData
、Model
、Dice
オブジェクトを初期化し、generate_counterfactuals
メソッドで反実仮想サンプルを生成、結果を表示しています。
generate_counterfactuals
メソッドの主な引数は以下の通りです。
query_instance
: 説明したいデータポイントtotal_CFs
: 生成する反実仮想サンプルの数desired_class
: 目標とするクラスproximity_weight
: 元のデータポイントとの近さの重みdiversity_weight
: 生成される反実仮想サンプル間の多様性の重みfeatures_to_vary
: 変更を許可する特徴量のリスト
DiCEのパラメータと意味
DiCEのパラメータは、生成される反実仮想サンプルの質と多様性に影響を与えます。適切に調整することで、より現実的で解釈しやすい反実仮想サンプルを得ることができます。
パラメータ | 意味 | 効果 |
---|---|---|
proximity_weight |
元のデータポイントとの近さの重み。この値が大きいほど、元のデータポイントに近い(変化の少ない)反実仮想サンプルが生成される。 | 値が小さすぎると、現実的には起こりえないような極端な変更が提案される可能性がある。逆に大きすぎると、予測が変わるような変更が見つかりにくくなる。 |
diversity_weight |
生成される複数の反実仮想サンプル間の多様性の重み。この値が大きいほど、互いに異なる特徴量を持つ多様なサンプルが生成される。 | 値が小さすぎると、似たような変更ばかりが提案される可能性がある。逆に大きすぎると、個々の反実仮想サンプルの質(元のデータとの近さなど)が低下する可能性がある。 |
features_to_vary |
変更を許可する特徴量のリスト。指定しない場合は、すべての特徴量が変更可能となる。 | 現実的に変更可能な特徴量のみを指定することで、より実用的で解釈しやすい反実仮想サンプルを生成できる。例えば、年齢や性別など変更できない特徴量を除外することができる。 |
sparsity_weight
は、DiCEの現在のバージョンでは直接サポートされていませんが、features_to_vary
を使って間接的に制御できます。
優れた反実仮想サンプルの特徴
優れた反実仮想サンプルは、モデルの予測を変えるだけでなく、以下の4つの特性を満たす必要があります。
特性 | 説明 | 重要性 |
---|---|---|
実現可能性 | 反実仮想サンプルが示す特徴量の値が、現実世界で実際に起こりうるものであること。 | 実現不可能な提案をしても意味がないため。 |
最小変更 | 元のデータポイントから、できるだけ少ない変更で目的の予測結果を得られること。 | ユーザーが実際に行動を起こす際の負担を最小限にするため。 |
解釈可能性 | どの特徴量がどのように変更されたのかが、人間にとって理解しやすいこと。 | ユーザーがモデルの提案を理解し、納得して受け入れるために重要。 |
多様性 | 複数の異なる反実仮想サンプルが提示されることで、ユーザーが自身の状況や制約に合わせて最適な選択肢を選べること。 | 単一の「正解」を押し付けるのではなく、複数の選択肢を提供することで、ユーザーの自由度を高める。 |
反実仮想サンプルの利用用途
反実仮想サンプルとは、「もし入力データの一部が異なっていたら、モデルの予測結果はどう変わっていたか」を示すサンプルです。主要な用途は、以下の4つです。
メリット | 説明 | 具体例 |
---|---|---|
意思決定の支援 | モデルの予測を望ましい結果に変えるために、具体的にどの特徴量をどう変更すれば良いのかを提示できる | ローン審査で不承認となった場合に、「年収を〇〇万円増やせば承認される可能性がある」と具体的な改善策を提示できる |
公平性検証 | 性別や人種といった保護されるべき属性を変更したときに、モデルの予測が不当に変わらないかを検証できる | 性別を男性から女性に変更したときにローンの承認確率が大きく下がる場合、モデルが性別による差別をしている可能性を検出できる |
説明可能性の向上 | モデルが「なぜこの予測をしたのか」を、具体的な反例(反実仮想サンプル)を用いて、より人間にとって理解しやすい形で説明できる | 「もしこの顧客の年齢が〇〇歳若ければ、ローンのリスク評価は〇〇%低くなっていた」というように、モデルの判断根拠を具体的に示すことができる |
モデルの頑健性評価 | 入力データのわずかな変化に対して、モデルの予測がどの程度影響を受けるか(感度)を評価できる | 特定の特徴量を少しだけ変化させたときに予測結果が大きく変わる場合、モデルが過学習を起こしているか、外れ値に弱い可能性があることを検出できる |
これらを踏まえて具体的なアクションを起こしたり、モデル自体の改善につなげたりすることができるようになります。
用途ごとの、具体的な利用方法
意思決定支援
ローン審査の例で、DiCEの結果を具体的な意思決定支援に活用する手順を説明します。
- 対象ケースの特定: ローン審査で否決された顧客のデータを選びます。
- 目標クラスの設定:
desired_class=1
(ローン承認)と設定します。 - 変更可能特徴量の指定: 年収、勤続年数、借入希望額など、変更可能な特徴量を
features_to_vary
で指定します。 - パラメータ調整:
proximity_weight
を高めに、diversity_weight
を適切に設定します。 - 反実仮想サンプル生成: DiCEを実行し、複数の反実仮想サンプルを生成します。
- 結果の解釈と提案: 生成された反実仮想サンプルと元のデータを比較し、どの特徴量がどのように変化したかをユーザーに分かりやすく説明します (例:「年収を50万円増やすと承認される可能性が高まります」)。
モデルの公平性検証
DiCEを用いて、モデルが特定の属性(例えば性別)に対して公平であるかを検証する手順を説明します。
- データ準備: データセットから、性別以外の特徴量が類似している男女のペアを抽出します。
- 反実仮想サンプル生成:
features_to_vary=['性別']
と設定し、性別のみを変更可能にして、各ペアに対して性別を入れ替えた反実仮想サンプルを生成します。 - 予測の変化を比較: 元のデータと反実仮想サンプルで、モデルの予測(承認確率など)がどのように変化するかを比較します。性別を入れ替えたときに予測が大きく変わる場合、モデルが性別に対してバイアスを持っている可能性があります。
- 統計的検定: 多数のペアで予測の変化を比較し、統計的に有意な差があるかを検定します(t検定など)。
説明可能性向上
DiCEを用いてモデルの予測理由を説明する手順は以下の通りです。
- 説明対象の選択: 説明したい予測結果(例: ローン否決)を持つデータを選びます。
- 反実仮想サンプル生成:
total_CFs
を3〜5程度に設定し、複数の反実仮想サンプルを生成します。diversity_weight
を適切に設定し、多様な変更パターンを得ます。 - 変更点の特定: 元のデータと各反実仮想サンプルを比較し、どの特徴量がどのように変化したかを特定します。
- 説明の作成: 変更された特徴量とその変更量を、ユーザーに分かりやすく提示します(例:「もし年収が〇〇万円高ければ、ローンは承認されていたでしょう」)。
モデルの頑健性評価
DiCEを用いて、モデルの入力変化に対する感度を評価する手順を説明します。
- テストデータ準備: モデルの評価に使用するテストデータを用意します。
- 反実仮想サンプル生成:
proximity_weight
を低めに設定し、より広範囲な特徴量の変化を許容します。各データポイントに対して、複数の反実仮想サンプルを生成します(例:total_CFs=10
)。 - 変化量と予測の変化を記録: 元のデータと各反実仮想サンプルで、各特徴量の変化量と、モデルの予測(確率など)の変化量を計算します。
- 感度分析: 各特徴量について、変化量と予測の変化量の関係を可視化します(散布図など)。相関係数などを計算し、特徴量の変化が予測に与える影響の大きさを定量化します。
# 特徴量の変化量と予測変化の関係を可視化
import matplotlib.pyplot as plt
plt.scatter(feature_changes, prediction_changes) #feature_changesは、特徴量の変化量, prediction_changesは予測確率の変化量
plt.xlabel('特徴量Xの変化量')
plt.ylabel('予測確率の変化量')
plt.show()
- 結果の解釈: 感度が高い特徴量(予測の変化が大きい特徴量)を特定します。感度が高すぎる特徴量がある場合、モデルが過学習を起こしているか、外れ値に弱い可能性があります。
まとめ
反実仮想サンプルは、機械学習モデルの解釈可能性を高め、具体的な意思決定を支援するための強力なツールです。DiCEライブラリを使うことで、多様かつ現実的な反実仮想サンプルを簡単に生成でき、モデルの公平性検証、説明可能性向上、頑健性評価など、さまざまな応用が可能になります。
お気軽にご相談ください!
弊社のデジタル技術を活用し、貴社のDXをサポートします。
基本的な設計や実装支援はもちろん、機械学習・データ分析・3D計算などの高度な技術が求められる場面でも、最適なソリューションをご提案します。
初回相談は無料で受け付けております。困っていること、是非お聞かせください。