python 中 k 均值聚类算法中接近分类数据的方法

Way of approaching categorical data in k-means clustering algorithm in python

我面临以下问题。我有一个包含以下字段的 csv 文件

vendor, number_of_products, price, shipping_country

我正在尝试使用 python 和来自 sci-kit 的 k-means 进行聚类。我遇到的主要问题是处理分类数据的方式(更具体的是包含国家字符串的字段 shipping_country )。 我的意图是为 shipping_country 字段分配权重。我最初的想法是用 1-20 中的数字替换每个国家(例如 1 是 "stronger" 而不是 20 - 全球 -->1 ,巴拿马 -->20)。这种方法的问题在于它不是科学有效的(或者至少我无法证明这一点)。有人有什么建议吗?由于时间压力,我真的很感激一个编码示例(如果可能的话)!我正在使用 python。提前致谢!

正如我在评论中提到的,我认为您不一定要对该列进行加权。你想要的(我认为)是一种让类别成为数字的方法。这可以通过 one-hot encoding 在 sci-kit learn 中完成。在 pandas 中,这是通过 pd.get_dummies() 完成的。

我将向您展示这是如何工作的:

df = pd.DataFrame({'nums' : [1, 4, 6, 7],
                   'colors': ['red', 'blue', 'green', 'yellow']})

df
Out[21]: 
   nums  colors
     1     red
     4    blue
     6   green
     7  yellow

pd.get_dummies(df)
Out[22]: 
   nums  colors_blue  colors_green  colors_red  colors_yellow
     1            0             0           1              0
     4            1             0           0              0
     6            0             1           0              0
     7            0             0           0              1

现在,对于 'colors' 中的每个类别,我们都有一个带有二进制指示符的新列。但是,这里的信息太多了。当您处理 prediction/regression 时,您必须担心多重共线性,这是由您的预测变量集中的冗余信息引起的。

在这种情况下,如果所有其他指标都为 0,我们可以推断颜色为蓝色。换句话说,我们不需要 colors_blue 列来表示蓝色,我们可以推断来自其他列中包含的信息。

出于这些原因,您可能希望添加参数 drop_first=True,如下所示。

pd.get_dummies(df, drop_first=True)
Out[23]: 
   nums  colors_green  colors_red  colors_yellow
     1             0           1              0
     4             0           0              0
     6             1           0              0
     7             0           0              1

在不知道您的具体用例的情况下,我无法告诉您使用哪个。但是,我认为在大多数情况下,您可能确实想要删除其中一个分类列