Clip Success!!

教師なし学習の第一歩(クラスタリング)|Pythonで機械学習vol.6

9,194 PV

192日前

今回は「Pythonで機械学習をプログラミングしてみよう」シリーズの第六弾として教師なし学習についての概要説明と、実際に教師学習の代表でもあるクラスタリングを用いて分類問題を解くところまでです。
ちなみに今後の内容としては下の流れを予定しています。

vol.1 jupyterの環境構築をして、簡単にPythonを書いてみよう
vol.2 教師あり学習の第一歩、線形回帰を解いてみる
vol.3 分類問題を解く方法、ロジスティック回帰を使ってみよう
vol.4 オーバーフィッティング対策としての正則化とは
vol.5 ニューラルネットワークで分類問題を解く
vol.6 教師なし学習の第一歩(クラスタリング) ※本記事
vol.7 特徴抽出による情報圧縮(主成分分析)

エンジニアの転職で失敗しないために親身にサポートするTechClipsエージェント

 

教師なし学習とは?

 

https://jp.pinterest.com/source/us.hudson.com

教師あり学習については「vol.2 教師あり学習の第一歩、線形回帰を解いてみる」にて"データと正解(またはラベル)のペアを与えて、それをもとに学習する方法です"とご説明しました。

そして教師なし学習とは、入力データはあるが、その正解が与えられない学習方法です。

教師あり学習の場合、その「出力すべきもの」も入力として与える手法であり、データの背後に存在する本質的な構造を抽出するよりむしろ、思い通りの出力を再現する機械の構成に用いらます。

そのため教師あり学習ではカバーできない、データの背後に存在する本質的な構造を抽出するために教師なし学習が用いられます。

つまりデータマイニングなど、未知のデータの特徴を発見したり予測したりするために教師なし学習を利用する場合が多いです。

クラスタリングとは?

http://alpha.mixi.co.jp/entry/2009/10714/

クラスター(cluster)とは、ひとまとまりの集合体のことを言い、クラスタリングとはデータの全体集合をいくつかの集合体に分類する動作、手法のことを言います。

例えばクラスタリングのひとつの応用例として以下が考えれらます。

http://bdm.change-jp.com/?p=2025

クレジットカードやポイントカードのユーザー情報には、性別、年齢、住所、カード利用履歴などのデータが蓄積されています。

これらのデータをクラスタリングすることで、ユーザーをさまざまな属性(性別、年齢など)や嗜好性、消費傾向を基準にしたいくつかのグループ(クラスター)に分類します。

そうすることで、それぞれのグループが持つ異なるニーズに合わせた内容のDMを配布することができ、カードの利用率の向上を狙うことができます。

クラスタリングの代表的な手法「K-Means法」

クラスタリングでよく使われる手法が、非階層型クラスタリングのアルゴリズムのひとつであるK-Means法(K-平均法)です。

非階層クラスター分析とは(引用:株式会社ALBERT)

非階層クラスター分析とは、異なる性質のものが混ざり合った集団から、互いに似た性質を持つものを集め、クラスターを作る方法の1つですが、階層クラスター分析と異なり、階層的な構造を持たず、あらかじめいくつのクラスターに分けるかを決め、決めた数の塊(排他的部分集合)にサンプルを分割する方法といえます。
階層クラスター分析と違い、サンプル数が大きいビッグデータを分析するときに適しています。ただし、あらかじめいくつのクラスターに分けるかは、分析者が決める必要があり、最適クラスター数を自動的には計算する方法は確立されていません。

http://www.albert2005.co.jp/technology/mining/cluster3.html

 

K-Means法は、基本的には、以下の3つの手順でクラスタリングを行います。

1. 初期値となる重心点をサンプルデータ (データセット全体からランダムに集めた少量のデータ) から決定します。
2. 各サンプルから最も近い距離にある重心点を計算によって求め、クラスタを構成します。
3. 2.で求めたクラスタごとに重心を求め、2.を再度実行、さらに2.~3.を決められた回数繰り返し実行して、大きな変化がなくなるまで計算します。

では実際にscikit-learnで用意されているライブラリを用いてクラスタリングを実行するプログラムを書いていきましょう。

事前準備

まずはいつも通りMacの場合はターミナル、Windowsの場合はコマンドプロンプトから任意のディレクトリに移動し、Jupyterを起動します。

$ jupyter notebook

起動したら新規ファイルを作成して編集画面を表示します。
そして初めに今回利用するライブラリやモジュールを下のコマンドでインポートします。

# 分析・計算用
import pandas as pd
import numpy as np

# プロット用
import matplotlib.pyplot as plt

# 機械学習用
from sklearn.cluster import KMeans

次に、サンプルデータを読み込み変数にデータを格納します。
今回はUCバークレー大学にて公開されている、「Wholesale customers Data Set (卸売業者の顧客データ)」をサンプルデータとして扱います。

cust_df = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/00292/Wholesale%20customers%20data.csv")

次に今回は利用しない不要なカラムを削除します。

del(cust_df['Channel'])
del(cust_df['Region'])
cust_df

