Python での k-means クラスタリング: ステップバイステップの例


機械学習で最も一般的なクラスタリング アルゴリズムの 1 つは、k-means クラスタリングとして知られています。

K 平均法クラスタリングは、データセットの各観測値をK個のクラスターの 1 つに配置する手法です。

最終的な目標は、各クラスター内の観測値が互いによく似ている一方で、異なるクラスター内の観測値が互いにまったく異なるK個のクラスターを作成することです。

実際には、次の手順を使用して K-means クラスタリングを実行します。

1. Kの値を選択します。

  • まず、データ内で識別するクラスターの数を決定する必要があります。多くの場合、 Kのいくつかの異なる値をテストし、その結果を分析して、特定の問題に対してどのクラスターの数が最も合理的であるかを確認する必要があります。

2. 各観測値を 1 からKまでの初期クラスターにランダムに割り当てます。

3. クラスターの割り当てが変更されなくなるまで、次の手順を実行します。

  • K個のクラスターのそれぞれについて、クラスターの重心を計算します。これは単に、 k 番目のクラスターの観測値のp平均特徴のベクトルです。
  • 各観測値を最も近い重心を持つクラスターに割り当てます。ここで、最も近いユークリッド距離を使用して定義されます。

次のステップバイステップの例は、 sklearnモジュールのKMeans関数を使用して Python で K-means クラスタリングを実行する方法を示しています。

ステップ 1: 必要なモジュールをインポートする

まず、K 平均法クラスタリングを実行するために必要なすべてのモジュールをインポートします。

 import pandas as pd
import numpy as np
import matplotlib. pyplot as plt
from sklearn. cluster import KMeans
from sklearn. preprocessing import StandardScaler

ステップ 2: データフレームを作成する

次に、20 人の異なるバスケットボール選手について、次の 3 つの変数を含む DataFrame を作成します。

  • ポイント
  • ヘルプ
  • 跳ねる

次のコードは、このパンダ データフレームを作成する方法を示しています。

 #createDataFrame
df = pd. DataFrame ({' points ': [18, np.nan, 19, 14, 14, 11, 20, 28, 30, 31,
                              35, 33, 29, 25, 25, 27, 29, 30, 19, 23],
                   ' assists ': [3, 3, 4, 5, 4, 7, 8, 7, 6, 9, 12, 14,
                               np.nan, 9, 4, 3, 4, 12, 15, 11],
                   ' rebounds ': [15, 14, 14, 10, 8, 14, 13, 9, 5, 4,
                                11, 6, 5, 5, 3, 8, 12, 7, 6, 5]})

#view first five rows of DataFrame
print ( df.head ())

   points assists rebounds
0 18.0 3.0 15
1 NaN 3.0 14
2 19.0 4.0 14
3 14.0 5.0 10
4 14.0 4.0 8

K 平均法クラスタリングを使用して、これら 3 つのメトリクスに基づいて類似したアクターをグループ化します。

ステップ 3: DataFrame をクリーンアップして準備する

次に、次の手順を実行します。

  • Dropna()を使用して、任意の列に NaN 値を含む行を削除します
  • StandardScaler()を使用して、平均が 0、標準偏差が 1 になるように各変数をスケーリングします。

次のコードは、これを行う方法を示しています。

 #drop rows with NA values in any columns
df = df. dropna ()

#create scaled DataFrame where each variable has mean of 0 and standard dev of 1
scaled_df = StandardScaler(). fit_transform (df)

#view first five rows of scaled DataFrame
print (scaled_df[:5])

[[-0.86660275 -1.22683918 1.72722524]
 [-0.72081911 -0.96077767 1.45687694]
 [-1.44973731 -0.69471616 0.37548375]
 [-1.44973731 -0.96077767 -0.16521285]
 [-1.88708823 -0.16259314 1.45687694]]

: K 平均法アルゴリズムを当てはめるときに各変数が同じ重要性を持つようにスケーリングを使用します。そうしないと、範囲が最も広い変数の影響が大きくなりすぎます。

ステップ 4: 最適なクラスター数を見つける

Python で K-means クラスタリングを実行するには、 sklearnモジュールのKMeans関数を使用できます。

