XAI（説明可能なAI)備忘録

## 背景
AI活用の広がりに伴い、精度に加えて以下の**3つの価値**が求められるようになりました。
- 公平性（Fairness）
- **説明責任**（Accountability）
- 透明性（Transparency）

#### 公平性（Fairness）
> 利用者の属性の違いによらず、AIが公平なサービスを提供できるよう、不公平を生じるバイアスを排除すること。

#### **説明責任**（Accountability）
> 誤りの原因がどこにあり、その責任は誰・何にあるのかを明確にすること。

#### 透明性（Transparency）
> 利用者が理解できる形で、 AIシステムの情報を提示できること。

## XAIとは
> 内部に複雑な構造を持つAIについて、予測の判断理由を人間が理解できるように説明する技術（または特性）を指しています。

## 代表的な手法
- **大域的な説明**
    - Born Again Trees
    - Making Tree Ensembles Interpretable: A Bayesian Model Selection Approach, AISTATS'18 [Python defragTrees]　

- **局所的な説明**
    - 予測の根拠となった特徴量
        - LIME
        - SHAP
        - Anchor
    - 予測の根拠となった訓練データ
        - influence 21

- **深層学習モデルの説明**
    - DeepLIFT
    - SmoothGrad　

## LIME
今回はとりあえずLIMEをPythonで実際に動かしていきます。
実行環境はGoogle Colaboratoryを想定しています。

### 1. ライブラリをインポート
まずは、ライブラリ"lime"をインストールして、呼び出します。
また、ブラックボックスAIとしてよく使われるランダムフォレストのライブラリや前処理等に用いるライブラリも呼び出しておきます。

```
#環境に含まれていないライブラリをインストール
!pip install lime

#ライブラリをインポート
import sklearn
import sklearn.ensemble
import numpy as np
import lime
import lime.lime_tabular
import pandas as pd
from __future__ import print_function
np.random.seed(1)
```

### 2. データをインポート
この記事では詳しくは触れませんが、[UCI](https://archive.ics.uci.edu/ml/index.php)のWineという有名なデータセット（ワインの質のデータセット）を使用します。
ワイン1本の成分を特徴量（変数）としてワインの質 (quality) を予測するのが目的となります。

```
wine_dataset = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/wine-quality/winequality-red.csv", sep=";")
```

### 3. データの前処理
データの前処理を行います。質はシンプルな良し悪しで分析するため、7よりも小さかったら0（bad）、それ以外は1（good）というようにダミー変数に置き換えます。

```
#ワインの質に関する数値
Y = wine_dataset.quality.values
#質に関するデータを落としている。
wine_dataset = wine_dataset.drop('quality', axis =1)
#7よりも小さかったら0、それ以外は1とする。
Y = np.asarray([1 if  i >= 7 else 0 for i in Y])
Y_label = np.asarray(['good' if  i>=1 else 'bad' for i in Y])
 
# 訓練データ、テストデータの作成
train, test, labels_train, labels_test = sklearn.model_selection.train_test_split(wine_dataset.values,Y,train_size=0.80)
```

### 4. 任意の学習器で学習
LIMEにかけることの出来る任意の学習器で学習を行います。今回は、ランダムフォレストを用います。

```
# ランダムフォレストの学習
rf = sklearn.ensemble.RandomForestClassifier(n_estimators=500,class_weight="balanced" )
rf.fit(train, labels_train)

#ランフォレの結果を確認
sklearn.metrics.accuracy_score(labels_test, rf.predict(test))
```

### 5. LIMEで可視化
それではLIMEに適用していきます。LIMEは、特定のデータサンプルに対して予測の根拠となった特徴量を抽出するアルゴリズムです。であるため、データのインデックスである 変数i でどのデータサンプルに適用するかを指定します。

```
# LIMEの計算
explainer = lime.lime_tabular.LimeTabularExplainer(train,
                                                   feature_names = list(wine_dataset.columns.values),
                                                   class_names = np.unique(Y_label.astype('<U10')),
                                                   discretize_continuous=True)

#iでデータを指定する
i = 10
exp = explainer.explain_instance(test[i], rf.predict_proba, num_features=2, top_labels=1)
exp.show_in_notebook(show_table=True, show_all=False)
```
結果は以下の様になります。アルコール（alcohol）と硫酸塩（sulphates）の値から質の悪さを予測したことがわかりました。
![スクリーンショット 2022-02-20 18.26.09.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/1881521/0dda6e7f-781d-052e-b70a-46e093f989df.png)

## 参照・引用
[XAI(説明可能なAI)　そのとき人工知能はどう考えたのか？](https://www.amazon.co.jp/dp/B098W4L6DL/ref=dp-kindle-redirect?_encoding=UTF8&btkr=1)
[Explainable artificial intelligence（XAI）とは](https://qiita.com/ground0state/items/966e6b4e52912be634ed)
[Rのimlで複雑なモデルの予測結果を簡潔に説明する -eXplainable AI, XAI-](https://qiita.com/gnbrganchan/items/de452da1f19666e8d132)
[SHAPの論文を読んでみた](https://qiita.com/ground0state/items/ff8dd27edd210ae4468c)