J'utilise un ensemble de données intégré iris de sklearn pour le clustering. Dans KMeans, j'ai défini le nombre de clusters à l'avance, mais ce n'est pas vrai pour DBSCAN. Comment former un modèle si vous ne définissez pas le nombre de clusters à l'avance?

J'ai essayé:

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)

Je suis resté coincé dessus!

-1
Laurinda Souza 15 avril 2020 à 19:05

2 réponses

Meilleure réponse

DBSCAN est un algorithme de clustering et, en tant que tel, il n'emploie pas les étiquettes y. Il est vrai que vous pouvez utiliser sa méthode fit comme .fit(X, y) mais, selon le docs:

y: ignoré

Non utilisé, présent ici pour la cohérence de l'API par convention.

L'autre caractéristique de DBSCAN est que, contrairement aux algorithmes tels que KMeans, il ne prend pas le nombre de clusters comme entrée; à la place, il estime leur nombre par lui-même.

Après avoir clarifié cela, adaptons la démo de documentation avec les données d'iris:

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))

Résultat:

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

Tracons-les:

# 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'est ça.

Comme pour tous les algorithmes de clustering, ici les notions habituelles d'apprentissage supervisé, comme le fractionnement train / test, la prédiction avec des données invisibles, la validation croisée, etc. ne tiennent pas . Ces méthodes non supervisées peuvent être utiles dans une analyse exploratoire initiale des données (EDA), afin de nous donner une idée générale de nos données - mais, comme vous l'avez peut-être déjà remarqué, il n'est pas nécessaire que les résultats d'une telle analyse soient utiles pour problèmes supervisés: ici, malgré l'existence de 3 étiquettes dans notre jeu de données iris, l'algorithme n'a découvert que 2 clusters.

... qui peut bien sûr changer en fonction des paramètres du modèle. Expérience...

3
Community 20 juin 2020 à 09:12

L'un des avantages de DBSCAN sur Kmeans est que vous n'avez pas besoin de spécifier le nombre de clusters comme hyperparamètre. Le paramètre le plus important dans DBSCAN est l'epsilon qui a un effet direct sur le nombre final de clusters.

2
OmG 15 avril 2020 à 16:11