Pythonでデータの挙動を見やすくする可視化ツールを作成してみた（回帰・相関分析編）

# 概要
ものごとの関係性を裏付けたり、予測をしたい場合、**「回帰」**による分析が便利です。

**機械学習アルゴリズム一覧**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d70e35b2-3576-12c8-b33d-a03b743068e1.png)
上図のように、「回帰」は機械学習の中でも一大分野を占める重要な手法ですが、
なぜその結果となったかを裏付ける**「解釈」が難しい**分野でもあります。

そこで今回はPythonのグラフ描画ライブラリ「seaborn」をベースにして、
**回帰分析の解釈性を飛躍的に向上させる可視化ツール**を作成しました！

### 機能1. 相関分析
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d328a291-c376-c10b-4968-f89c4b5aad25.png)

### 機能2. 予測値vs実測値プロット
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/84162521-5f28-c013-2b5f-16a06e5bcd10.png)

### 機能3. 1次元説明変数回帰モデルの可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a2342722-175f-6d8b-9619-717b2064278b.png)

### 機能4. 2～4次元説明変数回帰モデルのヒートマップ可視化
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/02e6083c-a68b-e84a-8b2a-9a799dd1921d.png)

## 2021/7 修正：pipでインストールできるよう改良しました
下記コマンドでインストール可能となりました

