web-dev-qa-db-fra.com

Est-ce que pandas l'objet de trame de données fonctionnera avec le clustering kmeans de sklearn?

l'ensemble de données est pandas dataframe. Ceci est sklearn.cluster.KMeans

 km = KMeans(n_clusters = n_Clusters)

 km.fit(dataset)

 prediction = km.predict(dataset)

Voici comment je décide quelle entité appartient à quel cluster:

 for i in range(len(prediction)):
     cluster_fit_dict[dataset.index[i]] = prediction[i]

Voici à quoi ressemble l'ensemble de données:

 A 1 2 3 4 5 6
 B 2 3 4 5 6 7
 C 1 4 2 7 8 1
 ...

où A, B, C sont des indices

Est-ce la bonne façon d'utiliser k-means?

29
Dark Knight

Pour savoir si votre dataframe dataset a un contenu approprié, vous pouvez explicitement le convertir en un tableau numpy:

dataset_array = dataset.values
print(dataset_array.dtype)
print(dataset_array)

Si le tableau a un _ numérique homogène dtype (généralement numpy.float64) alors ça devrait aller pour scikit-learn 0.15.2 et plus tard. Vous devrez peut-être encore normaliser les données avec sklearn.preprocessing.StandardScaler par exemple.

Si votre bloc de données est typé de manière hétérogène, le dtype du tableau numpy correspondant sera object, ce qui ne convient pas pour scikit-learn. Vous devez extraire une représentation numérique pour toutes les fonctionnalités pertinentes (par exemple en extrayant des variables fictives pour les fonctionnalités catégorielles) et supprimer les colonnes qui ne sont pas des fonctionnalités appropriées (par exemple, des exemples d'identificateurs).

16
ogrisel

En supposant que toutes les valeurs de la trame de données sont numériques,

# Convert DataFrame to matrix
mat = dataset.values
# Using sklearn
km = sklearn.cluster.KMeans(n_clusters=5)
km.fit(mat)
# Get cluster assignment labels
labels = km.labels_
# Format results as a DataFrame
results = pandas.DataFrame([dataset.index,labels]).T

Alternativement, vous pouvez essayer KMeans ++ pour Pandas .

27
user666