Pandas数据帧对象是否适用于sklearn kmeans聚类?

37

数据集是 Pandas 数据帧。这是 sklearn.cluster.KMeans。

 km = KMeans(n_clusters = n_Clusters)

 km.fit(dataset)

 prediction = km.predict(dataset)

这是我决定哪个实体属于哪个群集的方式:
 for i in range(len(prediction)):
     cluster_fit_dict[dataset.index[i]] = prediction[i]

这是数据集的样子:
 A 1 2 3 4 5 6
 B 2 3 4 5 6 7
 C 1 4 2 7 8 1
 ...

A、B、C为索引

这是使用k-means的正确方式吗?


2
你的问题有点不太清楚,一般来说sklearn接受numpy数组作为输入,因此pandas数据帧是兼容的。在某些情况下,我发现你需要请求一个numpy数组返回,例如:df.valuesdf.col.values,所以基本上它应该可以工作,请尝试一下,如果遇到问题,请带上代码和数据再来问。 - EdChum
2个回答

38

假设数据框中的所有值都是数值型数据,

# 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

或者,您可以尝试使用Pandas的KMeans++


3
请注意,创建结果的一个更好的方法是results = pd.DataFrame(data=labels, columns=['cluster'], index=collapsed.index),这种方法不需要转置,还能添加适当的索引和标签。 - FooBar
6
@FooBar 什么是 collapsed / collapsed.index? - 3pitt
dataset.as_matrix()已被弃用,请使用Dataset.values代替。https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DataFrame.as_matrix.html - mjimcua

23

要确定你的数据框 dataset 是否具有合适的内容,可以显式地将其转换为numpy数组:

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

如果数组具有同质的数值dtype(通常为numpy.float64),则对于 scikit-learn 0.15.2 及更高版本来说应该是可以的。但您可能仍需要使用sklearn.preprocessing.StandardScaler来归一化数据。

如果您的数据框架类型不均匀,则相应的 numpy 数组的 dtype 将为object,这对于 scikit-learn 不合适。您需要提取所有相关特征的数字表示(例如通过提取分类特征的虚拟变量),并删除不适合的特征列(例如样本标识符)。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接