## 2021/10 修正：新機能「average_plot」追加
各変数ごとに、他の変数を平均値（または中央値）で固定して予測値をプロットする`average_plot()`メソッドを追加しました。
![output.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7b6e1bad-0205-8018-d374-8c612997fbe9.png)
詳しくは[GitHubの説明](https://github.com/c60evaporator/seaborn-analyzer#average_plot)を参照ください

```
$ pip install seaborn-analyzer
```
**※[関連ツールを1つの記事にまとめました](https://qiita.com/c60evaporator/items/8cb774e65d4423fd93ee)！よければこちらもご覧ください**
![image](https://user-images.githubusercontent.com/59557625/126887193-ceba9bdd-3653-4d58-a916-21dcfe9c38a0.png)

もしこのツールを良いと思われたら、**[GitHubにStar頂けるとありがたいです！](https://github.com/c60evaporator/seaborn_analyzer)**

# ユースケース
業務での回帰分析において、本ツールが有効な場面でのユースケースを作成しました

## ユースケース1：2つの値の相関関係
上司「アヤメの花弁(petal_length)とがく(sepal_length)の長さの関係を分析してくれ」

このような2つの値の関係性を見たいとき、よく使用するグラフが**散布図**です。

```python
import seaborn as sns
iris = sns.load_dataset("iris")
sns.scatterplot(x='petal_length', y='sepal_length', data=iris)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e2663d6a-088a-81cd-ea8e-fe31a4ad0531.png)
私「散布図で右下から左上にかけてデータが分布しているので、花弁とがくは相関関係がありそうです」

上司「"ありそう"じゃ定性的だなあ！責任ある社会人なら定量的な裏付けが必要だね」

私「ぴえん🥺」

このように、普段何気なく使っている**「相関」ですが、定量的な裏付けを求められると困る**ことも多いかと思います。

### ユースケース1の解決策：ピアソン相関係数とP値
相関の強さを定量的に判断する指標として、「相関係数」という言葉を知っている方も多いかと思います。
相関係数は何種類かありますが、最も一般的なのは**「ピアソン相関係数」**です。

ピアソン相関係数の定量的解釈には幅がありますが、[こちらの資料のように](https://lecture.ecc.u-tokyo.ac.jp/~cueda/gengo/4-numeros/doc/n6-kankei.pdf)、下表の解釈が一般的かと思います。

|相関係数Rの絶対値|解釈|
|---|---|
|0.0 < R ≦0.2|XとYの間にほとんど相関がない|
|0.2 < R ≦0.4|XとYの間に弱い相関がある|
|0.4 < R ≦0.7|XとYの間にやや強い相関がある|
|0.7 < R ≦1|XとYの間に強い相関がある|

また、ピアソン相関係数の弱点として、データ数が少ない時の信頼性が低いことが挙げられます。
例えば、下図のようにデータが2点しかない場合、実際の相関有無に関わらずピアソン相関係数=1となってしまいます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/64ba9ec4-9312-b6b8-342c-b807c4e5f802.png)
ここで活用できるのが、ピアソン相関係数=0を帰無仮説としたときの**「P値」**です。
P値が有意水準0.05（あるいは0.01）より小さければ、「相関係数が有意に0より大きい（小さき）」と言えるので、ピアソン相関係数と併用することで、

**・P値が0.05（あるいは0.01）未満のとき**
**　→上の表に基づき、ピアソン相関係数から相関を解釈**

**・P値が0.05（あるいは0.01）以上のとき**
**　→データ数不足のため相関分析困難（あるいは相関なし）**

と解釈することができます。

### 本ツールによる判断方法
本ツールでは、ピアソンの相関係数とP値を散布図とともにプロットする

**regplot.linear_plot()**

というメソッドを用意しました。

```python
from seaborn_analyzer import regplot
import seaborn as sns
iris = sns.load_dataset("iris")
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/61bd37f4-f1b5-7518-9a8d-84d95b42702b.png)
プロットされたピアソン相関係数とP値に基づき、前述の

**・P値が0.05（あるいは0.01）未満のとき**
**　→上の表に基づき、ピアソン相関係数から相関を解釈**

**・P値が0.05（あるいは0.01）以上のとき**
**　→データ数不足のため相関分析困難（あるいは相関なし）**

のフローでデータの相関に関して判断ができます。

また、ピアソンの相関係数は[外れ値の影響を受けやすい等の欠点](https://tanigaku.jp/wp/?p=3186)もありますが、これらも散布図を見てある程度は判断できるかと思います。

## ユースケース2：回帰予測精度の可視化
前述の相関関係を利用して、片方の値からもう片方の値を予測する手法が、**「回帰」**です。
前述のアヤメ(iris)データセットの場合、petal_lengthからsepal_lengthを予測する、といった具合です。

このとき、
**予測対象の値** (前例でのsepal_length)のことを、**「目的変数」**
**予測に使用する値** (前例でのpetal_length)のことを、**「説明変数」**
と呼びます。

現実の複雑なデータでは、1種類の説明変数だけでは十分な精度の回帰モデルを作成できず、**複数の説明変数**が必要となる場合が多いです。

一例として、標高と緯度の2変数から、平均気温を予測する場合を考えます。
[気象庁のサイト](https://www.data.jma.go.jp/obd/stats/etrn/)から下記のようなデータをダウンロードします
※気温は1月の平均を使用

```temp_pressure.csv
city,altitude,latitude,temperature,pressure
Asahikawa,119.8,43.75666667,-7.5,995.3
Sapporo,17.4,43.06,-3.6,1009.8
Morioka,155.2,39.69833333,-1.9,996.1
Sendai,38.9,38.26166667,1.6,1010.2
Nagano,418.2,36.66166667,-0.6,966.6
Matsumoto,610,36.24666667,-0.4,943.5
Karuizawa,999.1,36.34166667,-3.5,897.6
Kawaguchiko,859.6,35.5,-0.6,913.7
Fujisan,3775.1,35.36,-18.4,626.5
Tokyo,25.2,35.69166667,5.2,1011.4
Nagoya,51.1,35.16666667,4.5,1011.6
Takayama,560,36.155,-1.4,950.9
Osaka,23,34.68166667,6,1009.5
Fukuoka,2.5,33.58166667,6.6,1020.1
Kagoshima,3.9,31.555,8.5,1017.3
Amami,2.8,28.37833333,14.8,1019.6
Naha,28.1,26.20666667,17,1014.5
```
データを可視化すると下記のようになります（標高(altitude)、緯度(latitude)、気温(temperature)で3Dプロット）

```python
import pandas as pd
import matplotlib.pyplot as plt
from mpl_toolkits.mplot3d import Axes3D
df_temp = pd.read_csv(f'./temp_pressure.csv')
X = df_temp[['altitude', 'latitude']].values  # 説明変数(標高+緯度)
y = df_temp[['temperature']].values  # 目的変数(気温)
fig = plt.figure()
ax = Axes3D(fig)
ax.scatter3D(X[:, 0], X[:, 1], y)
ax.set_xlabel('altitude [m]')
ax.set_ylabel('latitude [°]')
ax.set_zlabel('temperature [°C]')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/51b5a479-0908-784c-48d4-7af23300f313.png)

このデータに対し、標高(altitude)、緯度(latitude)の2つの説明変数から、目的変数=気温(temperature)を回帰で予測してみます。
回帰アルゴリズムには最もシンプルな「線形回帰」を使用し、ライブラリには機械学習のデファクトスタンダード、scikit-learnを利用します。

```python
from sklearn.linear_model import LinearRegression
from sklearn.metrics import r2_score, mean_absolute_error
lr = LinearRegression()  # 線形回帰用クラス
lr.fit(X, y)  # 線形回帰学習
y_pred = lr.predict(X)  # 学習モデルから回帰して予測値を算出
print(f'R2={r2_score(y, y_pred)}')  # R2_Scoreを表示
print(f'MAE={mean_absolute_error(y, y_pred)}')  # MAEを表示
```

```
> R2=0.9882146530719522
> MAE=0.7357671021553763
```

上司「平均気温は予測できそうかい？」

私「標高と緯度を利用すれば予測できそうです！」

上司「"できそう"じゃ定性的だなあ！定量的な裏付けはないのかい？」

私「回帰性能を表すR2-Scoreは0.988、誤差を表すMAEは0.736℃と良好です」

上司「数値だけじゃ分かりにくいなあ！グラフで見やすくしてくれ！」

私「説明変数が2次元なので、目的変数と合わせて3次元で散布図が描けません」

上司「本当にグラフ描けないの？なにか手段はあるでしょ？」

私「ぴえん🥺」

このように、説明変数が1次元であれば、目的変数と一緒に散布図プロットして相関や回帰の可否を論ずることもできますが、**2次元以上では散布図により可視化できません**。
（前述の3Dプロットも回帰精度を見るには不適）

回帰の性能自体はMAE（予測値と実測値の誤差平均値）などの**評価指標**で評価できますが、直感的な理解が難しく、グラフと比べると解釈性が低下してしまいます。

### ユースケース2の解決策：予測値vs実測値プロット
回帰性能を可視化する上で有効な方法が、目的変数の**実測値を横軸**、回帰モデルが予測した**予測値を縦軸にとった散布図プロット**です。

```python
import seaborn as sns
sns.scatterplot(x=y, y=y_pred)
ax = plt.gca()
ax.set_xlabel('true')
ax.set_ylabel('pred')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/88ea133f-95ca-8967-970f-72e92d9a364e.png)
理想的な状態では、下図赤線のように予測値=実測値となるので、ここからのズレを見るのが精度の可視化という意味では最適です。
**青い点（データ）が赤線（予測値=実測値の線）の近くに集まっているほど回帰性能が高い**とみなすイメージです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/dc3b97db-4c32-9c8c-d645-f4b5899f4e28.png)
ならば予測値=実測値の線をプロットすれば良いじゃないか！とツッコまれそうですが、
python（matplotlib）では、**ゼロから線をプロットするのは意外と手間が掛かります**。
これ以外にも
**・図だけだと定量指標がない**
**・評価データと学習データを分けずに評価するのはズルい**
**・どのデータの誤差が大きいか見たい**
等のツッコミポイントが、実際の分析の現場では発生しやすいかと思います

### 本ツールによる可視化方法
本ツールでは上記のツッコミに対応するため、
予測値vs実測値プロットを、予測値=実測値の線、各種指標ともにプロットする

**regplot.regression_pred_true()**

というメソッドを用意しました。

```python
from seaborn_analyzer import regplot
import seaborn as sns
from sklearn.linear_model import LinearRegression
iris = sns.load_dataset("iris")
regplot.regression_pred_true(LinearRegression(), x=['altitude', 'latitude'], y='temperature',
                             data=df_temp, scores=['mae', 'r2'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/658a0058-bdf5-9d0d-9f14-80bceee28faa.png)

線形回帰（LinearRegression）以外でも、**Scikit-learn APIに対応した回帰モデルであれば全て適用可能です**（下例はランダムフォレスト回帰）

```python
from sklearn.ensemble import RandomForestRegressor
regplot.regression_pred_true(RandomForestRegressor(), x=['altitude', 'latitude'], y='temperature',
                             data=df_temp, scores=['mae', 'r2'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/cc5c8fe3-b6c2-d70d-0fee-fee467675f6f.png)

また、**評価データと学習データを分けずに評価するのはズルい！**
という鋭いツッコミに対応するために、**[クロスバリデーション](https://oregin-ai.hatenablog.com/entry/2020/06/19/230448)での評価**にも対応しています。
※[クロスバリデーションの指定法詳細は後述](https://qiita.com/c60evaporator/items/c930c822b527f62796ee#cv)します

```python
regplot.regression_pred_true(LinearRegression(), cv=2,
                             x=['altitude', 'latitude'], y='temperature',
                             data=df_temp, scores=['mae', 'r2'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/345e9b5e-36f5-4fca-4033-4f3c7ef6bf29.png)
また、**どのデータの誤差が大きいか見たい**というツッコミが来ても即答できるよう、
誤差上位を文字表示する機能も付加しています

```python
regplot.regression_pred_true(LinearRegression(), rank_number=3, rank_col='city',
                             x=['altitude', 'latitude'], y='temperature',
                             data=df_temp, scores=['mae', 'r2'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/11b310c2-f054-f53f-4011-f1c8a99c3657.png)

## ユースケース3：回帰モデル予測値の可視化
ユースケース2の予測値vs実測値プロットは、**評価データが存在する部分**の性能を可視化することができます。
しかし、以下のようなツッコミが来るかもしれません。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/4904de5f-f7c8-3e67-911b-c2e6680357e5.png)
上司「この部分のデータの間隔が空いているけど、データがない部分も正しく予測できるの？」

私「他の部分は精度が高いので、恐らく大丈夫かと思います！」

上司「"恐らく"じゃ根拠が弱いな、データがない部分の予測も可視化できる方法を考えてよ」

私「ぴえん🥺」

### ユースケース3の解決策：回帰線＆回帰予測値ヒートマップ
限られたケース（説明変数が3～4次元以下）のみの解決策となりますが、
1次元説明変数の場合は**回帰線をプロット**することで、データがない部分の予測値が可視化できます。（下の例はサポートベクター回帰の予測値可視化）

```python
import numpy as np
from sklearn.svm import SVR
import seaborn as sns
import matplotlib.pyplot as plt
iris = sns.load_dataset("iris")
# 散布図プロット
sns.scatterplot(x='petal_length', y='sepal_length', data=iris)
# サポートベクター回帰学習
svr = SVR()
X = iris[['petal_length']].values
y = iris['sepal_length'].values
svr.fit(X, y)  
# 回帰モデルの線を作成
xmin = np.amin(X)
xmax = np.amax(X)
Xline = np.linspace(xmin, xmax, 100)
Xline = Xline.reshape(len(Xline), 1)
# 回帰線を描画
plt.plot(Xline, svr.predict(Xline), color='red')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/2cb41b6d-9a52-f69b-c113-9119c15d20b8.png)
同様に2次元説明変数の場合、ヒートマップでデータがない部分の予測値が可視化できます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9fb927ef-f325-3f5d-0e7a-01623b70f07d.png)
3次元以上の場合も、ヒートマップを複数組み合わせることで、描画できます

### 本ツールによる可視化方法
本ツールでは回帰の予測値を可視化するため、
1次元説明変数で回帰線表示＋実データの散布図をプロットする

**regplot.regression_plot_1d()**

および、2～4次元説明変数で回帰予測値をヒートマップ表示＋実データの散布図をプロットする

**regplot.regression_heat_plot()**

というメソッドを用意しました。

```python:regression_plot_1dの実行例
import seaborn as sns
from seaborn_analyzer import regplot
from sklearn.svm import SVR
iris = sns.load_dataset("iris")
regplot.regression_plot_1d(SVR(), x='petal_length', y='sepal_length', data=iris)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a2342722-175f-6d8b-9619-717b2064278b.png)

```python:regression_heat_plotの2次元説明変数での実行例
import pandas as pd
from sklearn.linear_model import LinearRegression
from seaborn_analyzer import regplot
df_temp = pd.read_csv(f'./temp_pressure.csv')
regplot.regression_heat_plot(LinearRegression(), x=['altitude', 'latitude'], 
                             y='temperature', data=df_temp)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/02e6083c-a68b-e84a-8b2a-9a799dd1921d.png)

ユースケース2と同様、**Scikit-learn APIに対応した回帰モデルであれば全て適用可能です**（下例はランダムフォレスト回帰）

```python
from sklearn.ensemble import RandomForestRegressor
regplot.regression_heat_plot(RandomForestRegressor(), x=['altitude', 'latitude'], 
                             y='temperature', data=df_temp)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/cb2ccbe3-ef99-af2a-d13a-68a111da8013.png)

こちらもユースケース2と同様、**クロスバリデーションに対応しています**

```python
from sklearn.ensemble import RandomForestRegressor
regplot.regression_heat_plot(RandomForestRegressor(), cv=2, display_cv_indices=[0, 1],
                             x=['altitude', 'latitude'], y='temperature', data=df_temp)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/ac14dfa8-a1b0-3c97-3eba-4fab1ef22740.png)

さらにユースケース2と同様、**誤差上位を文字表示する機能**にも対応しています

```python
from sklearn.ensemble import RandomForestRegressor
regplot.regression_heat_plot(RandomForestRegressor(), rank_number=3, rank_col='city',
                             x=['altitude', 'latitude'], y='temperature', data=df_temp)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e5dde752-8eab-523e-ec2a-cde6e2778986.png)

3次元説明変数の場合、**3個目の説明変数を一定間隔で分割し、分割された区間の中央値を使用した予測値をヒートマップで、分割された区間内のデータを散布図でプロットします**

```python
from seaborn_analyzer import regplot
import seaborn as sns
from sklearn.svm import SVR
iris = sns.load_dataset("iris")
regplot.regression_heat_plot(SVR(), x=['sepal_width', 'petal_width', 'petal_length'],
                             y='sepal_length', data=iris, x_heat=['petal_length', 'petal_width'],
                             pair_sigmarange=1.0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/5a017918-a93b-da32-d148-ad11a4109172.png)
3次元でヒートマップを作成し、一定間隔ごとの断面図を2次元で表示するイメージです

**4次元の場合**も同様に、3個目・4個目の説明変数を一定間隔に分割し、**縦横に図を並べ**ますが、全ての図を見るのが大変なので、あまり実用的ではないかもしれません


# 使用に必要なもの
・Python本体 (動作確認時は3.9.1を使用)
・Matplotlibで表示可能な環境 (Jupyter等)
・下記ライブラリ (参考として動作確認時のライブラリバージョンも記載)
　seaborn (0.11.1)
　numpy (1.20.1)
　pandas (1.2.2)
　matplotlib (3.3.4)
　scipy (1.6.0)
　scikit-learn (0.24.1)

# インストール方法
下記コマンドでインストール可能です

```
$ pip install seaborn-analyzer
```
※アンダースコアの`pip install seaborn_analyzer`でもインストール可能です。
インポート時はアンダースコアの`import seaborn_analyzer`や`from seaborn_analyzer`
となるのでご注意ください

# コード
モジュールcustom_scatter_plot.py内のクラスregplotに、必要な処理をまとめました。
seabornのregplotぽいAPIで使用できるようにするため、クラスメソッドを利用しています。

・[GitHubにもアップロードしています](https://github.com/c60evaporator/seaborn_analyzer)
・[該当部分のソースコードはこちら](https://github.com/c60evaporator/seaborn_analyzer/blob/master/custom_scatter_plot.py)

# 各メソッドの解説
**実行可能なメソッドは下記4個**となります

|メソッド名|機能|
|---|---|
|**linear_plot**|ユースケース1で紹介した、ピアソン相関係数とP値を散布図と共に表示|
|**regression_pred_true**|ユースケース2で紹介した、予測値vs実測値プロット|
|**regression_plot_1d**|ユースケース3で紹介した、1次元説明変数で回帰線表示|
|**regression_heat_plot**|ユースケース3で紹介した、2～4次元説明変数で回帰予測値をヒートマップ表示|

参考までに、クラス内のみで使用されるメソッド一覧も下記します

|メソッド名|機能|
|---|---|
|_round_digits|小数点以下N桁を丸めるメソッド|
|_round_dict_digits|dictのvalueすべての小数点以下N桁を丸めるメソッド（内部で_round_digitsメソッドを呼び出し）|
|_make_score_dict|回帰評価指標を算出してdict化するメソッド|
|_rank_display|誤差上位を文字プロットするメソッド|
|_scatterplot_ndarray|np.ndarrayを入力として散布図表示(scatterplot)|
|_plot_pred_true|予測値と実測値を、回帰評価指標とともにプロット(regression_pred_trueメソッドの描画処理部分)|
|_estimator_plot_1d|1次説明変数回帰曲線を、回帰評価指標とともにプロット(regression_plot_1dメソッドの描画処理部分)|
|_reg_heat_plot_2d|回帰予測値ヒートマップと各種散布図の表示(regression_heat_plotメソッドの描画処理部分)|
|_reg_heat_plot|回帰予測値ヒートマップ表示の、説明変数の数(2～4)に応じた分岐処理(regression_heat_plotメソッド処理のうち、説明変数の数に応じたデータ分割等を行う)|


# 使用方法
ユースケースで紹介した4メソッドの使用法を詳説します

## linear_plotメソッド実行方法
ユースケース1で紹介した、ピアソン相関係数とP値を散布図と共に表示するlinear_plotメソッドの実行方法です。
実行元スクリプトと同フォルダにcustom_scatter_plot.pyを置き、下記のように実行します

```python
# 参考としてirisデータを読み込んでいます
import seaborn as sns
iris = sns.load_dataset("iris")
# ここから実行部分（引数x, y, dataの指定はMUST）
from seaborn_analyzer import regplot
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris)
```
実行すると下図のようなグラフ(ピアソン相関係数とP値を散布図と共にプロット)が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/79748341-ea2f-b2a1-054d-00d937db3cd8.png)

## regression_pred_trueメソッド実行方法
ユースケース2で紹介した、予測値vs実測値プロットを表示するregression_pred_trueメソッドの実行方法です。
実行元スクリプトと同フォルダにcustom_scatter_plot.pyを置き、下記のように実行します

```python
# 参考として前述の気象庁データtemp_pressure.csvを読み込んでいます
import pandas as pd
df_temp = pd.read_csv(f'./temp_pressure.csv')
# 回帰モデルとして線形回帰を使用
from sklearn.linear_model import LinearRegression
# ここから実行部分（引数estimator, x, y, dataの指定はMUST）
from seaborn_analyzer import regplot
regplot.regression_pred_true(LinearRegression(), x=['altitude', 'latitude'], y='temperature', data=df_temp)
```
実行すると下図のようなグラフ(予測値vs実測値プロット＋評価指標)が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1be51dd6-df64-bd89-da8a-b1ab93f1c164.png)

## regression_plot_1dメソッド実行方法
ユースケース3で紹介した、1次元説明変数で回帰線表示するregression_plot_1dメソッドの実行方法です。
実行元スクリプトと同フォルダにcustom_scatter_plot.pyを置き、下記のように実行します

```python
# 参考としてirisデータを読み込んでいます
import seaborn as sns
iris = sns.load_dataset("iris")
# 回帰モデルとしてサポートベクター回帰を使用
from sklearn.svm import SVR
# ここから実行部分（引数estimator, x, y, dataの指定はMUST）
from seaborn_analyzer import regplot
regplot.regression_plot_1d(SVR(), x='petal_length', y='sepal_length', data=iris)
```

実行すると下図のようなグラフ(回帰線プロット＋評価指標)が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a2342722-175f-6d8b-9619-717b2064278b.png)

## regression_heat_plotメソッド実行方法
ユースケース3で紹介した、2～4次元説明変数で回帰予測値をヒートマップ表示するregression_heat_plotメソッドの実行方法です。
実行元スクリプトと同フォルダにcustom_scatter_plot.pyを置き、下記のように実行します

```python
# 参考として前述の気象庁データtemp_pressure.csvを読み込んでいます
import pandas as pd
df_temp = pd.read_csv(f'./temp_pressure.csv')
# 回帰モデルとして線形回帰を使用
from sklearn.linear_model import LinearRegression
# ここから実行部分（引数estimator, x, y, dataの指定はMUST）
from seaborn_analyzer import regplot
regplot.regression_heat_plot(LinearRegression(), x=['altitude', 'latitude'], 
                             y='temperature', data=df_temp)
```
実行すると下図のようなグラフ(回帰予測値ヒートマップ)が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/02e6083c-a68b-e84a-8b2a-9a799dd1921d.png)

# 引数の解説
メソッドごとに引数を解説します

## linear_plotの引数

|引数名|必須引数orオプション|型|デフォルト値|内容|
|---|---|---|---|---|
|x|必須|str|-|横軸に指定するカラム名|
|y|必須|str|-|縦軸に指定するカラム名|
|data|必須|pd.DataFrame|-|入力するデータ（Pandasのデータフレーム）|
|ax|オプション|matplotlib.axes.Axes|None|表示対象のAxes|
|hue|オプション|str|None|色分けに指定するカラム名|
|linecolor|オプション|str|'red'|回帰直線の色|
|rounddigit|オプション|int|5|表示指標の小数丸め桁数|
|plot_scores|オプション|bool|True|回帰式、ピアソンの相関係数およびp値の表示有無|
|scatter_kws|オプション|dict|None|seaborn.scatterplot()に渡す引数|
オプション引数の詳細は後述します

### オプション引数を指定しないとき
下記の値が自動入力されます（x, y, dataは入力必須）
(x, y, data, ax=None, hue=None, linecolor='red',
                    rounddigit=5, plot_scores=True)

**・表示例**
irisデータセットでの実行例

```python
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/79748341-ea2f-b2a1-054d-00d937db3cd8.png)

### ax
表示対象のAxes（[参考](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#2-%E3%82%B0%E3%83%A9%E3%83%95axes%E3%81%AE%E4%BD%9C%E6%88%90)）を指定します
（Noneならmatplotlib.pyplot.gca()で1枚ごとにプロットします）

```python
import matplotlib.pyplot as plt
fig, axes = plt.subplots(2, 1, figsize=(6, 12))
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris, ax=axes[0])
regplot.linear_plot(x='petal_length', y='petal_width', data=iris, ax=axes[1])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/b38dc598-2b22-7b36-0716-a3d9a66dcef7.png)

### hue
散布図の色分け用カラム名(列名)を指定します。

```python
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris, hue='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/c7813c2b-ad8a-0365-4122-c7833ddcf5d4.png)

### linecolor
回帰直線の色を指定します。色は[matplotlibに準拠します](https://pythondatascience.plavox.info/matplotlib/%E8%89%B2%E3%81%AE%E5%90%8D%E5%89%8D)。

```python
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris, linecolor='green')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/0af04a7b-4e6d-8c41-57bf-7c3508c46f5f.png)

### rounddigit
ピアソンの相関係数やp値など、数値表示の丸め桁数を指定します。

```python
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris, rounddigit=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1380af89-0ec7-81a1-503b-9efe36a6c6e9.png)

### plot_scores
回帰式、ピアソンの相関係数およびp値の文字表示の有無を指定します。
（Trueなら文字表示あり、Falseなら文字表示あり）

```python
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris, plot_scores=False)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1ac3050b-77d9-91eb-ec0b-d8a84c8c1d37.png)

### scatter_kws
散布図描画用メソッドseaborn.scatterplot()に渡す引数をdict指定できます。
渡せる引数は、[こちら](https://seaborn.pydata.org/generated/seaborn.scatterplot.html)をご参照ください

```python:散布図マーカーの透明度を0.5に
regplot.linear_plot(x='petal_length', y='sepal_length', data=iris, scatter_kws={'alpha': 0.5})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/db137491-8ee6-ea27-d3ba-ab4c2e775414.png)

## regression_pred_trueの引数

|引数名|必須引数orオプション|型|デフォルト値|内容|
|---|---|---|---|---|
|estimator|必須|Scikit-learn API|-|表示対象の回帰モデル|
|x|必須|List[str]|-|説明変数に指定するカラム名のリスト|
|y|必須|str|-|目的変数に指定するカラム名|
|data|必須|pd.DataFrame|-|入力するデータ（Pandasのデータフレーム）|
|hue|オプション|str|None|色分けに指定するカラム名|
|linecolor|オプション|str|'red'|予測値=実測値の線の色|
|rounddigit|オプション|int|3|表示指標の小数丸め桁数|
|rank_number|オプション|int|None|誤差上位何番目までを文字表示するか|
|rank_col|オプション|str|None|誤差上位と一緒に表示するフィールド名|
|scores|オプション|str|'mae'|文字表示する評価指標を指定|
|cv_stats|オプション|str|'mean'|クロスバリデーション時に表示する評価指標統計値|
|cv|オプション|int|int or sklearn.model_selection.* |クロスバリデーション分割法 (Noneのとき学習データから指標算出、int入力時はkFoldで分割)|
|cv_seed|オプション|int|42|クロスバリデーションの乱数シード|
|cv_group|オプション|str|None|GroupKFold,LeaveOneGroupOut等のグルーピング対象カラム名|
|estimator_params|オプション|dict|None|回帰モデルに渡すパラメータ|
|fit_params|オプション|dict|None|学習時のパラメータをdict指定|
|subplot_kws|オプション|dict|None|matplotlib.pyplot.subplotsに渡す引数|
|scatter_kws|オプション|dict|None|seaborn.scatterplot()に渡す引数|
オプション引数の詳細は後述します

### オプション引数を指定しないとき
下記の値が自動入力されます（estimator, x, y, dataは入力必須）
(estimator, x, y, data, hue=None, linecolor='red', rounddigit=3,
 rank_number=None, rank_col=None, scores=['mae'], cv_stats='mean', cv=None, cv_seed=42,
 estimator_params=None, fit_params=None, subplot_kws=None)

**・表示例**
irisデータセット＋ランダムフォレスト回帰RandomForestRegressorでの実行例

```python
from sklearn.ensemble import RandomForestRegressor
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris)
```
実行すると下図のようなグラフ(予測値vs実測値プロット＋評価指標)が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/84162521-5f28-c013-2b5f-16a06e5bcd10.png)

