【发布时间】:2020-04-30 03:40:02
【问题描述】:
我有一个带有“州名”的分类列。我不确定我必须执行哪种类型的分类编码才能将它们转换为数字类型。
有 83 个独特的州名。
标签编码器用于有序分类变量,但 OneHot 会增加列数,因为有 83 个唯一的州名称。
还有什么我可以尝试的吗?
【问题讨论】:
标签: python categorical-data one-hot-encoding label-encoding
我有一个带有“州名”的分类列。我不确定我必须执行哪种类型的分类编码才能将它们转换为数字类型。
有 83 个独特的州名。
标签编码器用于有序分类变量,但 OneHot 会增加列数,因为有 83 个唯一的州名称。
还有什么我可以尝试的吗?
【问题讨论】:
标签: python categorical-data one-hot-encoding label-encoding
我会使用 scikit 的 OneHotEncoder (https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.OneHotEncoder.html) 或编码设置为“onehot”的 CategoricalEncoder。它会自动找到每个特征的唯一值并将其处理成一个热向量。它确实增加了该特征的输入维数,但如果你正在做任何类型的数据科学工作,这是必要的。如果您将特征转换为序数整数(即只有一个整数)而不是二进制值的向量,算法可能会在两个(可能完全分开的)分类值之间得出错误的结论,而这两个分类值恰好在分类空间中靠近在一起.
【讨论】:
除了一个hot之外还有其他强大的编码方案,不增加列数。您可以尝试以下方法(按复杂度递增的顺序):
计数编码:根据每个类别在数据中出现的次数对每个类别进行编码,在某些情况下很有用。例如,如果你想对纽约是一个大城市的信息进行编码,数据中的 NY 计数确实包含该信息,因为我们预计 NY 会经常出现。
目标编码:通过该类别内目标/结果(如果目标是连续的)的平均值对每个类别进行编码;或者如果它是离散的,则通过目标的概率。一个例子是当你想对 neighborhood 进行编码时,这对于预测房价显然很重要;当然,您可以将每个社区名称替换为该社区的平均房价。这极大地改进了预测(如预测房价的my Kaggle notebook 所示)。
还有其他有用的编码方案,如 Catboost、证据权重等。一个非常好的事情是所有这些方案都已在库 categorical encoderhere 中实现。
【讨论】: