2015-01-19 24 views
20

Datensatz ist Pandas Datenrahmen. Dies ist sklearn.cluster.KMeansWird Pandas Dataframe-Objekt mit Sklearn Kmeans Clustering arbeiten?

km = KMeans(n_clusters = n_Clusters) 

km.fit(dataset) 

prediction = km.predict(dataset) 

Dies ist, wie ich entscheiden, welche Unternehmen gehört zu den Cluster:

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

Dies ist, wie Daten-Set aussieht:

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

wo A, B , C sind Indizes

Ist dies die richtige Art der Verwendung von K-Means?

+1

Ihre Frage ist ein wenig unklar, sklearn akzeptiert numpy Arrays als Eingänge im Allgemeinen und so Pandas Datenrahmen sind kompatibel, in bestimmten Fällen habe ich festgestellt, dass Sie für ein numpy Array zurück fragen müssen so: 'df.values' oder df. col.values' als Beispiel, also sollte es im Prinzip funktionieren, bitte versuchen Sie es und wenn Sie einen Haken haben kommen Sie zurück mit Code und Daten – EdChum

Antwort

12

Um zu wissen, ob Ihre Datenrahmen dataset geeigneten Inhalt hat man explizit auf eine numpy Array umwandeln kann:

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

Wenn das Array eine homogene numerische dtype (typischerweise numpy.float64) hat dann ist es in Ordnung sein Scikit-Learn 0.15.2 und später. Sie müssen die Daten möglicherweise noch normalisieren, beispielsweise mit sklearn.preprocessing.StandardScaler.

Wenn Ihr Datenrahmen heterogen typisiert ist, ist die dtype des entsprechenden numpy Array object, die nicht für scikit-lernen geeignet ist. Sie müssen eine numerische Repräsentation für alle relevanten Features extrahieren (zum Beispiel durch Extrahieren von Dummy-Variablen für kategoriale Features) und die Spalten löschen, die keine geeigneten Features sind (z. B. Beispiel-IDs).

17

Unter der Annahme, alle Werte in dem Datenrahmen sind numerisch,

# 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 

Alternativ Sie KMeans++ for Pandas versuchen könnten.

+2

Beachten Sie, dass ein viel besserer Weg zum Erstellen der Ergebnisse 'results = pd.DataFrame (data = labels , columns = ['cluster'], index = collapsed.index) ', was die Notwendigkeit der Transponierung beseitigt, fügt die richtige Indizierung hinzu und beschriftet – FooBar

+0

@FooBar was ist collapsed/collapsed.index? –

Verwandte Themen