### hue
散布図の色分け用カラム名(列名)を指定します。

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             hue='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/46de806a-7e62-ec49-b006-e5e87fd05c4d.png)

### linecolor
予測値=実測値の線の色を指定します。色は[matplotlibに準拠します](https://pythondatascience.plavox.info/matplotlib/%E8%89%B2%E3%81%AE%E5%90%8D%E5%89%8D)。

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             linecolor='green')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e6d374a8-b58f-6274-8c27-2350123e27c4.png)

### rounddigit
評価指標の数値表示の丸め桁数を指定します。

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rounddigit=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/61eb3f9c-5134-bbbc-63ba-2b0fbeb7d628.png)

### rank_number
誤差上位何番目までを文字表示するかを指定します。
引数rank_colを指定すれば、一緒に表示する列も指定可能です
（rank_col指定なしのときは、データのインデックスを表示）

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rank_number=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/2a47b771-16ae-d973-782c-ef59c2118500.png)

### rank_col
引数rank_number指定時に、一緒に表示する列を指定します。

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rank_number=2, rank_col='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fd21ae26-f9d9-4310-3105-aac24216d390.png)

リスト指定すれば、複数の列を同時表示することもできます
（表示がごちゃごちゃするのであまりオススメはできませんが‥）

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rank_number=2, rank_col=['species', 'sepal_width'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/da90ba1e-742a-7766-da67-6ef60a55dca5.png)

