sklearn-explainability について
sklearn-explainabilityは、scikit-learnモデルの予測や特徴量の影響を解釈するためのガイドです。モデルの信頼性を検証する研究者や実務者向けに、標準の検査手法、SHAP、データ漏洩・不安定性・特徴量相関の確認方法を扱います。
主な機能
- 01テストデータでのPermutation Importance
- 02部分依存プロットと相互作用プロット
- 03局所・大域的な説明手法
- 04SHAPを使った解釈パターン
- 05データ漏洩と特徴量相関の確認
活用シーン
- 01モデルが意味のある特徴量を使うか確認
- 02個別の予測結果を説明
- 03データ漏洩や不安定な重要度を検出
- 04科学モデルの特徴量間相互作用を調査
インストール
コマンドをコピーしてターミナルで実行します。
npx skills add https:/ / github.com/ tondevrel/ scientific-agent-skills --skill sklearn-explainabilityインストール後、Claude Code で/sklearn-explainabilityを入力して読み込まれたか確認します。
詳細
scikit-learn - 説明可能性と解釈可能性
科学研究では、モデルの「何を」するかと同じくらい、「なぜ」そうするかが重要です。このガイドでは、機械学習モデルの意思決定プロセスを明らかにするツールに焦点を当て、モデルが科学的に妥当であり、単に人工的な特徴に過剰適合しているだけではないことを確認します。
使用する場面
- モデルが物理的に意味のある特徴量(例:創薬における特徴量)を使用していることを検証するとき。
- モデルが訓練データから学習したバイアスや「近道」を特定するとき。
- 個々の予測を専門家以外の人に説明するとき(局所的な説明)。
- 複雑なシステムにおける変数の全体的な影響を順位付けするとき(大域的な説明)。
- 科学的な監査や規制への準拠を行うとき。
基本原則
1. モデル固有とモデル非依存
- モデル固有:ランダムフォレストの
feature_importances_などのツールです。高速ですが、特定のアーキテクチャに限定されます。 - モデル非依存:SHAP や置換重要度などのツールです。どのモデル(SVM、MLP など)でも利用できますが、より多くの計算リソースを必要とします。
2. 大域的な説明と局所的な説明
- 大域的:特徴量「Temperature」はモデル全体にどのような影響を与えるでしょうか?
- 局所的:この特定のサンプルについて、モデルが「Reaction Failed」と予測したのはなぜでしょうか?
3. 特徴量重要度と特徴量寄与度
重要度は特徴量が使用されているかどうかを示します。寄与度は、その特徴量によって出力がどのように変化したか(正または負)を示します。
クイックリファレンス:組み込みの検査機能
from sklearn.inspection import permutation_importance, PartialDependenceDisplay
# 1. Permutation Importance (Better than default tree importance)
result = permutation_importance(model, X_test, y_test, n_repeats=10)
print(result.importances_mean)
# 2. Partial Dependence Plots (How one feature affects prediction)
PartialDependenceDisplay.from_estimator(model, X, features=['temp', 'pressure'])
重要なルール
✅ すること
- デフォルトのRandomForest.feature_importances_よりも置換重要度を優先する - デフォルトの重要度は、(一意のIDのような)カーディナリティの高い特徴量に偏る傾向があります。
- PartialDependenceDisplayを使用する - 特徴量と目的変数の関係(線形、指数関数的、またはシグモイド)を可視化します。
- 解釈可能性を評価する前に特徴量をスケーリングする - ロジスティック回帰など多くのモデルでは、係数(β)を比較可能にするためにスケーリングが必要です。
- 特徴量間の相関を確認する - 2つの特徴量の相関が高い場合、重要度が両者に分散され、どちらも実際より「重要でない」ように見えます。
❌ しないこと
- 正則化していないモデルの係数(β)を信用しない - 係数の分散が大きいと、特徴量重要度について誤った結論につながる可能性があります。
- 訓練データで特徴量重要度を算出しない - 汎化に実際に役立つ特徴量を確認できるよう、必ずテストセットで算出してください。
- 相関と因果関係を混同しない - ML モデルが示すのは、どの特徴量が予測に有用かであり、必ずしもどの特徴量が因果関係を持つかではありません。
解釈パターン
1. SHAPとの統合(ゴールドスタンダード)
import shap
# Works for any scikit-learn model
explainer = shap.Explainer(model.predict, X_test)
shap_values = explainer(X_test)
# Visualize global importance
shap.plots.bar(shap_values)
# Visualize local explanation for the first sample
shap.plots.waterfall(shap_values[0])
2. 科学研究における部分依存(PDP)
from sklearn.inspection import PartialDependenceDisplay
# Check if the model learned the correct physical law
# (e.g., does the reaction rate increase with temperature?)
fig, ax = plt.subplots(figsize=(8, 4))
PartialDependenceDisplay.from_estimator(model, X, [0, (0, 1)], ax=ax)
# [0] is a 1D plot, [(0, 1)] is a 2D interaction plot
上級:特徴量寄与度(ELI5形式)
単一の予測について、どの特徴量がどのクラスに向けて予測を変化させたかを確認できます。
def explain_prediction(model, sample):
# For linear models, this is: intercept + sum(coef * value)
prediction = model.predict_proba(sample)
# ... logic to map coefficients to feature names ...
pass
実践的なワークフロー:科学モデルの検証
ステップ 1:「リーク」特徴量を検出する
特徴量の重要度が99%で、そうなると予想されていなかった場合、データリーク(サンプルのタイムスタンプやIDなど)が発生している可能性があります。
ステップ 2:安定性分析
異なる乱数シードを使って置換重要度を計算します。上位の特徴量が大きく変わる場合、モデルは不安定で信頼性に欠けます。
ステップ 3:相互作用を確認する
2D PDPを使用して、モデルが特徴量間の相互作用を捉えているか確認します(例:Temperatureが100°Cを超える場合にのみPressureが重要になる)。
よくある落とし穴
「デフォルトの重要度」によるバイアス
ランダムフォレストでは、カテゴリ数の多い特徴量(Serial_Numberなど)が非常に重要に見えることがあります。これは、決定木がその特徴量で何度も分割できるためです。
# ✅ Solution: Use Permutation Importance on the test set instead.
多重共線性による見えにくさ
Feature_AとFeature_Bの相関が100%の場合、モデルはそのうち一方だけを使うことがあります。
# ✅ Solution: Use hierarchical clustering on features or check VIF
# before interpreting importance.
説明可能性によって、機械学習は真の科学的ツールになります。研究者は「ブラックボックス」を超えて、訓練済みモデルから新たな仮説を直接導き出せるようになります。