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