### scores
文字表示する評価指標を指定します。
指定できる指標一覧は下記です

|名称|指定時の文字列|
|---|---|
|R2-Score|'r2'|
|MAE|'mae'|
|RMSE|'rmse'|
|RMSLE|'rmsle'|
|誤差最大値|'max_error'|

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             scores='r2')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/241e8ab1-55ec-1387-489b-07852f0cda87.png)

None指定すれば、指標表示を消せます

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             scores=None)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7ba0693b-dd3c-528f-47e5-b14c10a24807.png)

リスト指定すれば、複数の指標を同時表示することもできます

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             scores=['rmse','rmsle','max_error'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7fea0673-4dba-7f8f-5214-559b27785c19.png)

クロスバリデーション指定時は、クロスバリデーションごとの図にはクロスバリデーション内テストデータでの指標を、全体結果の図にはcv_stats引数で指定した指標統計値＋全体データで学習＆指標算出した場合の値 (_trainとついた指標)をプロットします。

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             scores=['mae', 'rmse'], cv_stats='mean', cv=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/93649c6e-0894-34d4-ea7c-4aed23822cba.png)

### cv_stats
クロスバリデーション指定時に、全体結果の図に表示する指標の統計値を指定します。
'mean'(平均値)、'median'(中央値)、'max'(最大値)、'min'(最小値)が指定できます。

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             scores=['mae', 'rmse'], cv_stats='median', cv=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1ae6bce0-bff2-7aa9-d406-0a26dc8f625d.png)

### cv
クロスバリデーション分割法を指定します。
数値を指定すれば、指定した数に応じて通常のK-Foldで分割します

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9979b436-0d31-b65b-573a-6f38e5a2f0f4.png)

Scikit-LearnのAPIに対応していれば、Leave-One-Out、GroupKFoldなどの特殊な分割法にも対応しています。
※Leave-One-Outのときは、CVごとの図はプロットせず、各CVでの結果を1枚の図に集約プロットします

