我可以仅对多个数据类型的 DataFrame 中的数值数据使用 K-Means 吗?
Can I use K-Means on only the numerical data in a DataFrame of multiple dtypes?
我正在做一个分析电子商务网站页面访问的项目。它监控数值、数值离散(连续数字但仅限整数)和分类变量。
我的理解是,由于 KMeans 在 numbers/distances 上采用均值和执行计算的性质,它不能很好地处理分类变量。我也不认为它适用于数字离散值,因为当不应该有这些离散值的分数时,它会使用小数来解释它们。
这里是我如何 运行 sklearn 的 KMeans 的代码,用剪影得分测量 k 个簇并使用得分最高的 k 个簇。我创建了一个名为 cluster_df 的数据框,仅包含原始数据框中的数字特征,然后为每个集群单独创建数据框:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
cluster_df[cluster_attribs] = scaler.fit_transform(cluster_df[cluster_attribs])
k_rng = range(2,10)
silhouette = []
for k in k_rng:
kmeans = KMeans(n_clusters=k)
kmeans.fit(cluster_df[cluster_attribs])
silhouette.append(silhouette_score(cluster_df[cluster_attribs], kmeans.labels_))
kmeans = KMeans(n_clusters=3)
y_pred = kmeans.fit_predict(cluster_df[cluster_attribs])
cluster_df['cluster'] = y_pred
# inverse StandardScaler to return values to normal
cluster_df[cluster_attribs] = scaler.inverse_transform(cluster_df[cluster_attribs])
cluster0 = cluster_df[cluster_df.cluster==0]
cluster1 = cluster_df[cluster_df.cluster==1]
cluster2 = cluster_df[cluster_df.cluster==2]
然后我根据这 3 个集群执行数据 visualizations/analysis。它似乎可以很好地对数据进行聚类,即使在查看分类数据时,它似乎也与脑海中的那些聚类在一起,即使它们没有包含在实际的聚类中。
例如,Revenue 是我没有包含在 KMeans 中的二进制列。但是我的 3 个集群似乎已经将我的客户很好地分为低收入、中等收入和高收入,只是 运行 在数值变量上进行调整。
我的问题是:
1) KMeans 只适用于数值数据,而不适用于离散数值或分类数据,这是真的吗? (我读过有一些方法可以将分类变量转换为数值,但由于该项目的性质,它看起来很复杂且不可靠准确。我知道 OneHotEncoder/LabelEncoder/MultiLabelBinarizer 但我的意思是将它们转换为保持类别之间的距离记住哪个更复杂)。
2) 运行 KMeans 仅在您的数值数据上,分成聚类,然后为所有变量(数值、离散数值、分类)提取对数据聚类的见解是否是一种可接受的策略通过查看它们是如何分开的?
1)
- 我通常将它们转换为使用 oneHot,然后我将 n 的值除以该类别中唯一身份的数量,通常这工作正常。在这种情况下,您将有更多 n-1 列用于您已经拥有的每个分类列
- 如果您有序数值,请使用 LabelEncoder,然后按照我之前的解释将它们分开。在这种情况下,您将保留相同数量的列
2)
- 如果您的数据集在没有分类数据的情况下运行良好,为什么不呢?但我会建议你测试更多的可能性
我正在做一个分析电子商务网站页面访问的项目。它监控数值、数值离散(连续数字但仅限整数)和分类变量。
我的理解是,由于 KMeans 在 numbers/distances 上采用均值和执行计算的性质,它不能很好地处理分类变量。我也不认为它适用于数字离散值,因为当不应该有这些离散值的分数时,它会使用小数来解释它们。
这里是我如何 运行 sklearn 的 KMeans 的代码,用剪影得分测量 k 个簇并使用得分最高的 k 个簇。我创建了一个名为 cluster_df 的数据框,仅包含原始数据框中的数字特征,然后为每个集群单独创建数据框:
from sklearn.preprocessing import StandardScaler
scaler = StandardScaler()
cluster_df[cluster_attribs] = scaler.fit_transform(cluster_df[cluster_attribs])
k_rng = range(2,10)
silhouette = []
for k in k_rng:
kmeans = KMeans(n_clusters=k)
kmeans.fit(cluster_df[cluster_attribs])
silhouette.append(silhouette_score(cluster_df[cluster_attribs], kmeans.labels_))
kmeans = KMeans(n_clusters=3)
y_pred = kmeans.fit_predict(cluster_df[cluster_attribs])
cluster_df['cluster'] = y_pred
# inverse StandardScaler to return values to normal
cluster_df[cluster_attribs] = scaler.inverse_transform(cluster_df[cluster_attribs])
cluster0 = cluster_df[cluster_df.cluster==0]
cluster1 = cluster_df[cluster_df.cluster==1]
cluster2 = cluster_df[cluster_df.cluster==2]
然后我根据这 3 个集群执行数据 visualizations/analysis。它似乎可以很好地对数据进行聚类,即使在查看分类数据时,它似乎也与脑海中的那些聚类在一起,即使它们没有包含在实际的聚类中。
例如,Revenue 是我没有包含在 KMeans 中的二进制列。但是我的 3 个集群似乎已经将我的客户很好地分为低收入、中等收入和高收入,只是 运行 在数值变量上进行调整。
我的问题是:
1) KMeans 只适用于数值数据,而不适用于离散数值或分类数据,这是真的吗? (我读过有一些方法可以将分类变量转换为数值,但由于该项目的性质,它看起来很复杂且不可靠准确。我知道 OneHotEncoder/LabelEncoder/MultiLabelBinarizer 但我的意思是将它们转换为保持类别之间的距离记住哪个更复杂)。
2) 运行 KMeans 仅在您的数值数据上,分成聚类,然后为所有变量(数值、离散数值、分类)提取对数据聚类的见解是否是一种可接受的策略通过查看它们是如何分开的?
1)
- 我通常将它们转换为使用 oneHot,然后我将 n 的值除以该类别中唯一身份的数量,通常这工作正常。在这种情况下,您将有更多 n-1 列用于您已经拥有的每个分类列
- 如果您有序数值,请使用 LabelEncoder,然后按照我之前的解释将它们分开。在这种情况下,您将保留相同数量的列
2)
- 如果您的数据集在没有分类数据的情况下运行良好,为什么不呢?但我会建议你测试更多的可能性