データ間の非線形な相関関係を示す指標であるMICの係数行列を求める方法について。
原著論文はこちら。
Just a moment...
(本ページにて紹介しているコードはgithubにて公開しています。)
DataAnalOji.hatena.sample/python_samples/blog_MIC_coefficient_array.ipynb at master · Data-Anal-Ojisan/DataAnalOji.hatena.sample
samples for my own blog. Contribute to Data-Anal-Ojisan/DataAnalOji.hatena.sample development by creating an account on GitHub.
minepyのインストール
事前準備としてsetuptoolsをインストールしておき,minepyをインストール。
$ pip install 'setuptools >=14.0'
$ pip install minepy
以下MIC相関係数行列の計算方法について。
パッケージのインポート
# 数値処理
import pandas as pd
# MIC相関
from minepy import MINE
# グラフ描画
%matplotlib inline
import matplotlib.pyplot as plt
plt.style.use("ggplot")
plt.rcParams["font.family"] = "Meiryo"
import seaborn as sns
# サンプルデータ
from sklearn.datasets import load_boston
# 警告非表示化
import warnings
warnings.filterwarnings('ignore')
サンプルデータの読み込み
サンプルデータとして有名なboston_housingのデータセットを利用。
# サンプルデータのインスタンスを生成
boston = load_boston()
# 特徴量をデータフレームに格納
df = pd.DataFrame(boston.data, columns=boston.feature_names)
display(df)
MIC相関係数行列の計算
MICの相関係数行列を代入するためのデータフレームを作成し,forループ内でMIC相関係数の計算結果をデータフレームに代入する。
#インスタンスの生成
mine = MINE(alpha=1, c=0.1, est="mic_e")
# MIC相関行列用に空のデータフレームを作成
df_mic = pd.DataFrame(columns=df.columns, index=df.columns)
# forループ内でMIC相関係数を求め,先ほどのデータフレームに格納
for column in df.columns:
for index in df.columns:
# MIC相関係数の計算
mine.compute_score(df[column], df[index])
# 計算結果をデータフレームに書き込み
df_mic.loc[index, column] = mine.mic()
MIC相関係数行列のヒートマップ描画
seabornのheatmap()を利用して係数行列のヒートマップを描画する。
plt.figure(figsize=(8, 8))
sns.heatmap(df_mic.astype(float),
linewidths=1,
cmap='jet',
square=True,
annot=True,
vmax=1,
vmin=0,
center=0,
fmt="1.2f")
plt.axes().set_ylim(df_mic.shape[1], 0)
plt.tick_params(axis='y', which='major', labelsize=6)
plt.tick_params(axis='x', which='major', labelsize=6)
plt.grid(None)
plt.title("MIC相関のヒートマップ")
plt.tight_layout()
plt.show()
minepyの利用方法の詳細については公式ドキュメントを参照のこと。
Python API — minepy 1.2.6 documentation
コメント