この記事では、Pythonと機械学習ライブラリ「scikit-learn」を用いて、K-means法によるクラスタ分析でラベリングする方法について解説します。
クラスタ分析とは
クラスタ分析 (clustering)とは、データを分類する手法です。
与えられたデータを外的基準なし(教師データなし)で自動的に分類します。
今回は、scikit-learnのk-means法で元データにクラスタ番号を付加し、ラベリングしてきます。
【詳細】
・【k-means法】クラスタリングのアルゴリズム
sklearn.cluster.KMeans クラス
scikit-learnでは、sklearn.cluster.KMeansクラスを使うことでk-means方を実装できます。
その使い方は下記の通りです。
書式
sklearn.cluster.KMeans(n_clusters=8, init='k-means++', n_init=10, max_iter=300, tol=0.0001,precompute_distances='auto', verbose=0, random_state=None, copy_x=True, n_jobs=1)
※各パラメータに設定されてる値(=の後)はデフォルト値
パラメータ | 内容 |
---|---|
n_clusters | クラスタの個数(分類する種類の数) |
max_iter | 繰り返し回数の最大値 |
n_init | 初期値選択時に、異なる乱数のシードで初期の重心を選ぶ処理の実行回数 |
init | 初期化の方法(’k-means++”, ‘random’ ndarray で指定) |
tol | 収束判定の許容可能誤差 |
precompute_distances | 距離 (データのばらつき具合) を事前に計算するか否か( ‘auto’, True, False で指定) |
verbose | 1 なら分析結果を詳細表示 |
random_state | 乱数のシードを固定する場合に指定(数値か「integer or numpy.RandomState」で指定) |
copy_x | メモリ内でデータを複製してから、距離を事前に計算するか否か |
n_jobs | 並列処理で初期化する際の多重度(-1 で全てのCPU を使用) |
メソッド | 内容 |
---|---|
fit(X[, y]) | クラスタリングの計算をする |
fit_predict(X[, y]) | 各サンプルのクラスタ番号を算出 |
fit_transform(X[, y]) | クラスタリングの計算をして、Xを分析に用いた距離空間に変換して返す |
get_params([deep]) | 計算に用いたパラメータを返す |
predict(X) | Xのサンプルが属しているクラスタ番号を返す |
set_params(**params) | パラメータを設定 |
transform(X[, y]) | Xを分析に用いた距離空間に変換して返す |
【参考文献】 http://scikit-learn.org/stable/modules/generated/sklearn.cluster.KMeans.html
ソースコード
サンプルプログラムのソースコードです。
# -*- coding: utf-8 -*- import pandas as pd import numpy as np from sklearn.cluster import KMeans def main(): # CSVファイルを取得 data = pd.read_csv("data.csv") # Pandasデータフレームをnumpy配列に変換 data2 = np.array([data['x1'].tolist(), data['x2'].tolist(), data['x3'].tolist()], np.int32) # numpy配列を転置 data2 = data2.T # k-means法でクラスタ分析(クラスタ数は3) result = KMeans(n_clusters=3).fit_predict(data) # クラスタ番号を表示 data['cluster_id'] = result print(data) if __name__ == "__main__": main()
【data.csv】
x1,x2,x3 45,17.5,30 38,17.0,25 41,18.5,20 34,18.5,30 59,16.0,45 47,19.0,35 35,19.5,25 43,16.0,35 54,18.0,35 52,19.0,40
実行結果
サンプルプログラムの実行結果です。
x1 x2 x3 cluster_id 0 45 17.5 30 2 1 38 17.0 25 0 2 41 18.5 20 0 3 34 18.5 30 0 4 59 16.0 45 1 5 47 19.0 35 2 6 35 19.5 25 0 7 43 16.0 35 2 8 54 18.0 35 1 9 52 19.0 40 1
cluster_id(クラスタID)がクラスタの番号です。
今回はdata.csvのx1, x2, x3の3つのデータをもつ10組をk-means法で3つのクラスタ(0~2番)に分類しています。
上記の結果だと1組目のデータはクラスタ番号2、2組目はクラスタ番号1…という風に分類されています。
【おすすめ関連記事】
Scikit-learn入門・使い方
Scikit-learnをインストールする方法
Python入門 基本文法
コメント