对多列执行 k-means 聚类

数据挖掘 Python 聚类 熊猫
2021-09-26 06:08:14

我正在尝试在多个列上执行 k-means 聚类。我的数据集由 4 个数值列和 1 个分类列组成。我已经研究过以前的问题,但答案并不令人满意。

我知道如何在两列上执行算法,但我发现在 4 个数值列上应用相同的算法非常困难。

我现在对可视化数据不是很感兴趣,而是在表格中显示集群。图片显示第一行属于集群编号 2,依此类推。这正是我需要实现的,但是使用 4 个数字列,因此每一行必须属于某个集群。

您对如何实现这一目标有任何想法吗?任何想法都会有很大帮助。提前致谢!在此处输入图像描述

2个回答

2 列和 4 列在方法学上没有区别。如果您有问题,那么它们可能是由于您的列的内容。K-Means 需要数值列,没有空值/无限值,并避免分类数据。在这里,我用 4 个数字特征来做:

import pandas as pd
from sklearn.datasets.samples_generator import make_blobs
from sklearn.cluster import KMeans

X, _ = make_blobs(n_samples=10, centers=3, n_features=4)

df = pd.DataFrame(X, columns=['Feat_1', 'Feat_2', 'Feat_3', 'Feat_4'])

kmeans = KMeans(n_clusters=3)

y = kmeans.fit_predict(df[['Feat_1', 'Feat_2', 'Feat_3', 'Feat_4']])

df['Cluster'] = y

print(df.head())

哪个输出:

     Feat_1    Feat_2    Feat_3    Feat_4  Cluster
0  0.005875  4.387241 -1.093308  8.213623        2
1  8.763603 -2.769244  4.581705  1.355389        1
2 -0.296613  4.120262 -1.635583  7.533157        2
3 -1.576720  4.957406  2.919704  0.155499        0
4  2.470349  4.098629  2.368335  0.043568        0

让我们以UCI 机器学习中的乳腺癌数据集为例。

这是它的样子

>> _data.head(5)

   Age        BMI  Glucose  Insulin      HOMA   Leptin  Adiponectin  Resistin  \
0   48  23.500000       70    2.707  0.467409   8.8071     9.702400   7.99585   
1   83  20.690495       92    3.115  0.706897   8.8438     5.429285   4.06405   
2   82  23.124670       91    4.498  1.009651  17.9393    22.432040   9.27715   
3   68  21.367521       77    3.226  0.612725   9.8827     7.169560  12.76600   
4   86  21.111111       92    3.549  0.805386   6.6994     4.819240  10.57635   

     MCP.1  Classification  
0  417.114               1  
1  468.786               1  
2  554.697               1  
3  928.220               1  
4  773.920               1 

如您所见,所有列都是数字的。现在让我们看看如何使用 K-Means 对数据集进行聚类。我们不需要最后一列标签。

### Get all the features columns except the class
features = list(_data.columns)[:-2]

### Get the features data
data = _data[features]

现在,执行实际的聚类,就这么简单。

clustering_kmeans = KMeans(n_clusters=2, precompute_distances="auto", n_jobs=-1)
data['clusters'] = clustering_kmeans.fit_predict(data)

2个或更多功能完全没有区别。我只是将数据框与我所有的数字列一起传递。

   Age        BMI  Glucose  Insulin      HOMA   Leptin  Adiponectin  Resistin  \
0   48  23.500000       70    2.707  0.467409   8.8071     9.702400   7.99585   
1   83  20.690495       92    3.115  0.706897   8.8438     5.429285   4.06405   
2   82  23.124670       91    4.498  1.009651  17.9393    22.432040   9.27715   
3   68  21.367521       77    3.226  0.612725   9.8827     7.169560  12.76600   
4   86  21.111111       92    3.549  0.805386   6.6994     4.819240  10.57635   

   cluster  
0        0  
1        0  
2        0  
3        0  
4        0 

您现在如何可视化聚类?好吧,如果您有超过 3 列,则不能直接执行此操作。但是,您可以应用主成分分析来减少 2 列中的空间并将其可视化。

### Run PCA on the data and reduce the dimensions in pca_num_components dimensions
reduced_data = PCA(n_components=pca_num_components).fit_transform(data)
results = pd.DataFrame(reduced_data,columns=['pca1','pca2'])

sns.scatterplot(x="pca1", y="pca2", hue=data['clusters'], data=results)
plt.title('K-means Clustering with 2 dimensions')
plt.show()

这是我使用的导入

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
from sklearn.decomposition import PCA
from sklearn.cluster import KMeans

这就是可视化

PCA 之后的 K-Means