「教科書で学ぶ教師なし学習:K-Meansクラスタリングの実践」

Textbook Unsupervised Learning with K-Means Clustering

 

K-Meansクラスタリングは、データサイエンスで最もよく使用される教師なし学習アルゴリズムの一つです。データポイント間の類似性に基づいてデータセットをクラスタやグループに自動的に分割するために使用されます。

この短いチュートリアルでは、K-Meansクラスタリングアルゴリズムの動作方法を学び、scikit-learnを使用して実データに適用します。さらに、結果を視覚化してデータの分布を理解します。

 

K-Meansクラスタリングとは?

 

K-Meansクラスタリングは、クラスタリング問題を解決するために使用される教師なし機械学習アルゴリズムです。このアルゴリズムの目標は、変数Kによって表されるクラスタの数を見つけることです。

K-Meansアルゴリズムの動作方法は以下の通りです:

  1. データをグループ化するためにデータをグループ化したいクラスタ数Kを指定します。
  2. K個のクラスタセンターまたは重心をランダムに初期化します。これは、初期セントロイドとしてK個のデータポイントをランダムに選択することで行われます。
  3. ユークリッド距離に基づいて、各データポイントを最も近いクラスタ重心に割り当てます。与えられた重心に最も近いデータポイントは、そのクラスタの一部と見なされます。
  4. 各クラスタに割り当てられたすべてのデータポイントの平均を取ることで、クラスタの重心を再計算します。
  5. セントロイドが動かなくなるか、反復回数が指定された制限に達するまで、ステップ3と4を繰り返します。これはアルゴリズムが収束したときに行われます。

   

K-Meansの目的は、データポイントとそれらに割り当てられたクラスタ重心との二乗距離の合計を最小化することです。これは、データポイントを最も近い重心に反復的に再割り当てし、クラスタの中心に重心を移動することによって実現され、よりコンパクトで分離されたクラスタが得られます。

 

K-Meansクラスタリングの実例

 

これらの例では、Kaggleからのモール顧客セグメンテーションデータを使用し、K-Meansアルゴリズムを適用します。また、エルボー法を使用して最適なK(クラスタ数)を見つけ、クラスタを視覚化します。

 

データの読み込み

 

pandasを使用してCSVファイルを読み込み、”CustomerID”をインデックスとします。

import pandas as pd

df_mall = pd.read_csv("Mall_Customers.csv",index_col="CustomerID")
df_mall.head(3)

 

データセットには4つの列があり、私たちは年齢、年間収入、および顧客の支出スコアの3つに興味があります。

 

 

視覚化

 

すべての4つの列を視覚化するために、seabornの`scatterplot`を使用します。

import matplotlib.pyplot as plt
import seaborn as sns

plt.figure(1 , figsize = (10 , 5) )
sns.scatterplot(
    data=df_mall,
    x="Spending Score (1-100)",
    y="Annual Income (k$)",
    hue="Gender",
    size="Age",
    palette="Set2"
);

 

K-Meansクラスタリングなしでも、明らかに40-60の支出スコアと40kから70kの年間収入の間にクラスタが見えます。さらにクラスタを見つけるために、次のパートでクラスタリングアルゴリズムを使用します。

 

 

正規化

 

クラスタリングアルゴリズムを適用する前に、データを正規化して外れ値や異常値を排除することが重要です。ここでは、”Gender”と”Age”の列を削除し、残りの列を使用してクラスタを見つけます。

from sklearn import preprocessing

X = df_mall.drop(["Gender","Age"],axis=1)
X_norm = preprocessing.normalize(X)

 

エルボーメソッド

 

K-MeansアルゴリズムにおけるKの最適な値は、エルボーメソッドを使用して見つけることができます。これには、1から10までのクラスタ数の各Kのイナーシャ値を求め、可視化する必要があります。

import numpy as np
from sklearn.cluster import KMeans


def elbow_plot(data,clusters):
    inertia = []
    for n in range(1, clusters):
        algorithm = KMeans(
            n_clusters=n,
            init="k-means++",
            random_state=125,
        )
        algorithm.fit(data)
        inertia.append(algorithm.inertia_)
    # プロット
    plt.plot(np.arange(1 , clusters) , inertia , 'o')
    plt.plot(np.arange(1 , clusters) , inertia , '-' , alpha = 0.5)
    plt.xlabel('クラスタの数') , plt.ylabel('イナーシャ')
    plt.show();

elbow_plot(X_norm,10)

 

最適な値は3です。   

 

KMeansクラスタリング

 

scikit-learnからKMeansアルゴリズムを使用し、Kの値を指定します。その後、トレーニングデータセットに適合させ、クラスタラベルを取得します。

