YellowBrickをちょっぴり試してみた

# はじめに
可視化ツールを探していたところ、最近YellowBrickという可視化ツールが出たことを知り、あまり日本語の記載もなかったので試しに少し使ってみた。
まだまだ探り探りの状態なので、マニュアル見つつどんなものか調べた内容をメモする。


# 環境
実行環境は次の通り。

```
$sw_vers
ProductName:	Mac OS X
ProductVersion:	10.13.6
BuildVersion:	17G8030
```

```
$python3 --version
Python 3.7.4
```

# YellowBrickとは
YellowBrickのGitHubページ[^1]によると、機械学習のモデル選定を楽にしてくれるような可視化ツールとのこと。
1つ1つの特徴量のヒストグラムをきれいに出してくれるというよりは、モデルの精度グラフを簡単に綺麗に出してくれるようなツールのよう。

# 試したこと
YellowBrickのドキュメントページ[^2]にチュートリアルの説明があったので、シェアバイクのデータを使って、少しYellowBrickを触ってみた。

### インストール
pipでインストールするだけ。

```
pip imstall yellowbrick
```
### データのロード
今回はYellowBrickで用意されているシェアバイクのデータを使用。

```py
import yellowbrick
import pandas as pd
from yellowbrick.datasets import load_bikeshare

X, y = load_bikeshare()
print(X.head())
```
```
   season  year  month  hour  holiday  weekday  workingday  weather  temp  \
0       1     0      1     0        0        6           0        1  0.24   
1       1     0      1     1        0        6           0        1  0.22   
2       1     0      1     2        0        6           0        1  0.22   
3       1     0      1     3        0        6           0        1  0.24   
4       1     0      1     4        0        6           0        1  0.24   

   feelslike  humidity  windspeed  
0     0.2879      0.81        0.0  
1     0.2727      0.80        0.0  
2     0.2727      0.80        0.0  
3     0.2879      0.75        0.0  
4     0.2879      0.75        0.0  
```
### 特徴量間の関係
本当は1つ1つの特徴量分布を最初に見ていくところだが、あまりそういった可視化ツールではなさそうなので、早速相関行列を見てみる。プログラムは次の通り。

```python
from yellowbrick.features import Rank2D

visualizer = Rank2D(algorithm="pearson")
visualizer.fit_transform(X, y)
visualizer.show()
```
このように`Rank2D`を`fit_transform`、`show`するだけできれいな行列を出力できる。
今回はPearsonの相関係数の結果を表示しているが、他にもCovariace Matrixを表示することもできるので便利だなーという印象を受けた。

![Figure_1.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/05e600a4-4b6e-d961-b7ae-c5c5cff99860.png)

上は説明変数同士の相関だったが、目的変数と説明変数の相関係数を表示することもできる。プログラムは次の通り。

```python
from yellowbrick.target import FeatureCorrelation
visualizer = FeatureCorrelation(labels=X.columns)
visualizer.fit(X, y) 
visualizer.show()  
```
出力結果がこちら。プログラムを書く量が少なくて楽。

![Figure_2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/14074f83-e7c1-45b9-eb83-45eb2d9f3a23.png)

説明変数同士の相関行列で、「temp」と「feelslike」の相関係数が高いので、2つの変数の散布図を確認することもできる。プログラムは次の通り。

```python
from yellowbrick.features import JointPlotVisualizer

visualizer = JointPlotVisualizer(columns=['temp', 'feelslike'])
visualizer.fit_transform(X, y)
visualizer.show()
```
結果は下図の通り。前に自分でこういうプロットが欲しくてmatplotlib.pyplotで関数作った時に比べると、非常に楽。

![Figure_3.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/90c72f09-f3b4-b143-13ab-ab9d71d91c3d.png)

### 線形回帰モデルの可視化
他にも特徴量を可視化する関数は用意されているが、一旦モデルの可視化に移る。簡単のために、scikit-learnの線形回帰を用いてモデルを作成する。プログラムは次の通り。

```py
from yellowbrick.regressor import PredictionError, ResidualsPlot
from sklearn.linear_model import LinearRegression
from sklearn.model_selection import train_test_split

X_train, X_test, y_train, y_test = train_test_split(
    X, y, test_size=0.1
)

model = LinearRegression()


visualizer = PredictionError(model)
visualizer.fit(X_train, y_train)  # Fit the training data to the visualizer
visualizer.score(X_test, y_test)  # Evaluate the model on the test data
visualizer.show()
```

`PredictionError`にモデルを渡して、`fit`、`score`、`show`するだけでモデル構築と可視化をしてくれる。ここで可視化している`PredictionError`は目的変数の正解(実測)と予測値を軸に、データを散布図で表示している。
予測の当てはまりの良さを示す$R^2$値も自動で表示される。

![Figure_4.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/201acff5-0d66-0b3d-247d-edf888592f0f.png)

予測値と実測値の差(Residual)のプロットも同様に出すことができる。

```py
visualizer = ResidualsPlot(model)
visualizer.fit(X_train, y_train)
visualizer.score(X_test, y_test)
visualizer.show()
```

Residualが0のラインが自動で引かれているところは地味に嬉しい。
右側のヒストグラムは取り除くこともできる。

![Figure_5.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/ddc5b242-3b2a-4df7-6b14-d87c61e264d7.png)

ただ、モデルを引数に可視化する度に「fit」していると、その都度微妙に予測値が変わったりしないのかと心配したが、すでにモデルがフィット済みの場合は再度モデル構築はしないそう。`fit`しないで、可視化することもできた。

```py
visualizer = ResidualsPlot(model)
visualizer.score(X_test, y_test)
visualizer.show()
```
結果は下図の通りで、この場合は学習用データは表示されていないものの、`fit`せずに可視化できた。

![Figure_6.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/329888/a232e527-68ed-bebe-a77b-4e7e8679c3ba.png)

# まとめ
試しにYellowBrickを触ってみた。プログラム行数を削減して綺麗なプロットを出すことができそう。ただ、自分で自分好みの可視化関数を既に用意している人は、そこまで良いとは感じないかもしれない。もう少し詳しい使い方は後日アップデートしたい。


[^1]: https://github.com/DistrictDataLabs/yellowbrick 
[^2]: https://www.scikit-yb.org/en/latest/index.html