機械学習ネタ。ピアソンの相関係数をヒートマップ化してプロットするには。

スポンサーリンク
Post image

Udemyのデータサイエンス講習は一通りやってしまったので、復習するのもいいけど何か新しいことをやりたいと思い…

これを買ってしまいました。

大学数学から離れて10年以上立つので正直きついですが、かなり掘り下げて解説してくれるので理解が深まります。

その中でも、やってみて面白かったことを備忘録と練習を兼ねて、本書とは別のデータセット、irisデータを使い、特徴量同士の相関をヒートマップ化してみようと思います。

まずは特徴量同士のpairplot出力を見てみます。

この図を出すには、以下のようにします。

import numpy as np  
import seaborn as sns  
import pandas as pd  
from sklearn.datasets import load_iris

iris = load_iris()  
iris_df = pd.DataFrame(iris["data"], columns=iris["feature_names"])  
iris_df = pd.concat([iris_df, pd.DataFrame(iris["target"], columns=["target",])], axis=1)

sns.pairplot(iris_df, hue="target")  
sns.plt.show()  

このpairplot、相関の有無やクラスタを見た目で判断できて便利なんですが、相関の強さを数値化できたら… どのデータを重点的に見れば良いか分かるので、更に便利。なはず。

ということで、各特徴量同士のピアソンの相関係数を計算して、ヒートマップとしてプロットしてみます。値が大きいほど相関が強いということですね。

この図を出すには、さっきのpairplot出力コードに続けて、以下のようにします。

hm = np.corrcoef(iris_df[iris_df.columns[:-1]].T)  
sns.heatmap(hm, annot=True, xticklabels=iris_df.columns[:-1], yticklabels=iris_df.columns[:-1])  
sns.plt.show()  

petal lengthとpetal widthが最も強い相関を示すのが、数値で示せましたね。pairplotでも見た目そうであることが分かりますが、こちらの方がより明確になりました。

ちょっと解説

sklearn.datasetsがload_iris()関数を提供してくれているので、こちらを使いました。load_iris()["data"]はnumpy.ndarray型のデータを返すので、columnsを設定したpandas.DataFrame型に変換してやると、後でデータを俯瞰する際に便利です。

iris = load_iris()

iris.keys()  
dict_keys(['target_names', 'data', 'feature_names', 'target', 'DESCR'])

iris.feature_names  
['sepal length (cm)',
 'sepal width (cm)',
 'petal length (cm)',
 'petal width (cm)']

上記のデータを以下のコードでDataFrame形式に変換し、

iris_df = pd.DataFrame(iris["data"], columns=iris["feature_names"])  

以下のコードで目的変数も上記DataFrame形式データに連結しちゃったわけですね。

iris.target  
array([0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,  
       0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
       0, 0, 0, 0, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1,
       1, 1, 1, 1, 1, 1, 1, 1, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2])

iris.target_names  
array(['setosa', 'versicolor', 'virginica'],  
      dtype='<U10')

iris_df = pd.concat([iris_df, pd.DataFrame(iris["target"], columns=["target",])], axis=1)  

こうしておくと、pairplotする際にhue指定してクラスタが見分けやすくなったりと、後々嬉しいことがたくさんあります。

ということで、またPython機械学習プログラミング 達人データサイエンティストによる理論と実践を進めたら、何か練習用の課題を設定して公開しようと思います。

それではまた。

comments powered by Disqus