gpt4 book ai didi

python-3.x - 在机器学习中,编码非分层分类特征的最佳方法是什么?

转载 作者:行者123 更新时间:2023-11-30 09:28:13 25 4
gpt4 key购买 nike

对于字符串特征,当顺序无关紧要时,使用 dummies 或 oneHotEncoder 哪个更好?

例如,在此 pandas 数据框中:

df_with_cat = pd.DataFrame({'A': ['ios', 'android', 'web', 'NaN', 'ios','ios', 'NaN', 'android'], 'B' : [4, 4, 'NaN', 2, 'NaN', 3, 3, 'NaN']})

df_with_cat.head()

A B
---------------
0 ios 4
1 android 4
2 web NaN
3 NaN 2
4 ios NaN
5 ios 3
6 NaN 3
7 android NaN

我知道现在为了处理它们(估算缺失值等)我必须对它们进行编码,如下所示:

from sklearn.preprocessing import LabelEncoder

df_with_cat_orig = df_with_cat.copy()
la_encoder = LabelEncoder()
df_with_cat['A'] = la_encoder.fit_transform(df_with_cat.A)

输出:

df_with_cat.head(10)

A B
-----------
0 2 4
1 1 4
2 3 NaN
3 0 2
4 2 NaN
5 2 3
6 0 3
7 1 NaN

但现在似乎有一些顺序 0-3 但事实并非如此... 'ios' ->2 不一定大于 'android' -> 1

最佳答案

分类特征与数值特征不同,分类特征是一组离散值,而数值特征形成连续序列。例如对于特征“动物”,如果 1 -> 猫,2 -> 狗,你不能有 1.5,你要么是 1,要么是 2。在这个设置中,狗不一定大于猫 - 一和二只是“真实”特征的编码。

另一方面,对于特征“价格”,您有很大范围的可能值,并且对于哪些值大于其他值有明确的定义。

在处理分类特征方面,您说得对——我们对它们进行编码。例如 sklearn.preprocessing 有 OrdinalEncoder它只是将分类特征(主要是“male”、“female”等字符串)转换为整数。

现在我不太熟悉 sklearn 以及它需要什么类型的编码,但我觉得我应该讨论一些更“高级”的方法来编码分类特征。根据您使用的机器学习模型,这些可能适用也可能不适用。就我个人而言,我主要将它们与神经网络一起使用。

更简单的是 one-hot-encoding,它类似于默认将每个类别编码为整数。除了这次为了解决模型将一个类别视为大于另一个类别的问题之外,它使用了一个由 1 和 0 组成的数组。即“猫”-> 0-> [1, 0, 0],“狗”-> 1-> [0, 1, 0],“鸟”-> 2 -> [0, 0, 1]。本质上,每个类别都被编码为一个整数索引,并且您的结果是一个除该索引处的 1 之外全部为零的数组。

我们编码的另一种方法是使用嵌入。它与 one-hot 编码非常相似,因为您将整数索引(对于类别)转换为 n 维向量。然而,它节省了空间,因为向量的大小可以小于类别的数量。这通常用于处理语义信息的神经网络。每个单词作为整数索引传递到模型中,但嵌入层将每个索引转换为 n 维向量。当您训练模型时,嵌入层会越来越好地表示每个类别。

关于python-3.x - 在机器学习中,编码非分层分类特征的最佳方法是什么?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54614098/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com