对多列执行 k-means 聚类
数据挖掘
Python
聚类
熊猫
2021-09-26 06:08:14
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
这就是可视化
其它你可能感兴趣的问题