学生による学生のためのデータサイエンス勉強会

【さきどりPython#8】K-平均法

 こんにちは。5/28の勉強会では前半にナイーブベイズクラス分類器、後半にK-平均法について勉強しました。

 私はk-平均法について調べて発表したので、この記事ではk-平均法についてまとめていきます。

ナイーブベイズクラス分類器についてはこちらをご覧ください!https://bdarc.net/naive-bayes-classifer/

K-平均法とは

 まず、K-平均法とはクラスタリングのひとつで教師なし学習の分類問題に使われる手法です。英語ではk-meansと書きます。

 ちなみに、英語でmeanは「平均の」という意味の形容詞、名詞だと「中央」や「中央値」という意味になります。名詞での「平均」はaverageです。どうして「k-平均法」という日本語訳になったのか不思議ですね。

 K-平均法とは簡単に言うと、もとのデータからグループ構造を自動的に見つけ出し、あらかじめ設定したk個のグループに分類していく方法です。また、得られたグループが何を意味するのかは人間が判断しなくてはいけません。

 名前が似ているのでよくK-最近傍法と間違えられることがありますが、K-最近傍法とK-平均法は全く別物です!どちらも分類問題に使われますが、そもそも「教師あり学習」か「教師なし学習」かという大きなちがいがあります。

ちなみにK-最近傍法についての記事はこちらhttps://bdarc.net/k-nearest-neighbors-classifier-myself-understanding/

k-平均法のアルゴリズム

 次にk-平均法のアルゴリズムについて見ていきます。scikit-learnにあるirisのデータをまねしながら図で説明していきますね。

STEP1.各データをランダムに振り分ける

 irisのデータはsetosa(ヒオウギアヤメ)とversicolor(ブルーフラック)、virginica(ヴァージニカ)の3つに分類されるので、クラスタ数をk=3に設定して、ランダムに各データを3つのクラスタに割り当てます。

STEP2.各クラスタの重心を求める

 各クラスタごとのデータの重心を求めます。

STEP3.各データを最も距離が近い重心に対応するクラスタに振り分けなおす

STEP4.新しい重心を求めて、その重心を移動させる

 以下、重心の位置が変化しなくなるまでSTEP2とSTEP3を繰り返します。

完成!

 ただし、最初に選んだデータの組み合わせによっては出力結果が異なることがあるので、何回かやって最良のものを選ぶのが良いです。

Irisデータを分類する

以下、irisデータをk-平均法で分類する場合のコードです。

#ライブラリのロード
from sklearn import datasets
from sklearn.preprocessing import StandardScaler
from sklearn.cluster import KMeans

#データをロード
iris=datasets.load_iris()
features=iris.data

#特徴量を標準化
scaler=StandardScaler()
features_std=scaler.fit_transform(features)

#K-平均法クラスタリングを作成
cluster=KMeans(n_clusters=3,random_state=0,n_jobs=-1) 

#k-平均法クラスタリングを訓練
model=cluster.fit(features_std)

#クラス予測値を表示
model.labels_
#0:'setosa', 1:'versicolor', 2:'virginica'
#array([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, 0, 0, 0, 2, 2, 2, 0, 2, 2, 2, 2, 2, 2, 2, 2, 0,
       2, 2, 2, 2, 0, 2, 2, 2, 2, 0, 0, 0, 2, 2, 2, 2, 2, 2, 2, 0, 0, 2,
       2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 2, 0, 2, 0, 0, 0, 0, 2, 0, 0, 0,
       0, 0, 0, 2, 2, 0, 0, 0, 0, 2, 0, 2, 0, 2, 0, 0, 2, 0, 0, 0, 0, 0,
       0, 2, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 0, 2, 0, 0, 2], dtype=int32)

 1の’versicolor’はきれいに分類されましたが、0の’setosa’と2の’virginica’は混じってしまいました。

 ’setosa’と’virginica’はデータを確認してみると花弁やがく弁の大きさは全然違いますが、実際に花の写真を見てみると似ているような気がします。実際のデータを確認して「どうしてその結果になったのか」を考えるのも大事ですね。

 また、K-平均法は大きすぎるデータを分類したり、自分でいくつのクラスタに分けられるかわからないデータを分類したりする場合には適していません。

 これらの欠点を補うためにミニバッチk-平均法平均値シフト法という手法があります。この二つの手法についてはまた別の記事で紹介しますね。

 最後までご覧くださり、ありがとうございました。

コメントを残す

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