最後に、PandasのデータフレームからNumpyの行列に変換し、行列を転置します。

転置行列(引用:Wikipedia)

転置行列(てんちぎょうれつ、英: transpose [of a matrix], transposed matrix)とは m 行 n 列の行列 A に対して A の (i, j) 要素と (j, i) 要素を入れ替えた n 行 m 列の行列、つまり対角線で成分を折り返した行列のことである。転置行列は tA, AT, A?, Atr などと示される。行列の転置行列を与える操作のことを転置(てんち、英: transpose)といい、「A を転置する」などと表現する。

https://ja.wikipedia.org/wiki/%E8%BB%A2%E7%BD%AE%E8%A1%8C%E5%88%97

 

cust_array = np.array([cust_df['Fresh'].tolist(),
                       cust_df['Milk'].tolist(),
                       cust_df['Grocery'].tolist(),
                       cust_df['Frozen'].tolist(),
                       cust_df['Milk'].tolist(),
                       cust_df['Detergents_Paper'].tolist(),
                       cust_df['Delicassen'].tolist()
                       ], np.int32)

cust_array = cust_array.T

クラスター分析の実行

事前準備が完了したので、いよいよ分析開始です。

といっても既に分析用のコマンドが用意されているので1行で分析完了です笑

分析後、どうなったのか表示してみると440件の各顧客にクラスタ番号 (0, 1, 2, 3) が付与されたことがわかります。

pred = KMeans(n_clusters=4).fit_predict(cust_array)
pred

クラスターの特徴の確認

Pandasのデータフレームに分析結果として割り振られたクラスタ番号を追加します。

cust_df['cluster_id']=pred
cust_df

そして、各クラスタに属する「サンプル数の分布」、各クラスタの「各部門商品の購買額の平均値」を見ていきます。

cust_df['cluster_id'].value_counts()

cust_df[cust_df['cluster_id']==0].mean()

cust_df[cust_df['cluster_id']==1].mean()

cust_df[cust_df['cluster_id']==2].mean()

cust_df[cust_df['cluster_id']==3].mean()

数字だけを見ていてもわかりづらいかと思うので、Matplotlibを使って描写してみましょう。

clusterinfo = pd.DataFrame()
for i in range(4):
    clusterinfo['cluster' + str(i)] = cust_df[cust_df['cluster_id'] == i].mean()
clusterinfo = clusterinfo.drop('cluster_id')

my_plot = clusterinfo.T.plot(kind='bar', stacked=True, title="Mean Value of 4 Clusters")
my_plot.set_xticklabels(my_plot.xaxis.get_majorticklabels(), rotation=0)

描写結果から、それぞれ次のように理解できます。

・クラスター番号 = 0 に分類された顧客(293人)は、全体的に購買額が低い傾向にあります。
・クラスター番号 = 1 に分類された顧客(63人)は、Fresh(生鮮食品)の購買額が比較的高いことがわかります。
・クラスター番号 = 2 に分類された顧客(77人)は、Grocery(食料雑貨品)とDetergents_Paper(衛生用品と紙類)の購買額が比較的高いことがわかります。
・クラスター番号 = 3 に分類された顧客(7人)は、全てのジャンルで購買額が高いと言えます。

この分析結果から、例えばクラスター番号3の顧客群には生鮮食品のセール情報を掲載したチラシを送ったり、DMを送るといったマーケティング戦略を立てることが出来ます。

※ちなみにK-Means分析には、下のような特徴を持っているため、必ずしも分析結果が同じになるとは限りません。

k-means法の初期値依存について(引用:株式会社ALBERT)

k-means法の一つの短所として、初期値(初期に選択される「核」となるk個のサンプル)依存性があります。図29の3つのクラスターは、初期値を変えて、重心が変化しなくなるまで、繰り返し計算した時の結果です。同じデータを距離などを同じ条件にして計算しても、初期値が異なるだけで、結果が大きく違うことが分かります。従って、よいクラスターを得るためには、初期値を変えて何回か分析を実施し、平均クラスター内距離が最小になる初期値を選択するなど、最適初期値での結果を採用することが望ましいといえます。

http://www.albert2005.co.jp/technology/mining/cluster3.html

 

まとめ

今回は教師なしの概要から、scikit-learnのライブラリを用いて、実際にクラスタリングを実行してみました。

そして、クラスタリングの代表的な手法であるK-Means法を用いましたが、その他にも様々なアルゴリズムがあります。下にクラスタリングの種類について、簡単な概要と特徴もそえてわかりやすくまとまっていますので、ぜひご参照ください。

▼クラスタリング手法のクラスタリング
http://qiita.com/sue_charo/items/20bad5f0bb2079257568

次回はシリーズ最終回として、特徴抽出による情報圧縮(主成分分析)についてご説明します。

今後もお楽しみに!

この記事を書いた人
遠藤孝行
一般社団法人 福島ブースター代表理事。埼玉大学経済学部卒。在学中にカナダへ語学留学、高麗大学(韓国)へ交換留学。福島の子供たちにより良い教育の機会を与えたいとう思いから福島ブースターを設立

CLIPしているユーザー