2018年6月30日土曜日

k-means法の最適なクラスター数を選択する

都道府県別の飲み物の購入額をk-means法でクラスタリングするでは、Python3とscikit-learnを使ってk-means法によるクラスタリングを行ったが、このときにクラスター数は思いつきの5にした。この5という数字には何の根拠もないので、実際はベターなクラスター数がありうる。k-means法のクラスター数を決める方法としてシルエット分析とエルボー法があるので、この2つの方法で最適なクラスター数を求めてみる。参照は以下のサイト。



環境とクラスタリングするデータ


都道府県別の飲み物の購入額をk-means法でクラスタリングすると同じで、以下の環境とe-Statの全国消費実態調査 平成21年全国消費実態調査 全国 購入先・購入地域編[二人以上の世帯] 【品目別1世帯当たり1か月間の支出】 地域,購入地域,購入先別データセット。

Bash on Ubuntu on Windows


Jupyter Notebook



シルエット分析


シルエット分析では各点(ここでは都道府県)のシルエット値を計算する。シルエット値とは、MathWorksのサイトシルエット プロットによると「他のクラスターの点と比べて、その点が自身のクラスター内の他の点にどれくらい相似しているかを示す尺度」で、-1から1の範囲の値。シルエット値が1に近く、かつシルエット値をプロットしたシルエット図でクラスター間の幅の差が最も少ないクラスター数が最適となる。


エルボー法


クラスター数を変えてクラスタリングしたときの各SSE(クラスター内誤差の平方和)をプロットしたエルボー図で、ひじのように曲がっているところのクラスター数が最適というもの。scikit-learnのKMeansクラスではfitメソッドを適用したあとに得られるinertia_ (Sum of squared distances of samples to their closest cluster center)がSSEに当たるらしい。


シルエット分析とエルボー法のPython3コード


データをPnadasのDataFframeにするまでは都道府県別の飲み物の購入額をk-means法でクラスタリングするとコードは同じ。今回はクラスター数2~8の中からシルエット分析とエルボー法で最適なクラスター数を選ぶ。シルエット分析のコードはSelecting the number of clusters with silhouette analysis on KMeans clusteringのコードをほぼそのまま使えるが、長くなるのでクラスター数ごとの平均シルエット値を算出するコードのみ掲載しておく。エルボー図はinertia_をプロットしているだけ。


import codecs
import pandas as pd
from sklearn.cluster import KMeans
from sklearn.metrics import silhouette_samples, silhouette_score

%matplotlib inline
from IPython.core.pylabtools import figsize
import matplotlib.pyplot as plt

def select_n_cluster(X):
    # クラスター数2~8を比べる
    range_n_clusters = [i for i in range(2, 9)]    

    sse = []
    for n_clusters in range_n_clusters:
        clusterer = KMeans(init='k-means++', n_clusters=n_clusters, random_state=0)
        cluster_labels = clusterer.fit_predict(X)
        kmeans = clusterer.fit(X)
        
        # SSE(クラスター内誤差の平方和)
        sse.append(kmeans.inertia_) 
        
        # シルエット値(-1~1)の平均
        silhouette_avg = silhouette_score(X, cluster_labels)
        print('For n_clusters =', n_clusters,
              'The average silhouette_score is :', silhouette_avg)    

    # エルボー図のプロット
    plt.plot(range_n_clusters, sse, marker='o')
    plt.xlabel('Number of clusters')
    plt.ylabel('SSE')
    plt.show()

if __name__ == '__main__':
    # csvのデータを読み込んでPandasのDataFrameに
    df = import_estat_csv()

    # 「緑茶」「紅茶」「コーヒー」の合計に対する割合を計算
    df = calc_rate(df)

    # 平均シルエット値の算出とエルボー図のプロット
    select_n_cluster(df.as_matrix())


最適なクラスター数


クラスター数ごとの平均シルエット値では、クラスター数5のときが1に最も近い。


別途シルエット図もプロットしてみたが、クラスター数5のときがクラスターごとのプロット幅が最も均等になった。以下はクラスター数5のときのシルエット図(左)と、「緑茶」「紅茶」の散布図(右)。

エルボー図ではクラスター数5のところがひじの箇所になるので、5が最適クラスター数となる。

シルエット分析でも、エルボー法でも、たまたま選んだクラスター数5が最適という結果になった。

0 件のコメント:

コメントを投稿