【Python】ロジスティック回帰とK-means法で多クラス分類

f:id:Medicmed:20180628071531j:plain

ロジスティック回帰とK-means法で多クラス分類ができる!

今回は、ロジスティック回帰とK-means法を用いた多クラス分類について記事にしたいと思います。
ロジスティック回帰については以前記事にしているので、先にK-means法についてサラッと紹介したいと思います。

www.medicalmed.press

K-means法について

K-means法は最もシンプルなクラスタリングの手法です。
データをk個のクラスタに分類するため、各スラスタ内のデータ平均(クラスタの中央)と、各データとの差の二乗和を最小化して、データを分類するクラスタを見つける手法になっています。
K-means法によるクラスタリングによる機械学習では

①各データの初期クラスタを決める

②各クラスタに属するデータの平均から各クラスタの中心を求める

③各データとその他のクラスタの中心との距離を求める

④より近いクラスタがあればデータが属するクラスタを修正する

という処理を行い、②〜④の学習を繰り返してクラスタの中心を求めることになります。

実際にJupyter-notebookを使用して書いていきます。
前準備として

from sklearn import cluster
from sklearn import datasets
import matplotlib.pyplot as plt
import seaborn as sns
import pandas as pd
sns.set()

datasetsモジュールのmake_blobs()関数を使用すると、クラスタリングを行うために有用なデータを生成することができます。
今回はサンプル数「500」でクラスタ数「5」を指定し、説明変数の数を「2」としています。

data, label = datasets.make_blobs(n_samples=500,n_features=2,centers=5)
e = cluster.KMeans(n_clusters=5)
e.fit(data)

取得してきたデータをPandasのデータフレームに変形します。

data_df = pd.DataFrame(data)
label_df = pd.DataFrame(label)
sample_df = pd.concat([data_df,label_df],axis=1)
sample_df.columns=["x","y","label"]
sample_df.head()

f:id:Medicmed:20180628065357p:plain

このようにデータフレームの形に変形します。
Seabornのpairplot()を使用してグラフを書いてみます。
palette=”husl”としてカラーをオシャレにできます。

sns.pairplot(sample_df,hue="label",palette="husl")
Seabornのpairplot()

f:id:Medicmed:20180628065612p:plain

varsという引数を使うと、指定した変数だけでpairplot()を作成してくれます。

sns.pairplot(sample_df,vars=["x","y"],size=8,hue="label",palette="husl",markers=["o","s","D","p","*"])
varを指定したpairplot()

f:id:Medicmed:20180628065853p:plain

単純に散布図を描くだけなら、Seabornのregplot()でもできます。デフォルトだと回帰直線を引くので「fit_reg=False」とします。

plt.figure(figsize=(8,8))
sns.regplot(sample_df["x"],sample_df["y"],fit_reg=False)
regplot()を使用した散布図のグラフ

f:id:Medicmed:20180628070226p:plain

色分けして、クラスタの中心も一緒にプロットするにはpyplotのscatter()を使用するのがベターかもしれません。

plt.figure(figsize=(10,10))
plt.scatter(data[:,0], data[:,1], marker="o", s=300, c=e.labels_,edgecolors="blue")
plt.scatter(e.cluster_centers_[:,0],e.cluster_centers_[:,1],marker="*",c="blue",s=300)
pyplotを使用してクラスタの中心も一緒に描写

f:id:Medicmed:20180628070604p:plain

コメントを残す

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です

このサイトはスパムを低減するために Akismet を使っています。コメントデータの処理方法の詳細はこちらをご覧ください