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
在不知道您的具体用例的情况下,我无法告诉您使用哪个。但是,我认为在大多数情况下,您可能确实想要删除其中一个分类列
我面临以下问题。我有一个包含以下字段的 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
在不知道您的具体用例的情况下,我无法告诉您使用哪个。但是,我认为在大多数情况下,您可能确实想要删除其中一个分类列