2015-01-19 13 views
20

dataset è pandas dataframe. Questo è sklearn.cluster.KMeansL'oggetto dataframe panda funziona con il clustering di kmi di sklearn?

km = KMeans(n_clusters = n_Clusters) 

km.fit(dataset) 

prediction = km.predict(dataset) 

È così decido quale entità appartiene a quale cluster:

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

Ecco come appare insieme di dati:

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

dove A, B , C sono indici

È questo il modo corretto di usare k-means?

+1

La tua domanda è un po 'poco chiara, sklearn accetta array numpy come input in generale e quindi i datafram di pandas sono compatibili, in alcuni casi ho scoperto che è necessario chiedere un array numpy così: 'df.values' o df. col.values' come esempio, quindi in pratica dovrebbe funzionare, per favore prova e se colpisci un ostacolo torna con codice e dati – EdChum

risposta

12

sapere se la vostra dataframe dataset ha un contenuto adatto si può esplicitamente convertire in un array di NumPy:

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

Se l'array ha una omogenea numerico dtype (tipicamente numpy.float64) allora dovrebbe andare bene per scikit-learn 0.15.2 e successive. Ad esempio, potrebbe essere necessario normalizzare i dati con sklearn.preprocessing.StandardScaler.

Se il frame di dati viene digitato eterogeneo, il dtype della corrispondente matrice NumPy saranno object che non è adatto per scikit-learn. È necessario estrarre una rappresentazione numerica per tutte le funzionalità rilevanti (ad esempio estraendo le variabili dummy per le caratteristiche categoriali) e rilasciare le colonne che non sono caratteristiche idonee (ad esempio identificatori di esempio).

17

Supponendo tutti i valori nella dataframe sono numerici,

# Convert DataFrame to matrix 
mat = dataset.as_matrix() 
# 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 

In alternativa, si potrebbe provare KMeans++ for Pandas.

+2

Nota che un modo molto migliore per creare i risultati è 'results = pd.DataFrame (data = labels , columns = ['cluster'], index = collapsed.index) ', che rimuove la necessità di trasposizione, aggiunge l'indicizzazione e l'etichetta appropriate – FooBar

+0

@FooBar cosa è collassato/collapsed.index? –