```python
from sklearn.model_selection import LeaveOneOut
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=LeaveOneOut())
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/c5affe24-8bf8-6a62-9c53-08f166a513f5.png)

GroupKFold、LeaveOneGroupOutなどのグルーピング系の分割法では、引数`cv_group`で指定したグループを分割に使用します。

```python
from sklearn.model_selection import GroupKFold
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=GroupKFold(n_splits=2), hue='species', cv_group='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a2207f05-8bb5-4440-0a90-3dce4512712c.png)

### cv_seed
引数"cv"で数値指定した際の、クロスバリデーション指定時の乱数シードを指定します
（デフォルトでは乱数シード42を使用しています）

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2, cv_seed=43)
```

### estimator_params
回帰モデルに渡すパラメータをdict指定します。
理想的には、チューニング後のパラメータを渡すのが望ましいです。
（未指定ならば、scikit-learnのデフォルトパラメータを使用します）

```python:チューニング後のパラメータを渡せばmae良化
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2,
                             estimator_params={'n_estimators': 108,
                                               'max_features': 2,
                                               'max_depth': 167,
                                               'min_samples_split': 6,
                                               'min_samples_leaf': 5})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/70344111-26ec-2e62-356a-dac430437d5a.png)

### fit_params
学習時の"fit"メソッドに渡すパラメータをdict指定します。
XGBoostやLightGBMにおける"early_stoppling_round", "verbose"パラメータなどを想定しています。

```python:XGBoostでearly_stoppling_round等を指定
from xgboost import XGBRegressor
regplot.regression_pred_true(XGBRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2,
                             fit_params={'early_stopping_rounds': 20,
                                         'eval_set': [(iris[['petal_width', 'petal_length']].values, iris['sepal_length'].values)],
                                         'verbose': 1})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/78f41a44-7218-cd31-5a90-90a271d2db23.png)

### subplot_kws
画像作成用メソッドmatplotlib.pyplot.subplotsに渡す引数をdict指定できます。
渡せる引数は、[こちら](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#22-pltsubplots)や[こちら](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#11-pltfigure)をご参照ください

下の例のように、画像のサイズ（'figsize'、デフォルトはCV指定なしなら成り行き、CV指定ありなら画像1枚あたり6×6インチ）を変えたいときなどに便利です

```python
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2, subplot_kws={'figsize': (3, 9)})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/f9cdca46-c312-8e8f-c320-ebd77a6e3446.png)

### scatter_kws
散布図描画用メソッドseaborn.scatterplot()に渡す引数をdict指定できます。
渡せる引数は、[こちら](https://seaborn.pydata.org/generated/seaborn.scatterplot.html)をご参照ください

```python:散布図マーカーの形状を△に
regplot.regression_pred_true(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             scatter_kws={'marker': '^'})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1c6df39f-2f11-b707-4531-0313f0cf84d4.png)

## regression_plot_1dの引数

|引数名|必須引数orオプション|型|デフォルト値|内容|
|---|---|---|---|---|
|estimator|必須|Scikit-learn API|-|表示対象の回帰モデル|
|x|必須|str|-|説明変数に指定するカラム名|
|y|必須|str|-|目的変数に指定するカラム名|
|data|必須|pd.DataFrame|-|入力するデータ（Pandasのデータフレーム）|
|hue|オプション|str|None|色分けに指定するカラム名|
|linecolor|オプション|str|'red'|予測値=実測値の線の色|
|rounddigit|オプション|int|3|表示指標の小数丸め桁数|
|rank_number|オプション|int|None|誤差上位何番目までを文字表示するか|
|rank_col|オプション|str|None|誤差上位と一緒に表示するフィールド名|
|scores|オプション|str|'mae'|文字表示する評価指標を指定|
|cv_stats|オプション|str|'mean'|クロスバリデーション時に表示する評価指標統計値|
|cv|オプション|int or sklearn.model_selection.* |None|クロスバリデーション分割法 (Noneのとき学習データから指標算出、int入力時はkFoldで分割)|
|cv_seed|オプション|int|42|クロスバリデーションの乱数シード|
|cv_group|オプション|str|None|GroupKFold,LeaveOneGroupOut等のグルーピング対象カラム名|
|estimator_params|オプション|dict|None|回帰モデルに渡すパラメータ|
|fit_params|オプション|dict|None|学習時のパラメータをdict指定|
|subplot_kws|オプション|dict|None|matplotlib.pyplot.subplotsに渡す引数|
|scatter_kws|オプション|dict|None|seaborn.scatterplot()に渡す引数|
オプション引数の詳細は後述します

### オプション引数を指定しないとき
下記の値が自動入力されます（estimator, x, y, dataは入力必須）
(estimator, x, y, data, hue=None, linecolor='red', rounddigit=3,
 scores='mae', cv_stats='mean', cv=None, cv_seed=42,
 estimator_params=None, fit_params=None, subplot_kws=None)

**・表示例**
irisデータセット＋ランダムフォレスト回帰RandomForestRegressorでの実行例

```python
from sklearn.ensemble import RandomForestRegressor
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris)
```
実行すると下図のようなグラフ(予測値vs実測値プロット＋評価指標)が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/da344175-be06-6b38-9f87-6a16629cd166.png)

### hue
散布図の色分け用カラム名(列名)を指定します。

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           hue='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/97664ea5-2142-a95e-0e53-caf0330b7e34.png)

### linecolor
予測値=実測値の線の色を指定します。色は[matplotlibに準拠します](https://pythondatascience.plavox.info/matplotlib/%E8%89%B2%E3%81%AE%E5%90%8D%E5%89%8D)。

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           linecolor='green')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a7abc42b-9dd8-6be9-fdaa-61c9bb0082f4.png)

### rounddigit
評価指標の数値表示の丸め桁数を指定します。

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           rounddigit=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/15e8a30c-b140-dc68-c388-1746764dc9a1.png)

### rank_number
誤差上位何番目までを文字表示するかを指定します。
引数rank_colを指定すれば、一緒に表示する列も指定可能です
（rank_col指定なしのときは、データのインデックスを表示）

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           rank_number=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7c4428d9-029c-4363-faf7-821ef743e65f.png)

※クロスバリデーション指定時は、全体で順位付けするregression_pred_trueやregression_heat_plotメソッドと異なり、クロスバリデーションごとに順位付けするので注意

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           rank_number=2, cv=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/80e159bb-6f56-c12f-77cb-6e1c4a9c5e30.png)

### rank_col
引数rank_number指定時に、一緒に表示する列を指定します。

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           rank_number=2, rank_col='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/56c69ea0-afe5-1e16-dfcf-10b0dc34127d.png)

リスト指定すれば、複数の列を同時表示することもできます
（表示がごちゃごちゃするのであまりオススメはできませんが‥）

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           rank_number=2, rank_col=['species', 'sepal_width'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/08a7db19-3821-a95a-4316-1193f9876a89.png)

### scores
文字表示する評価指標を指定します。
指定できる指標一覧は下記です

|名称|指定時の文字列|
|---|---|
|R2-Score|'r2'|
|MAE|'mae'|
|RMSE|'rmse'|
|RMSLE|'rmsle'|
|誤差最大値|'max_error'|

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           scores='r2')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e7002d19-710c-5f95-2cc3-0c5917290e73.png)

None指定すれば、指標表示を消せます

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           scores=None)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/bc4780e4-e6ba-c2fe-75e9-eea21fe3920e.png)

リスト指定すれば、複数の指標を同時表示することもできます

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           scores=['rmse','rmsle','max_error'])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/5f73daef-f446-7b1f-fd98-8ae4428edd41.png)

クロスバリデーション指定時は、クロスバリデーションごとの図にはクロスバリデーション内テストデータでの指標を、全体結果の図にはcv_stats引数で指定した指標統計値＋全体データで学習＆指標算出した場合の値 (_trainとついた指標)をプロットします。

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           scores=['mae', 'rmse'], cv_stats='mean', cv=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/45c751c4-7e4c-4c88-528a-f565fea186dc.png)

### cv_stats
クロスバリデーション指定時に、全体結果の図に表示する指標の統計値を指定します。
'mean'(平均値)、'median'(中央値)、'max'(最大値)、'min'(最小値)が指定できます。

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           scores=['mae', 'rmse'], cv_stats='median', cv=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d7161f2d-f656-fa8a-b9ec-e8bf8ced42f8.png)

### cv
クロスバリデーション分割法を指定します。
数値を指定すれば、指定した数に応じて通常のK-Foldで分割します

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           cv=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/ba639ea1-d471-af84-4734-f1479b03767f.png)

Scikit-LearnのAPIに対応していれば、ShuffleSplit、GroupKFoldなどの特殊な分割法にも対応しています。
※Leave-One-Outは図の数が激増するのを防ぐため非対応なので、regression_pred_trueメソッドを使用してください

```python
from sklearn.model_selection import ShuffleSplit
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           cv=ShuffleSplit(n_splits=2, test_size=0.1))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/0ddb1134-67c2-4a08-fd0b-99fec3f73c8f.png)

