DBSCAN クラスタリングアルゴリズム

Machine LearningMachine LearningBeginner
今すぐ練習

This tutorial is from open-source community. Access the source code

💡 このチュートリアルは英語版からAIによって翻訳されています。原文を確認するには、 ここをクリックしてください

はじめに

この実験では、合成データセットをクラスタリングするためにDBSCAN(Density-Based Spatial Clustering of Applications with Noise)アルゴリズムを使用します。DBSCANは、高密度の領域にあるコアサンプルを識別し、それらからクラスタを拡大するクラスタリングアルゴリズムです。このアルゴリズムは、同じ密度のクラスタを含むデータに役立ちます。

VMのヒント

VMの起動が完了したら、左上隅をクリックしてノートブックタブに切り替え、Jupyter Notebookを使って練習しましょう。

Jupyter Notebookが読み込み終わるまで数秒待つことがあります。Jupyter Notebookの制限により、操作の検証は自動化できません。

学習中に問題がある場合は、Labbyにお問い合わせください。セッション後にフィードバックを提供してください。すぐに問題を解決いたします。


Skills Graph

%%%%{init: {'theme':'neutral'}}%%%% flowchart RL sklearn(("Sklearn")) -.-> sklearn/CoreModelsandAlgorithmsGroup(["Core Models and Algorithms"]) sklearn(("Sklearn")) -.-> sklearn/DataPreprocessingandFeatureEngineeringGroup(["Data Preprocessing and Feature Engineering"]) sklearn(("Sklearn")) -.-> sklearn/ModelSelectionandEvaluationGroup(["Model Selection and Evaluation"]) sklearn(("Sklearn")) -.-> sklearn/UtilitiesandDatasetsGroup(["Utilities and Datasets"]) ml(("Machine Learning")) -.-> ml/FrameworkandSoftwareGroup(["Framework and Software"]) sklearn/CoreModelsandAlgorithmsGroup -.-> sklearn/cluster("Clustering") sklearn/DataPreprocessingandFeatureEngineeringGroup -.-> sklearn/preprocessing("Preprocessing and Normalization") sklearn/ModelSelectionandEvaluationGroup -.-> sklearn/metrics("Metrics") sklearn/UtilitiesandDatasetsGroup -.-> sklearn/datasets("Datasets") ml/FrameworkandSoftwareGroup -.-> ml/sklearn("scikit-learn") subgraph Lab Skills sklearn/cluster -.-> lab-49102{{"DBSCAN クラスタリングアルゴリズム"}} sklearn/preprocessing -.-> lab-49102{{"DBSCAN クラスタリングアルゴリズム"}} sklearn/metrics -.-> lab-49102{{"DBSCAN クラスタリングアルゴリズム"}} sklearn/datasets -.-> lab-49102{{"DBSCAN クラスタリングアルゴリズム"}} ml/sklearn -.-> lab-49102{{"DBSCAN クラスタリングアルゴリズム"}} end

データ生成

sklearn.datasetsモジュールのmake_blobs関数を使って、3つのクラスタを持つ合成データセットを生成します。このデータセットは、クラスタ標準偏差が0.4の750個のサンプルで構成されます。また、sklearn.preprocessingモジュールのStandardScalerを使ってデータを標準化します。

from sklearn.datasets import make_blobs
from sklearn.preprocessing import StandardScaler

centers = [[1, 1], [-1, -1], [1, -1]]
X, labels_true = make_blobs(
    n_samples=750, centers=centers, cluster_std=0.4, random_state=0
)

X = StandardScaler().fit_transform(X)

データ可視化

matplotlib.pyplotモジュールを使って、生成されたデータを可視化することができます。

import matplotlib.pyplot as plt

plt.scatter(X[:, 0], X[:, 1])
plt.show()

DBSCANの計算

sklearn.clusterモジュールのDBSCANクラスを使ってクラスタを計算します。epsパラメータを0.3に、min_samplesパラメータを10に設定します。DBSCANによって割り当てられたラベルにはlabels属性を使ってアクセスできます。ノイズのサンプルには-1のラベルが付けられます。また、クラスタの数とノイズポイントの数を計算します。

import numpy as np
from sklearn.cluster import DBSCAN
from sklearn import metrics

db = DBSCAN(eps=0.3, min_samples=10).fit(X)
labels = db.labels_

n_clusters_ = len(set(labels)) - (1 if -1 in labels else 0)
n_noise_ = list(labels).count(-1)

print("Estimated number of clusters: %d" % n_clusters_)
print("Estimated number of noise points: %d" % n_noise_)

評価指標

生成されたクラスタの品質を定量化するために、評価指標を使用することができます。同質性、完全性、V尺度、調整ランド指数、調整相互情報、およびシルエット係数指標を使用します。これらの指標はsklearn.metricsモジュールからアクセスします。真のラベルがわからない場合、評価はモデル結果自体を使用してのみ行うことができます。その場合、シルエット係数が役に立ちます。

print(f"Homogeneity: {metrics.homogeneity_score(labels_true, labels):.3f}")
print(f"Completeness: {metrics.completeness_score(labels_true, labels):.3f}")
print(f"V-measure: {metrics.v_measure_score(labels_true, labels):.3f}")
print(f"Adjusted Rand Index: {metrics.adjusted_rand_score(labels_true, labels):.3f}")
print(f"Adjusted Mutual Information: {metrics.adjusted_mutual_info_score(labels_true, labels):.3f}")
print(f"Silhouette Coefficient: {metrics.silhouette_score(X, labels):.3f}")

結果のプロット

結果をプロットするためにmatplotlib.pyplotモジュールを使用します。コアサンプル(大きな点)と非コアサンプル(小さな点)は、割り当てられたクラスタに応じて色分けされます。ノイズとしてタグ付けされたサンプルは黒で表されます。

unique_labels = set(labels)
core_samples_mask = np.zeros_like(labels, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True

colors = [plt.cm.Spectral(each) for each in np.linspace(0, 1, len(unique_labels))]
for k, col in zip(unique_labels, colors):
    if k == -1:
        col = [0, 0, 0, 1]

    class_member_mask = labels == k

    xy = X[class_member_mask & core_samples_mask]
    plt.plot(
        xy[:, 0],
        xy[:, 1],
        "o",
        markerfacecolor=tuple(col),
        markeredgecolor="k",
        markersize=14,
    )

    xy = X[class_member_mask & ~core_samples_mask]
    plt.plot(
        xy[:, 0],
        xy[:, 1],
        "o",
        markerfacecolor=tuple(col),
        markeredgecolor="k",
        markersize=6,
    )

plt.title(f"Estimated number of clusters: {n_clusters_}")
plt.show()

まとめ

この実験では、合成データセットをクラスタリングするためにDBSCANクラスタリングアルゴリズムを使用しました。データセットを生成し、データを可視化し、クラスタを計算し、指標を評価し、結果をプロットしました。