データをクラスタリング解析する教師なし学習手法のKMeansを、実装・解説します。
本シリーズでは、Pythonを使用して機械学習を実装する方法を解説します。
各アルゴリズムの数式だけでなく、その心、意図を解説していきたいと考えています。
本記事ではKMeansとMiniBatchKMeansを実装します。
以下のscikit-learnマップの黒矢印に対応します。
KMeans, MiniBatch-KMeansの実装
本記事では、3つの異なる品種のブドウから作られたワインのプロリンの量と色から分類する課題に取り組みます。
本来はワインがどのブドウから作られたかという教師データがありますが、教師データは知らないものとして3つに分類します。
まずは実装コードと結果をご覧ください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 | # 1:ライブラリのインポート-------------------------------- import numpy as np #numpyという行列などを扱うライブラリを利用 import pandas as pd #pandasというデータ分析ライブラリを利用 import matplotlib.pyplot as plt #プロット用のライブラリを利用 from sklearn import cluster, preprocessing #機械学習用のライブラリを利用 from mlxtend.plotting import plot_decision_regions #学習結果をプロットする外部ライブラリを利用 # 2:Wineのデータセットを読み込む-------------------------------- df_wine_all=pd.read_csv('https://archive.ics.uci.edu/ml/machine-learning-databases/wine/wine.data', header=None) #品種(0列、1~3)と色(10列)とプロリンの量(13列)を使用する df_wine=df_wine_all[[0,10,13]] df_wine.columns = [u'class', u'color', u'proline'] pd.DataFrame(df_wine) #この行を実行するとデータが見れる # 3:データの整形------------------------------------------------------- X=df_wine[["color","proline"]] sc=preprocessing.StandardScaler() sc.fit(X) X_norm=sc.transform(X) # 4:プロットしてみる------------------------------------------ %matplotlib inline x=X_norm[:,0] y=X_norm[:,1] z=df_wine["class"] plt.subplot(2, 1, 1) plt.scatter(x,y, c=z) plt.show # 解説4:ミニバッチk-meansやk-meansを実施--------------------------------- #km=cluster.MiniBatchKMeans(n_clusters=3, batch_size=100) km=cluster.KMeans(n_clusters=3) z_km=km.fit(X_norm) # 5: 結果をプロット----------------------------------------------- plt.subplot(2, 1, 2) plt.scatter(x,y, c=z_km.labels_) plt.scatter(z_km.cluster_centers_[:,0],z_km.cluster_centers_[:,1],s=250, marker='*',c='red') plt.show |
上側が実際のラベリングで、下側がKMeansによってクラスタリングした結果です。
緑と黄色のごちゃっている部分は全部緑になってしまいましたが、概ね合っているように思えます。
赤い星は各クラスターの中心点です。
# 解説4:ミニバッチk-meansやk-meansを実施
#km=cluster.MiniBatchKMeans(n_clusters=3, batch_size=100)
km=cluster.KMeans(n_clusters=3)
z_km=km.fit(X_norm)
データ数が1万個よりも多い場合には、MiniBatchKMeansを使用することが推奨されています。
MiniBatchKMeansは、KMeansを、全データでなくbatch_size分のデータごとに更新する手法です。
ここで重要なのは、あらかじめクラスターの数を指定する必要があることです。
各クラスターの中心点の初期座標は、k-means++というアルゴリズムで自動生成されます。
KMeans, MiniBatchKMeansの心
正確な情報は以下をご覧ください。
●scikit-learnのMiniBatchKMeansの解説ページ
KMeansは教師なし学習の一種です。
データを自動的にクラスターに分けます。
KMeansではまず適当に設定した数の点を用意します。
ここではランダムではなく、kmeans++というアルゴリズムで、離れた点が生まれるようにしています。
各データが「生成した点」のどれに最も近いかを求め、各データが所属するクラスを決めます。
距離(ユークリッド距離)を計算するので、データは正規化しておく必要があります。
次にクラス分けされたデータの重心を求めます。
そこを中心点(クラスタ・センターor セントロイドと呼ぶ)として、また各データがどの中心点に近いかを求め、再度各データをクラス分けします。
そしてクラス分けされたデータの重心を求めます。
以上を繰り返し、中心点が変化しなくなったときにクラスタリング終了とします。
KMeansの注意点
KMeansは簡単で分かりやすい手法でクラスタリングできます。
ですが、注意点が2つあります。
1点目は事前にクラス数が分かっている必要があるということです。
2点目はデータが中心点から等方的に分布していると仮定している点です。
そのため、横方向に伸びて分布しているような場合(今回のデータの黄色)は、誤って他のクラスに分類されてしまいます。
今回は、答え(教師データ)が分かっているデータセットで、教師なし学習(クラスター分析)を実施しましたが、実際は正しい答えは分からないので、以上の2点に気をつけてください。
以上、Pythonとscikit-learnで学ぶ機械学習入門|第9回:KMeans, MiniBatchKMeansでのクラスター分析でした。
次回は、Spectral clusteringについて解説します。