algorithm = KMeans(n_clusters=3, init="k-means++", random_state=125)
algorithm.fit(X_norm)
labels = algorithm.labels_

 

3つのクラスタを可視化するために、散布図を使用できます。 

sns.scatterplot(data = X, x = 'Spending Score (1-100)', y = 'Annual Income (k$)', hue = labels, palette="Set2");

 

  • “0”: 収入が低く、支出が高い人。
  • “1”: 平均的な収入で高い支出を行う人。
  • “2”: 収入が高く、支出が低い人。

    この情報を活用して、パーソナライズされた広告を作成し、顧客の忠誠心を高め、収益を増やすことができます。

 

異なる特徴の使用

 

次に、年齢と支出スコアをクラスタリングアルゴリズムの特徴として使用します。これにより、顧客の分布の完全なイメージが得られます。データの正規化のプロセスを繰り返します。

X = df_mall.drop(["Gender","Annual Income (k$)"],axis=1)

X_norm = preprocessing.normalize(X)

 

最適なクラスタ数を計算します。 

elbow_plot(X_norm,10)

 

K=3のクラスタでK-Meansアルゴリズムをトレーニングします。     

algorithm = KMeans(n_clusters=3, init="k-means++", random_state=125)
algorithm.fit(X_norm)
labels = algorithm.labels_

 

散布図を使用して、3つのクラスタを可視化します。 

sns.scatterplot(data = X, x = 'Age', y = 'Spending Score (1-100)', hue = labels, palette="Set2");

 

  • “0”: 若い支出が高い人。
  • “1”: 中年から高齢までのVoAGI支出者。
  • “2”: 支出が低い人。

この結果から、企業は20-40歳の所得のある個人をターゲットにすることで利益を増やすことができると示唆されています。

   

私たちは、支出スコアの箱ひげ図を視覚化することで、さらに深く掘り下げることができます。これにより、クラスタが支出の習慣に基づいて形成されていることが明確に示されます。

sns.boxplot(x = labels, y = X['Spending Score (1-100)']);

 

 

結論

 

このK-Meansクラスタリングチュートリアルでは、ターゲット広告を可能にするために、K-Meansアルゴリズムを顧客セグメンテーションに適用する方法を探索しました。K-Meansは完璧なクラスタリングアルゴリズムではありませんが、多くの実世界のユースケースに対してシンプルで効果的なアプローチを提供します。

K-Meansのワークフローを進行し、Pythonで実装することで、データを異なるクラスタに分割するアルゴリズムの動作に関する洞察を得ました。エルボー法による最適なクラスタ数の見つけ方や、クラスタ化されたデータの視覚化などの技術を学びました。

scikit-learnは他にも多くのクラスタリングアルゴリズムを提供していますが、K-Meansはその速度、スケーラビリティ、解釈の容易さで特に優れています。  Abid Ali Awan(@1abidaliawan)は、機械学習モデルの構築が大好きな認定データサイエンティストです。現在、彼はコンテンツ作成および機械学習およびデータサイエンス技術に関する技術ブログの執筆に焦点を当てています。Abidはテクノロジーマネジメントの修士号とテレコミュニケーションエンジニアリングの学士号を保持しています。彼のビジョンは、メンタルヘルスに苦しむ学生のためにグラフニューラルネットワークを使用したAI製品を構築することです。  

We will continue to update VoAGI; if you have any questions or suggestions, please contact us!

Share:

Was this article helpful?

93 out of 132 found this helpful

Discover more

機械学習

あなたの製品の開発者学習のためのLLM(大規模言語モデル)

「LLM(Large Language Models)とLLMアプリを活用して、効果的かつ効率的な開発者教育を進め、製品の活用を促進する方法を探...

データサイエンス

私が通常のRDBMSをベクトルデータベースに変換して埋め込みを保存する方法

この記事では、一般的なRDBMSを完全に機能したベクトルデータベースに変換して、GenerativeAIアプリケーションの開発に埋め込...

機械学習

T5 テキストからテキストへのトランスフォーマー(パート2)

BERT [5] の提案により、自然言語処理(NLP)のための転移学習手法の普及がもたらされましたインターネット上での未ラベル化...

機械学習

ソフトウェアエンジニアリングの未来 生成AIによる変革

この記事では、Generative AI(およびLarge Language Models)の出現と、それがソフトウェアエンジニアリングの将来をどのよ...

AIニュース

ChatGPTカスタム指示の使用方法(6つのユースケース)

「カスタム指示」は、ChatGPTが応答を生成する際に考慮してほしい個人の好みや要件を追加することができます