この関数は次の基本構文を使用します。

KMeans(init=’random’、n_clusters=8、n_init=10、random_state=None)

金:

  • init : 初期化手法を制御します。
  • n_clusters : 観測値を配置するクラスターの数。
  • n_init : 実行する初期化の数。デフォルトでは、k-means アルゴリズムを 10 回実行し、SSE が最も低いアルゴリズムを返します。
  • random_state : アルゴリズムの結果を再現可能にするために選択できる整数値。

この関数の最も重要な引数は n_clusters で、観測値を配置するクラスターの数を指定します。

ただし、クラスターの最適な数が事前にわからないため、クラスターの数とモデルの SSE (誤差二乗和) を表示するグラフを作成する必要があります。

通常、このタイプのプロットを作成するときは、平方和が「曲がる」か横ばいになり始める「膝」を探します。これは通常、最適なクラスター数です。

次のコードは、x 軸にクラスターの数、y 軸に SSE を表示するこのタイプのプロットを作成する方法を示しています。

 #initialize kmeans parameters
kmeans_kwargs = {
" init ": " random ",
" n_init ": 10,
" random_state ": 1,
}

#create list to hold SSE values for each k
sse = []
for k in range(1, 11):
    kmeans = KMeans(n_clusters=k, ** kmeans_kwargs)
    kmeans. fit (scaled_df)
    sse. append (kmeans.inertia_)

#visualize results
plt. plot (range(1, 11), sse)
plt. xticks (range(1, 11))
plt. xlabel (" Number of Clusters ")
plt. ylabel (“ SSE ”)
plt. show () 

このグラフでは、 k = 3 クラスターにねじれまたは「ニー」があるように見えます。

したがって、次のステップで K-means クラスタリング モデルをフィッティングするときに 3 つのクラスターを使用します。

: 実際の世界では、このプロットとドメインの専門知識を組み合わせて、使用するクラスターの数を選択することをお勧めします。

ステップ 5: 最適なKを使用して K-Means クラスタリングを実行する

次のコードは、 kの最適値 3 を使用してデータセットに対して k-means クラスタリングを実行する方法を示しています。

 #instantiate the k-means class, using optimal number of clusters
kmeans = KMeans(init=" random ", n_clusters= 3 , n_init= 10 , random_state= 1 )

#fit k-means algorithm to data
kmeans. fit (scaled_df)

#view cluster assignments for each observation
kmeans. labels_

array([1, 1, 1, 1, 1, 1, 2, 2, 0, 0, 0, 0, 2, 2, 2, 0, 0, 0]) 

結果のテーブルには、DataFrame 内の各観測値のクラスター割り当てが表示されます。

これらの結果を解釈しやすくするために、各プレーヤーのクラスター割り当てを示す列を DataFrame に追加できます。

 #append cluster assingments to original DataFrame
df[' cluster '] = kmeans. labels_

#view updated DataFrame
print (df)

points assists rebounds cluster
0 18.0 3.0 15 1
2 19.0 4.0 14 1
3 14.0 5.0 10 1
4 14.0 4.0 8 1
5 11.0 7.0 14 1
6 20.0 8.0 13 1
7 28.0 7.0 9 2
8 30.0 6.0 5 2
9 31.0 9.0 4 0
10 35.0 12.0 11 0
11 33.0 14.0 6 0
13 25.0 9.0 5 0
14 25.0 4.0 3 2
15 27.0 3.0 8 2
16 29.0 4.0 12 2
17 30.0 12.0 7 0
18 19.0 15.0 6 0
19 23.0 11.0 5 0

クラスター列には、各プレーヤーに割り当てられたクラスター番号 (0、1、または 2) が含まれます。

同じクラスターに属するプレーヤーは、ポイントアシストリバウンドの列の値がほぼ似ています。

: sklearnKMeans関数の完全なドキュメントはここで見つけることができます。

追加リソース

次のチュートリアルでは、Python で他の一般的なタスクを実行する方法について説明します。

Python で線形回帰を実行する方法
Python でロジスティック回帰を実行する方法
Python で K-Fold 相互検証を実行する方法

コメントを追加する

メールアドレスが公開されることはありません。 が付いている欄は必須項目です