2 回答

TA贡献1862条经验 获得超6个赞
我认为您有 3 个选项如何将分类特征转换为数值:
使用OneHotEncoder。您将分类特征转换为四个新列,其中只有一个 1 和另一个 0。这里的问题是“早上”和“下午”之间的区别与“早上”和“晚上”相同。
使用OrdinalEncoder。您将分类特征转换为一列。“早上”到1,“下午”到2等等。“早上”和“下午”之间的差异会比“早上”和“晚上”要小,这很好,但“早上”和“晚上”之间的差异会是最好的,这可能不是你想要的。
使用我称之为 two_hot_encoder 的转换。它与 OneHotEncoder 类似,行中只有两个 1。“早上”和“下午”之间的差异将与“早上”和“晚上”之间的差异相同,并且会小于“早上”和“晚上”之间的差异。我认为这是最好的解决方案。检查代码。
代码:
def two_hot(x):
return np.concatenate([
(x == "morning") | (x == "afternoon"),
(x == "afternoon") | (x == "evening"),
(x == "evening") | (x == "night"),
(x == "night") | (x == "morning"),
], axis=1).astype(int)
x = np.array([["morning", "afternoon", "evening", "night"]]).T
print(x)
x = two_hot(x)
print(x)
输出:
[['morning']
['afternoon']
['evening']
['night']]
[[1 0 0 1]
[1 1 0 0]
[0 1 1 0]
[0 0 1 1]]
然后我们可以测量距离:
from sklearn.metrics.pairwise import euclidean_distances
euclidean_distances(x)
输出:
array([[0. , 1.41421356, 2. , 1.41421356],
[1.41421356, 0. , 1.41421356, 2. ],
[2. , 1.41421356, 0. , 1.41421356],
[1.41421356, 2. , 1.41421356, 0. ]])

TA贡献1784条经验 获得超7个赞
这个问题在机器学习应用程序中很常见。您需要将一个类别定义为基本类别(哪个无关紧要),然后为其他每个类别定义指标变量(0 或 1)。换句话说,创建 3 个新变量,分别称为“早晨”、“下午”和“晚上”,并为每个观测值的类别分配一个。如果是夜间观察,请将这些新变量中的每一个都保留为 0。
添加回答
举报