GroupKFold、LeaveOneGroupOutなどのグルーピング系の分割法では、引数"hue"で指定したグループを分割に使用します。

```python
from sklearn.model_selection import LeaveOneGroupOut
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           cv=LeaveOneGroupOut(), hue='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/2e96fa9a-4a79-df5e-9614-08283a54e75c.png)

### cv_seed
引数"cv"で数値指定した際の、クロスバリデーション指定時の乱数シードを指定します
（デフォルトでは乱数シード42を使用しています）

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                             cv=2, cv_seed=43)
```

### estimator_params
回帰モデルに渡すパラメータをdict指定します。
理想的には、チューニング後のパラメータを渡すのが望ましいです。
（未指定ならば、scikit-learnのデフォルトパラメータを使用します）

```python:チューニング後のパラメータを渡せばmae良化
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           cv=2,
                           estimator_params={'n_estimators': 151,
                                         'max_features': 1,
                                         'max_depth': 173,
                                         'min_samples_split': 14,
                                         'min_samples_leaf': 1})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/2d185a74-4c1b-8417-677f-12d8723295fa.png)

### fit_params
学習時の"fit"メソッドに渡すパラメータをdict指定します。
XGBoostやLightGBMにおける"early_stoppling_round", "verbose"パラメータなどを想定しています。

```python:XGBoostでearly_stoppling_round等を指定
from xgboost import XGBRegressor
regplot.regression_plot_1d(XGBRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           cv=2,
                           fit_params={'early_stopping_rounds': 20,
                                       'eval_set': [(iris[['petal_length']].values, iris['sepal_length'].values)],
                                       'verbose': 1})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/011a5be8-1a61-12c1-24d5-3a898183646c.png)

### subplot_kws
画像作成用メソッドmatplotlib.pyplot.subplotsに渡す引数をdict指定できます。
渡せる引数は、[こちら](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#22-pltsubplots)や[こちら](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#11-pltfigure)をご参照ください

下の例のように、画像のサイズ（'figsize'、デフォルトはCV指定なしなら成り行き、CV指定ありなら画像1枚あたり6×6インチ）を変えたいときなどに便利です

```python
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           cv=2, subplot_kws={'figsize': (3, 9)})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/efc173b5-e793-1597-a320-62f47162dcee.png)

### scatter_kws
散布図描画用メソッドseaborn.scatterplot()に渡す引数をdict指定できます。
渡せる引数は、[こちら](https://seaborn.pydata.org/generated/seaborn.scatterplot.html)をご参照ください

```python:散布図マーカーの色を緑に
regplot.regression_plot_1d(RandomForestRegressor(), x='petal_length', 
                           y='sepal_length', data=iris,
                           scatter_kws={'color': 'green'})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/eceab020-1231-ce59-97bb-98ecbd316829.png)

## regression_heat_plotの引数

|引数名|必須引数orオプション|型|デフォルト値|内容|
|---|---|---|---|---|
|estimator|必須|Scikit-learn API|-|表示対象の回帰モデル|
|x|必須|List[str]|-|説明変数に指定するカラム名のリスト|
|y|必須|str|-|目的変数に指定するカラム名|
|data|必須|pd.DataFrame|-|入力するデータ（Pandasのデータフレーム）|
|x_heat|オプション|List[str]|None|説明変数のうちヒートマップ表示対象のカラム名|
|scatter_hue|オプション|str|None|散布図色分け指定カラム名（plot_scatter='hue'時のみ有効）|
|pair_sigmarange|オプション|float|1.5|ヒートマップ非使用変数の分割範囲|
|pair_sigmainterval|オプション|float|0.5|ヒートマップ非使用変数の1枚あたり表示範囲|
|heat_extendsigma|オプション|float|0.5|ヒートマップ縦軸横軸の表示拡張範囲|
|heat_division|オプション|int|30|ヒートマップ縦軸横軸の解像度|
|value_extendsigma|オプション|float|0.5|ヒートマップの色分け最大最小値拡張範囲|
|plot_scatter|オプション|str|'true'|散布図の描画種類|
|rounddigit_rank|オプション|int|3|誤差上位表示の小数丸め桁数|
|rounddigit_x1|オプション|int|2|ヒートマップ横軸の小数丸め桁数|
|rounddigit_x2|オプション|int|2|ヒートマップ縦軸の小数丸め桁数|
|rounddigit_x3|オプション|int|2|ヒートマップ非使用軸の小数丸め桁数|
|rank_number|オプション|int|None|誤差上位何番目までを文字表示するか|
|rank_col|オプション|str|None|誤差上位と一緒に表示するフィールド名|
|cv|オプション|int or sklearn.model_selection.* |None|クロスバリデーション分割法 (Noneのとき学習データから指標算出、int入力時はkFoldで分割)|
|cv_seed|オプション|int|42|クロスバリデーションの乱数シード|
|cv_group|オプション|str|None|GroupKFold,LeaveOneGroupOut等のグルーピング対象カラム名|
|display_cv_indices|オプション|int|0|表示対象のクロスバリデーション番号|
|estimator_params|オプション|dict|None|回帰モデルに渡すパラメータ|
|fit_params|オプション|dict|None|学習時のパラメータをdict指定|
|subplot_kws|オプション|dict|None|matplotlib.pyplot.subplotsに渡す引数|
|heat_kws|オプション|dict|None|ヒートマップ用のseaborn.heatmap()に渡す引数|
|scatter_kws|オプション|dict|None|散布図用のmatplotlib.pyplot.scatter()に渡す引数|
オプション引数の詳細は後述します

### オプション引数を指定しないとき
下記の値が自動入力されます（estimator, x, y, dataは入力必須）
(estimator, x, y, data, x_heat = None, scatter_hue=None,
 pair_sigmarange = 1.5, pair_sigmainterval = 0.5,
 heat_extendsigma = 0.5, value_extendsigma = 0.5, heat_division = 30,
 plot_scatter = 'true', rank_number=None, rank_col=None, rounddigit_rank=3,
 rounddigit_x1=2, rounddigit_x2=2, rounddigit_x3=2,
 cv=None, cv_seed=42, display_cv_indices = 0,
 estimator_params=None, fit_params=None, subplot_kws=None, heat_kws=None, scatter_kws=None)

**・表示例**
irisデータセット＋ランダムフォレスト回帰RandomForestRegressorでの実行例

```python
from sklearn.ensemble import RandomForestRegressor
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris)
```
実行すると下図のようなグラフ(予測値vs実測値プロット＋評価指標)が表示されます
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1e4c6db8-7a77-396e-572a-5c842c4b029f.png)

### x_heat
**3説明変数以上のときのみ有効**なのでご注意ください
説明変数のうち、ヒートマップの横軸と縦軸のカラム名を指定します。
指定しなかった説明変数を使い、
「pair_sigmarange引数 × 標準偏差」の範囲内で、
「pair_sigmainterval引数 × 標準偏差」ごとに一定間隔で図を分割します。
※Noneを指定すると、引数"x"で指定した説明変数の前から2個を自動指定します。

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['sepal_width', 'petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             x_heat=['petal_length', 'petal_width'],
                             pair_sigmarange = 1.0, pair_sigmainterval = 0.5)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/0f505351-9980-e490-5fee-a6f17b5de2b3.png)
コツとしては、ヒートマップで目的変数の変化が追いやすいよう、
**目的変数に対する影響度が大きい説明変数を指定**することです。
（影響度の大きさは、[後述の「特徴量重要度」](https://qiita.com/c60evaporator/items/c930c822b527f62796ee#%E7%89%B9%E5%BE%B4%E9%87%8F%E9%87%8D%E8%A6%81%E5%BA%A6feature-importance)などで算出可能）

### scatter_hue
散布図の色分け用カラム名(列名)を指定します。引数plot_scatter='hue'も同時指定する必要があることにご注意ください

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             scatter_hue='species', plot_scatter='hue')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fa3de6a2-8389-5ff8-c84f-c3a9aa684304.png)

### pair_sigmarange
**3説明変数以上のときのみ有効**なのでご注意ください
ヒートマップ非使用変数（x_heatで未指定の説明変数）での図の分割範囲を指定します。
「pair_sigmarange引数 × 標準偏差」の範囲内で、
「pair_sigmainterval引数 × 標準偏差」ごとに一定間隔で図を分割します。

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['sepal_width', 'petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             x_heat=['petal_length', 'petal_width'],
                             pair_sigmarange = 0.5, pair_sigmainterval = 0.5)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/e60f0ca3-8747-931a-fb89-731297ce58b7.png)
