Кластеризация с помощью DBSCAN: Как обучить модель, если вы заранее не установите количество кластеров? - PullRequest
0 голосов
/ 15 апреля 2020

Я использую встроенный ирис набора данных из sklearn для кластеризации. В KMeans я заранее установил количество кластеров, но для DBSCAN это не так. Как обучить модель, если вы заранее не установите количество кластеров?

Я пытался:

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns
#%matplotib inline

from sklearn.cluster import DBSCAN,MeanShift
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split,KFold,cross_val_score
from sklearn.metrics import accuracy_score,confusion_matrix

iris = load_iris()
X = iris.data
y = iris.target

dbscan = DBSCAN(eps=0.3,min_samples=10)

dbscan.fit(X,y)

Я застрял на ней!

Ответы [ 2 ]

2 голосов
/ 15 апреля 2020

DBSCAN является алгоритмом кластеризации и поэтому не использует метки y. Это правда, что вы можете использовать его fit метод как .fit(X, y), но, согласно документам :

y: игнорируется

Не используется, присутствует здесь для согласованности API по соглашению.

Другая характеристика c DBSCAN заключается в том, что, в отличие от таких алгоритмов, как KMeans, он не принимает количество кластеров в качестве входных данных; вместо этого он также оценивает их число само по себе.

Уточнив это, давайте адаптируем демонстрационную документацию с данными радужной оболочки:

import numpy as np

from sklearn.cluster import DBSCAN
from sklearn import metrics
from sklearn.datasets import load_iris
from sklearn.preprocessing import StandardScaler

X, labels_true = load_iris(return_X_y=True) 
X = StandardScaler().fit_transform(X)

# Compute DBSCAN
db = DBSCAN(eps=0.5,min_samples=5) # default parameter values
db.fit(X)
core_samples_mask = np.zeros_like(db.labels_, dtype=bool)
core_samples_mask[db.core_sample_indices_] = True
labels = db.labels_

# Number of clusters in labels, ignoring noise if present.
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_)
print("Homogeneity: %0.3f" % metrics.homogeneity_score(labels_true, labels))
print("Completeness: %0.3f" % metrics.completeness_score(labels_true, labels))
print("V-measure: %0.3f" % metrics.v_measure_score(labels_true, labels))
print("Adjusted Rand Index: %0.3f"
      % metrics.adjusted_rand_score(labels_true, labels))
print("Adjusted Mutual Information: %0.3f"
      % metrics.adjusted_mutual_info_score(labels_true, labels))
print("Silhouette Coefficient: %0.3f"
      % metrics.silhouette_score(X, labels))

Результат:

Estimated number of clusters: 2
Estimated number of noise points: 17
Homogeneity: 0.560
Completeness: 0.657
V-measure: 0.604
Adjusted Rand Index: 0.521
Adjusted Mutual Information: 0.599
Silhouette Coefficient: 0.486

Давайте построим их:

# Plot result
import matplotlib.pyplot as plt

# Black removed and is used for noise instead.
unique_labels = set(labels)
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:
        # Black used for noise.
        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('Estimated number of clusters: %d' % n_clusters_)
plt.show()

enter image description here

Вот и все.

Как со всеми алгоритмами кластеризации, здесь обычные понятия контролируемого обучения, такие как разделение поезда / теста, предсказание с помощью невидимых данных, перекрестная проверка и т. д. c не содержат . Такие неконтролируемые методы могут быть полезны при первоначальном анализе поисковых данных (EDA), чтобы дать нам общее представление о наших данных - но, как вы, возможно, уже заметили, нет необходимости, чтобы результаты такого анализа были полезны для контролируемые проблемы: здесь, несмотря на наличие 3 меток в нашем наборе данных радужной оболочки, алгоритм обнаружил только 2 кластера.

... которые, конечно, могут изменяться в зависимости от параметров модели. Эксперимент ...

2 голосов
/ 15 апреля 2020

Одним из преимуществ DBSCAN для Kmeans является то, что вам не нужно указывать количество кластеров в качестве гиперпараметра. Наиболее важным параметром в DBSCAN является эпсилон, который напрямую влияет на конечное число кластеров.

...