機械学習手法の1つであるKMeans法についてまとめてみました。
概要
- 機械学習の種類:教師なし学習
- タスクの種類:クラスタリング
- 手法の種類:距離ベースの分割型クラスタリング手法
4.重心を再計算する / 3と4を重心が動かなくなるまで繰り返す
データにラベル(正解)が与えられない教師なし学習であるKMeans法では、
データ同士の類似性にもとづいて自動的にグループ分け(クラスタリング)する。
K個のクラスタに分けるようデータを分類するアルゴリズムで、
各データからクラスタ中心(重心)までの距離を最小にするように反復的に分類する。
クラスタ数はあらかじめ指定する必要がある。(図表ではn_cluster=2、デフォルトはn_cluster=8)
scikitlearn公式サイト
scikitlearnを用いたKMeans法の活用例
import numpy as np
import matplotlib.pyplot as plt
import pandas as pd
from sklearn.cluster import KMeans
-
NumPy
- 役割:数値計算ライブラリ
- 用途:配列(ベクトル・行列)を使ったデータ処理
-
matplotlib
- 役割:グラフ描画ライブラリ
- 用途:散布図、折れ線グラフ、ヒストグラムなどを描く
-
pandas
- 役割:表形式加工ライブラリ
- 用途:表形式データの読み書き・加工(CSV連携・列抽出など)
なぜsklearnのimportはfromから始まっているのか
-
sklearn
- 機械学習ライブラリ
-
sklearn.cluster
- クラスタリング手法をまとめたサブモジュール
- Kmeans, DBSCANなどが含まれる
scikitlearn公式サイト
-
KMeans
- sklearn.clusterモジュールの中に定義されているクラス
- KMeansはこのモジュールに所属している1つのクラスタリングアルゴリズム
モジュール全体を読み込みできるが、
使うときに毎回sklearn.cluster.KMeansの書き込みが必要になり手間がかかる。
import sklearn.cluster
model = sklearn.cluster.KMeans(n_clusters=3)
一方でfromを使う場合、Kmeansだけを読み込むが、
シンプルに書いて使うことができる。
from sklearn.cluster import KMeans
model = KMeans(n_clusters=3)
実際の活用例
1.CSV読み込み
df = pd.read_csv("Sample/ocean.csv")
- Kaggleからデータセットをダウンロード
- JupiterNotebookにSampleディレクトリを作成
- ディレクトリ内にocean.csvとして保存
海洋気候と海洋生物のデータセット
2.特徴量の選択:NumPy配列(n次元配列)
X = df[["SST (°C)", "Species Observed"]].values
3.KMeansの実行
kmeans = KMeans(n_clusters=3, random_state=0)
kmeans.fit(X)
labels = kmeans.labels_
centers = kmeans.cluster_centers_
4.結果をデータフレームに追加
df["Cluster"] = labels
5.クラスタリング結果の可視化
plt.scatter(df["SST (°C)"], df["Species Observed"], c=df["Cluster"], cmap="viridis")
plt.scatter(centers[:, 0], centers[:, 1], c="red", marker="X", s=200)
plt.xlabel("温度")
plt.ylabel("海洋生物の数")
plt.title("クラスタリング")
plt.show()
各コードの内容について
plt.scatter(df["SST (°C)"], df["Species Observed"], c=df["Cluster"], cmap="viridis")
- df["SST (°C)"], df["Species Observed"]:X軸とY軸に使う列(例:温度と海洋生物数)
- c=df["Cluster"]:点の色をクラスタ番号で変える(KMeans結果)
- cmap="viridis":色のスタイルを指定(緑~黄~紫系のグラデーション)
plt.scatter(centers[:, 0], centers[:, 1], c="red", marker="X", s=200)
- center[:, 0]:各クラスタの中心(X軸=年齢)
- center[:, 1]:各クラスタの中心(Y軸=年収)
- c="red":中心は赤色で表示
- marker="X":マーカーの形を「X]に(重心をわかりやすく)
- s=200:点の大きさを大きくする
plt.xlabel("温度") #X軸に「温度」と表示
plt.ylabel("海洋生物の数") #Y軸に「海洋生物の数」と表示
plt.title("クラスタリング") #グラフタイトル
plt.show() #グラフを表示
KMeansとkmeans_plusplus
scikitlearnの公式サイトでsklearn.clusterに所属するアルゴリズムをみていると、
Kmeansとは別にkmeans_plusplusなるものがあるため調べてみました。
scikitlearn公式サイト
簡単にいうと初期値となるクラスタ中心(重心)をランダムに設定するか、
より効率的に配置するかの違いがあるようです。
KMeans
kmeans_plusplus / k-means++
実はKMeansにはもともとk-means++がデフォルト値として組み込まれている。
KMeansのinitパラメータに何も指定しないとデフォルト値としてk-means++のアルゴリズムが適用される。
まとめ
今回はクラスタリング手法の1種であるKMeans法について概要を整理しました。
引き続き機械学習の知識定着と活用する力を高めていきたいと思います。