なお、表示されるヒートマップにおける**ヒートマップ非使用変数の値**は、
・pair_sigmarange範囲内の図：pair_sigmaintervalの中央値
・pair_sigmarange範囲外の図(最初の図)：-pair_sigmarange - pair_sigmainterval/2
・pair_sigmarange範囲外の図(最後の図)：pair_sigmarange + pair_sigmainterval/2
を使用します

### pair_sigmainterval
**3説明変数以上のときのみ有効**なのでご注意ください
ヒートマップ非使用変数（x_heatで未指定の説明変数）での図の分割範囲を指定します。
「pair_sigmarange引数 × 標準偏差」の範囲内で、
「pair_sigmainterval引数 × 標準偏差」ごとに一定間隔で図を分割します。

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['sepal_width', 'petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             x_heat=['petal_length', 'petal_width'],
                             pair_sigmarange = 0.5, pair_sigmainterval = 0.25)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7d19d5be-960d-2604-a0f3-7ccd0a33c13d.png)

### heat_extendsigma
ヒートマップ縦軸横軸の表示拡張範囲を指定します。
散布図データの最大最小値に対し、「heat_extendsigma × 標準偏差」だけ縦軸横軸範囲を拡張します

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             heat_extendsigma=3.0)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/90f6da18-305f-a6a0-2b41-e7d6d6c21e93.png)

### heat_division
ヒートマップ縦軸横軸の解像度を指定します。
ヒートマップ全体を、ここで指定した数のグリッド数で分割します

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             heat_division=10)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9b88c8c2-dd59-3993-a8cb-5d6c4d6c8cf2.png)

### plot_scatter
散布図の色分け方法を選択します。下表から選択できます

|plot_scatterの指定値|散布図の色分け方法|
|---|---|
|'error'|誤差（予測値-実測値）で色分け|
|'true'|実測値で色分け|
|'hue'|引数"scatter_hue"指定列で色分け|
|None|散布図表示なし|

#### plot_scatter='error'のとき
誤差（予測値-実測値）で散布図を色分けします

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             plot_scatter='error')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1de99e42-a35a-84a8-b9f7-cff824e1588c.png)

#### plot_scatter='true'のとき
実測値で散布図を色分けします（これがデフォルト設定）

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             plot_scatter='error')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/4b192fdf-8c91-055b-161c-35fcca2156b2.png)

#### plot_scatter='hue'のとき
引数scatter_hueで指定した列の値で散布図を色分けします。
引数scatter_hueも同時指定する必要があることにご注意ください

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             plot_scatter='hue', scatter_hue='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/fa3de6a2-8389-5ff8-c84f-c3a9aa684304.png)

#### plot_scatter=Noneのとき
散布図をプロットしません

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             plot_scatter=None)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1baea70b-b8c5-e71c-0171-b45ba1cbface.png)

### rounddigit_rank
誤差上位表示の小数丸め桁数を指定します。
引数rank_numberも同時指定する必要があることにご注意ください

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rounddigit_rank=5, rank_number=1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/2890731e-9fe2-d97f-17d2-d00947f78427.png)

### rounddigit_x1
ヒートマップ横軸の小数丸め桁数を指定します

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rounddigit_x1=4)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/aefe7559-bcd5-d736-cfb6-0ee720a7b342.png)

### rounddigit_x2
ヒートマップ縦軸の小数丸め桁数を指定します

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rounddigit_x2=4)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/50f2f9cd-d9bb-1b89-7cfb-87184e819364.png)

### rounddigit_x3
**3説明変数以上のときのみ有効**なのでご注意ください
ヒートマップ非表示変数の小数丸め桁数の小数丸め桁数を指定します
（各ヒートマップの上に表示される非表示変数の範囲表示の桁数です）

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['sepal_width', 'petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             x_heat=['petal_length', 'petal_width'],
                             pair_sigmarange = 0.5, pair_sigmainterval = 0.5,
                             rounddigit_x3=4)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/6985722f-dbbc-3f57-fb33-80c29074a20e.png)

### rank_number
誤差上位何番目までを文字表示するかを指定します。
引数rank_colを指定すれば、一緒に表示する列も指定可能です
（rank_col指定なしのときは、データのインデックスを表示）

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rank_number=4)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/f4703c06-ccbc-5a07-d867-65416d83c9ff.png)
見ての通り表示が重なりやすいので、引数subplot_kwsと併用して図を大きくするのがおすすめです。

### rank_col
引数rank_number指定時に、一緒に表示する列を指定します。

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             rank_number=1, rank_col='species')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/41f6c477-3710-31ad-e176-ad43c8a2d57b.png)

### cv
クロスバリデーション分割法を指定します。

数値を指定すれば、指定した数に応じて通常のK-Foldで分割します。
regression_pred_trueやregression_plot_1dメソッドと異なり、デフォルトではクロスバリデーションの最初のセクション（CV_Number=0）の結果のみがプロットされます。

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7d00e4eb-58bb-bd6c-75fa-5531e26031f5.png)

全てのセクションの結果をプロットしたい場合、引数"display_cv_indices"でCV_Numberをリスト指定します

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2, display_cv_indices=[0, 1])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a0038536-6656-b0ef-4897-996148ef1a5d.png)

Scikit-LearnのAPIに対応していれば、ShuffleSplit、GroupKFoldなどの特殊な分割法にも対応しています。
※Leave-One-Outは図の数が激増するのを防ぐため非対応なので、regression_pred_trueメソッドを使用してください

```python
from sklearn.model_selection import ShuffleSplit
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                           y='sepal_length', data=iris,
                           cv=ShuffleSplit(n_splits=2, test_size=0.1))
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9ad11cbb-c72e-de6f-c385-2595b787130b.png)

GroupKFold、LeaveOneGroupOutなどのグルーピング系の分割法では、引数"scatter_hue"で指定したグループを分割に使用します。

```python
from sklearn.model_selection import LeaveOneGroupOut
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                           y='sepal_length', data=iris,
                           cv=LeaveOneGroupOut(), scatter_hue='species',
                           display_cv_indices=[0, 1, 2], plot_scatter='hue')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/f60a5088-f83d-fd94-05fa-fd2856afab4c.png)

引数scatter_hue指定時は本来であればplot_scatter='hue'とする必要がありますが、GroupKFold、LeaveOneGroupOutなどのグルーピング系の分割法指定時のみ、plot_scatter='hue'以外での色分け（'true', 'error'など）も可能となっています

```python
from sklearn.model_selection import LeaveOneGroupOut
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                           y='sepal_length', data=iris,
                           cv=LeaveOneGroupOut(), scatter_hue='species',
                           display_cv_indices=[0, 1, 2], plot_scatter='true')
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/497894eb-44d0-745d-b4b1-973a5bf3ec16.png)

### cv_seed
引数"cv"で数値指定した際の、クロスバリデーション指定時の乱数シードを指定します
（デフォルトでは乱数シード42を使用しています）

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2, cv_seed=43)
```
### display_cv_indices
クロスバリデーション分割時に、ヒートマップ表示するクロスバリデーション番号を指定します。

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2, display_cv_indices=1)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a59362c5-beb6-ebab-d85a-d2901c17844c.png)

[前述のように](https://qiita.com/c60evaporator/items/c930c822b527f62796ee#cv-2)、リスト指定で複数のクロスバリデーション番号でのヒートマップを同時表示させることも可能です

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2, display_cv_indices=[0, 1])
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a0038536-6656-b0ef-4897-996148ef1a5d.png)

### estimator_params
回帰モデルに渡すパラメータをdict指定します。
理想的には、チューニング後のパラメータを渡すのが望ましいです。
（未指定ならば、scikit-learnのデフォルトパラメータを使用します）

```python:チューニング後のパラメータを渡して汎化性向上
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2,
                             estimator_params={'n_estimators': 108,
                                           'max_features': 2,
                                           'max_depth': 167,
                                           'min_samples_split': 6,
                                           'min_samples_leaf': 5})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/bed29488-d59b-ae20-0058-1e0b14e14934.png)

### fit_params
学習時の"fit"メソッドに渡すパラメータをdict指定します。
XGBoostやLightGBMにおける"early_stoppling_round", "verbose"パラメータなどを想定しています。

```python:XGBoostでearly_stoppling_round等を指定
from xgboost import XGBRegressor
regplot.regression_heat_plot(XGBRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2,
                             fit_params={'early_stopping_rounds': 20,
                                         'eval_set': [(iris[['petal_width', 'petal_length']].values, iris['sepal_length'].values)],
                                         'verbose': 1})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/7997fd61-482d-8859-4740-72cbc673205c.png)

