K-means 仅使用带有 scikit-learn 的特定数据框列

Posted

技术标签:

【中文标题】K-means 仅使用带有 scikit-learn 的特定数据框列【英文标题】:K-means using only specific dataframe columns with scikit-learn 【发布时间】:2019-01-21 19:54:18 【问题描述】:

我正在使用来自scikit-learn 库的k-means 算法,并且我想要聚类的值位于具有3 列的pandas 数据框中:IDvalue_1value_2

我想使用value_1value_2 对信息进行聚类,但我也想保持ID 与之关联(这样我就可以在每个聚类中创建IDs 的列表)。

这样做的最佳方法是什么?目前它也使用ID 号码进行集群,这不是本意。

我当前的代码(X 是 pandas 数据框):

kmeans = KMeans(n_clusters=2, n_init=3, max_iter=3000, random_state=1)
(X_train, X_test) = train_test_split(X[['value_1','value_2']],test_size=0.30)
kmeans = kmeans.fit(X_train)

【问题讨论】:

为什么不使用 kmeans 创建另一个数据框并添加 value_3 列? 【参考方案1】:

仅使用感兴趣的列进行聚类(如您的示例中所示)。然后将标签列表kmeans.labels_ 作为另一列添加到X_train(或X_test)。标签的顺序与原始行的顺序相同。

# A toy DF
X = pd.DataFrame('id': [1,2,3,4,5],
                  'value_1': [1,3,1,4,5],
                  'value_2': [0,0,1,5,0])

# Split ALL columns
(X_train, X_test) = train_test_split(X,test_size=0.30)
# Cluster using SOME columns
kmeans = kmeans.fit(X_train[['value_1','value_2']])
# Save the labels
X_train.loc[:,'labels'] = kmeans.labels_

由于X_trainX_tests 都是X 的切片,您可能会在此处看到警告:

试图在 DataFrame 中的切片副本上设置值。

你可以忽略它。

X_train
#   id  value_1  value_2  labels
#4   5        5        0       0
#0   1        1        0       0
#3   4        4        5       1

【讨论】:

从编码的角度来看,问题 (+1) 和答案 (+1) 都很好;但是,通常对于 kmeans(或一般聚类),我们不会拆分为训练和测试子集... 我知道,我们在我的项目中以所有错误的方式使用了 k-means - 但这是故意的 .loc[] 将对最近的 pandas 版本发出警告。 X_train = X_train.assign(labels=kmeans.labels_) 会更好。

以上是关于K-means 仅使用带有 scikit-learn 的特定数据框列的主要内容,如果未能解决你的问题,请参考以下文章

使用带有纹理分析和 (x,y) 坐标的 K-means 进行图像分割

使用带有 Silhouette 函数的 k-means 聚类时如何选择 k?

使用带有 Silhouette 函数的 k-means 聚类时如何选择 k?

使用带有 L 方法的平滑器来确定 K-Means 聚类的数量

带有 PCA 分解的 k-means 聚类的质心是啥?

如何在镶木地板文件中使用 K-means