如何解释聚类心力衰竭数据集的结果?

数据挖掘 Python 聚类 k-均值
2022-02-26 04:47:42

我正在对此数据集进行分析:单击

在这个数据集中有 13 个特征,12 个输入,1 个是目标变量,称为“DEATH_EVENT”。我尝试使用这些特征来预测该数据集中患者的生存情况。但是,现在我正在尝试进行聚类分析,以查看患者是否被分组。这是我写的代码。

from sklearn.cluster import KMeans
Features = ['ejection_fraction','serum_creatinine'] #the highest correlated features with death_event
X = heart_data[Features]

wcss = []
for i in range(1, 11):
    kmeans = KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0)
    kmeans.fit(X)
    wcss.append(kmeans.inertia_)
plt.plot(range(1, 11), wcss)
plt.title('Elbow Method')
plt.xlabel('Number of clusters')
plt.ylabel('WCSS')
plt.show()

弯头 从这张图中,我可以观察到有 2 个集群。现在

kmeans = KMeans(n_clusters=2, init='k-means++', max_iter=300, n_init=10, random_state=0)
pred_y = kmeans.fit_predict(X)
plt.scatter(X["ejection_fraction"], X["serum_creatinine"])
plt.scatter(kmeans.cluster_centers_[:, 0], kmeans.cluster_centers_[:, 1], s=300, c='red')
plt.show()

我得到了这张图表: 质心

现在,我能从这张图表中说些什么?我认为它没有用,对吧?我只使用了特征jection_fraction 和serum_creatinine,因为这些是我唯一用于预测的。或者我必须使用除 DEATH_EVENT 之外的所有变量?这样:

X = heart_data.iloc[:, :11]

但在这种情况下,我得到了这个: 所有功能

我无法理解这些图表,我认为我做错了什么,但是什么?集群在哪里?如何解释这些结果?

更新:我无法使用 Umap_learn,我的 Mac 无法安装它,我收到很多错误。但是,我做了一些与您的建议有关的事情。这里有所有代码:https ://pastebin.com/RdJb0ydu 前 2 部分是您在此处编写的代码。在第三部分中,我使用 kmeans(n_clusters=2) 因为从剪影中我看到最好的是 2 个集群。然后我进行预测并将结果连接到原始数据集,并打印出 DEATH_EVENT 列和聚类结果列。从这个专栏,我能说什么?我如何理解预测的 0 是指幸存的患者还是死亡的患者?

1个回答

我将使用所有功能并查看我的集群的分离性如何根据某些指标表现,例如,silhouette score

此外,在聚类之前缩放数据非常重要,因为 kmeans 是一种基于距离的算法。

heart_data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/00519/heart_failure_clinical_records_dataset.csv")

from sklearn.cluster import KMeans
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score

Features = heart_data.drop(["DEATH_EVENT"], axis = 1).columns

X = heart_data[Features]

sc = []
for i in range(2, 25):
    kmeans = Pipeline([("scaling",StandardScaler()),("clustering",KMeans(n_clusters=i, init='k-means++', max_iter=300, n_init=10, random_state=0))]).fit(X)
    score = silhouette_score(X, kmeans["clustering"].labels_)
    sc.append(score)
plt.plot(range(2, 25), sc, marker = "o")
plt.title('Silhouette')
plt.xlabel('Number of clusters')
plt.ylabel('Score')
plt.show()

您还可以尝试不同的功能组合,以使得分最高

出于可视化目的,您可以使用分解技术

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
plt.style.use("seaborn-whitegrid")

pca = Pipeline([("scaling",StandardScaler()),("decompositioning",PCA(n_components = 2))]).fit(X)

X2D = pca.transform(X)

plt.scatter(X2D[:,0],X2D[:,1], c = kmeans["clustering"].labels_, cmap = "RdYlBu")
plt.colorbar();

最后但并非最不重要的一点是,我建议在您的数据中使用诸如UMAP之类的流形投影,它可能会通过生成“定义明确的”集群来帮助您完成任务(可能但不一定,但值得尝试)

看,通过使用 UMAP,结果似乎有所改善:

代码:

# pip install umap-learn

heart_data = pd.read_csv("https://archive.ics.uci.edu/ml/machine-learning-databases/00519/heart_failure_clinical_records_dataset.csv")

from sklearn.cluster import KMeans, DBSCAN
from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from sklearn.metrics import silhouette_score
from umap import UMAP

Features = heart_data.drop(["DEATH_EVENT"], axis = 1).columns

X = heart_data[Features]

sc = []
for i in range(2, 25):
    kmeans = Pipeline([("scaling",StandardScaler()),("umap",UMAP()),("clustering",KMeans(n_clusters=i, init='k-means++',random_state=0))]).fit(X)
    score = silhouette_score(X, kmeans["clustering"].labels_)
    sc.append(score)
plt.plot(range(2, 25), sc, marker = "o")
plt.title('Silhouette')
plt.xlabel('Number of clusters')
plt.ylabel('Score')
plt.show()

from sklearn.decomposition import PCA
import matplotlib.pyplot as plt
plt.style.use("seaborn-whitegrid")

kmeans = Pipeline([("scaling",StandardScaler()),("umap",UMAP()),("clustering",KMeans(n_clusters=3, init='k-means++',random_state=0))]).fit(X)

pca = Pipeline([("scaling",StandardScaler()),("umap",UMAP()),("decompositioning",PCA(n_components = 2))]).fit(X)

X2D = pca.transform(X)

plt.scatter(X2D[:,0],X2D[:,1], c = kmeans["clustering"].labels_, cmap = "RdYlBu")
plt.colorbar();

在此处输入图像描述

绘图显示 umap 投影的第一个和第二个主成分(它只是对所有特征在 2D 空间中的外观的投影)

颜色是集群 ID。即对于我们看到的每种颜色,算法(k-means)将每个观察值分配给哪个集群。