### subplot_kws
画像作成用メソッドmatplotlib.pyplot.subplotsに渡す引数をdict指定できます。
渡せる引数は、[こちら](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#22-pltsubplots)や[こちら](https://qiita.com/nkay/items/d1eb91e33b9d6469ef51#11-pltfigure)をご参照ください

下の例のように、画像のサイズ（'figsize'、デフォルトは画像1枚あたり6×5インチ）を変えたいときなどに便利です

```python
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             cv=2, subplot_kws={'figsize': (3, 3)})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/d4dc0a85-60bf-6ab4-82bf-00d8bdf7f494.png)

### heat_kws
ヒートマップ描画用メソッドseaborn.heatmap()に渡す引数をdict指定できます。
渡せる引数は、[こちら](https://seaborn.pydata.org/generated/seaborn.heatmap.html)や[こちら](https://matplotlib.org/stable/api/_as_gen/matplotlib.axes.Axes.pcolormesh.html)をご参照ください

```python:ヒートマップのカラーマップをHSVに変更
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             heat_kws={'cmap': 'hsv'})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9075f139-8072-10c8-71ed-29390b0321aa.png)

### scatter_kws
散布図描画用メソッドmatplotlib.pyplot.scatter()に渡す引数をdict指定できます。
渡せる引数は、[こちら](https://matplotlib.org/stable/api/_as_gen/matplotlib.pyplot.scatter.html)をご参照ください

```python:散布図マーカーを三角形に変更
regplot.regression_heat_plot(RandomForestRegressor(), x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris,
                             scatter_kws={'marker': 'v'})
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/c0063f19-9d4d-95fb-eadc-8a41c11a656e.png)

# 補足：パイプライン処理への対応
標準化等の前処理と組み合わせた回帰モデルを構築したいとき、Scikit-Learnではパイプライン処理がよく使われますが、本ツールの入力にもパイプライン処理が適用できます

```python:サポートベクター回帰＋標準化での適用例
from sklearn.svm import SVR
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler

pipe = Pipeline([("scaler", StandardScaler()), ("svr", SVR())])  # 標準化＋SVRパイプライン
regplot.regression_heat_plot(pipe, x=['petal_width', 'petal_length'],
                             y='sepal_length', data=iris)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/f641d453-40ac-3a61-b2ce-ad2c0e38571a.png)

# 余談：その他の便利な回帰可視化テクニック
他のライブラリで簡単に実装できるため本ツールでは触れていませんが、回帰の可視化には、以下のようなテクニックもよく使われています。
## 特徴量重要度（Feature Importance）
Random ForestやXGBoost、LightGBMなどの決定木系の回帰アルゴリズムには、
目的変数の予測に対する、各説明変数の寄与度を定量的にランク付けした、
**「特徴量重要度 (feature importance)」**と呼ばれる指標が存在します。

```python:XGBoostでの実装例
from xgboost import XGBRegressor
import matplotlib.pyplot as plt
# モデルの学習
xgbr = XGBRegressor()
features = ['sepal_width', 'petal_width', 'petal_length']
X = iris[features].values
y = iris['sepal_length'].values
xgbr.fit(X, y)
# 特徴量重要度の取得と可視化
importances = list(xgbr.feature_importances_)
plt.barh(features, importances)
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/5de02887-a409-8662-701e-acddf9c925ed.png)

この指標は**「どの変数が予測に寄与したか」**という、回帰結果を解釈する上で重要な知見を与えてくれます

詳しくは、
[こちら](https://note.com/y_katayama/n/n5882e9b2d15b)や[こちら](https://qiita.com/TomokIshii/items/290adc16e2ca5032ca07)が分かりやすいかと思います。

## 残差プロット
・横軸に目的変数の予測値あるいは説明変数の一部
・縦軸に目的変数の誤差（予測値 - 実測値）
をとった散布図を、**残差プロット**と呼びます。

残差プロットは**誤差が**目的変数、または説明変数によらず**一定であること**を評価します。

```python:横軸に目的変数の予測値を取った場合の実装例
from sklearn.linear_model import LinearRegression
import matplotlib.pyplot as plt
import numpy as np
# モデルの学習
lr = LinearRegression()
features = ['petal_width', 'petal_length']
X = iris[features].values
y = iris['sepal_length'].values
lr.fit(X, y)
# 残差プロット(横軸は目的変数予測値)
y_pred = lr.predict(X)
error = y_pred - y
plt.scatter(y_pred, error)
plt.xlabel('y_pred')
plt.ylabel('error')
# 残差=0の補助線を引く
plt.plot([np.amin(y_pred), np.amax(y_pred)], [0, 0], "red")
```
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/1ca35ae9-6f3b-b8b8-bfc9-2ee8774f325d.png)

多くの機械学習による回帰モデルは、誤差の平均および標準偏差が目的変数や説明変数によらず一定であることを前提としているため、
残差プロットが下図のあるべき姿となっていない場合、モデルの適合性不足が疑われ、何らかの改善策を検討する必要が生じます。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/0c2408c5-b5d5-a117-7587-aabc19a2572d.png)

代表的な適合性不足の例としては、

**・誤差が右肩上がり（右肩下がり）となっているとき（誤差平均の拡大）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/a6b2d267-c8b8-f264-94de-d32eb9216879.png)
→現状のモデルはデータの傾向にフィットしきれていない（未学習状態）ため、より複雑なモデルを採用
（例：線形回帰 → 多項式回帰、あるいはRBFカーネルSVRなど非線形な回帰手法を採用）
<br>
**・誤差が末広がりとなっているとき（ばらつきの拡大）**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/0ad88d2d-facb-b9f3-d514-255ec2536b5d.png)
→分散が説明変数に依存して大きくなるため、依存する説明変数を特定したのちモデルに組み込む
（例：線形回帰 → 分散が説明変数に比例するベイズ回帰モデル）

詳細は[こちらの資料](http://cogpsy.educ.kyoto-u.ac.jp/personal/Kusumi/datasem11/goto.pdf)が分かりやすいです。

# 余談：各機械学習アルゴリズムの回帰ヒートマップ可視化
ヒートマップで可視化すると、各アルゴリズムの特性がわかり面白いと感じたので、
Irisデータセット（説明変数['petal_width','petal_length']、目的変数'sepal_length'）での可視化例を下記します。
※パラメータチューニングしていないので、各手法の最大性能を出せているわけではありません。あくまで傾向を見るための可視化です
### 線形回帰
一定の傾き＆方向の等高線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/843dbcfe-76e5-c36f-3dc9-d38becb89396.png)

### リッジ回帰（α=1）
線形回帰と似た傾向
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/24b01efb-3d26-a1dc-ecec-5d52a2d910f9.png)

### リッジ回帰（α=100）
ほぼ縦方向（petal_length方向）の傾きのみ
→正則化によりpetal_widthの影響がほぼ消えた
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/9bd170e1-62ca-d221-50b0-83601c54bfea.png)

### ランダムフォレスト回帰
縦横のジグザグ等高線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/93f5dba2-7049-b8d3-adb2-46659d76eb0d.png)

### サポートベクター回帰（RBFカーネル）
曲線的な等高線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/ac6cf661-b78d-a427-17dd-d01e936b04f7.png)

### XGBoost
ランダムフォレスト回帰と似たジグザグ等高線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/6a2b40ad-0049-69dd-a54e-dde0b8d85870.png)

### LightGBM
ランダムフォレスト回帰と似たジグザグ等高線
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/ad5d68ed-618e-1128-ea32-91b7f953b810.png)

# 関連記事
本記事は、データの可視化をテーマとしたシリーズものです。よければ下記の記事もどうぞ
**・[分類の可視化](https://qiita.com/c60evaporator/items/43866a42e09daebb5cc0)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/43640b02-ba88-0e67-ad09-911c9ab43c8a.png)
**・[散布図と相関係数でデータを一括確認](https://qiita.com/c60evaporator/items/20f11b6ee965cec48570)**
![ggpairs_titanic_box_huesurvived.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/aa6b10c7-bb4d-f2be-cce3-81fd50028744.png)
**・[分布の種類を判断](https://qiita.com/c60evaporator/items/fc531aff0cdbafac0f42)**
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/bb3ce2c5-ccec-a009-8e78-2503fdd87a9a.png)
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/610167/39ca660d-0dbd-0570-0ccb-a9b2ad88ade0.png)