对一行的几个类别使用 One-Hot 编码
Use One-Hot encoding for few categories for one row
我有这样的分类数据集:
Name
Color (Category)
Car
Red
Grass
Green
Sky
Blue
Apple
Red,Green
Photo
Black,White
所以一行可以有一个或几个个类别。
此外,我还在为类别使用 OneHotEncoder:
data = asarray([['red'], ['green'], ['blue']])
print(data)
encoder = OneHotEncoder(sparse=False)
onehot = encoder.fit_transform(data)
print(onehot)
输出将是
[['red']
['green']
['blue']]
[[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]]
是否可以对两个或更多类别使用 OneHotEncoding?
喜欢 Red,Green
转换为 [0. 1. 1.]
?
我正在阅读 OneHotEncoder 和 tensorflow.keras.utils.to_categorical 文档,但找不到这样的解决方案。
另一个解决方案
我在某处遇到意见,我需要将我的逻辑更改为:
Name
Color (Category) (Remove)
Red
Green
Blue
Black
White
Car
//Red
True
False
False
False
False
Grass
//Green
False
True
False
False
False
Sky
//Blue
False
False
True
False
False
Apple
//Red,Green
True
True
False
False
False
Photo
//Black,White
False
False
False
True
True
因此只需忽略 颜色 列,并为顺序模型进行少量输出。
但是把Red,Green
转成[0. 1. 1.]
不就完全一样了吗?
我觉得我漏掉了一些明显的东西,如果我的问题很愚蠢,抱歉。
在你的情况下,最好使用 sklearn
中的 MultiLabelBinarizer
。如果 df
是包含数据集数据的数据框,您可以这样做:
mlb = MultiLabelBinarizer()
mlb.fit_transform(df["Color (Category)"].str.split(","))
Link 到 sklearn 文档:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MultiLabelBinarizer.html
一个热编码名称来自单个高位,其他都是低位。所以如果你将它编码为 011 它就不再是一种热编码了。
有一种二进制编码方法,但在那种情况下,如果你像这样随机编码
001 blue
010 red
011 green
100 blue red
那么这个场景就会有问题,因为红色和绿色会共享第二个位,它们会在整个训练过程中相互影响。
因此,为了安排这些共享位以促进学习,您展示的 table 是解决此问题的合乎逻辑的方法,如下所示
001 blue
010 red
100 green
110 green red
111 green blue red
我有这样的分类数据集:
Name | Color (Category) |
---|---|
Car | Red |
Grass | Green |
Sky | Blue |
Apple | Red,Green |
Photo | Black,White |
所以一行可以有一个或几个个类别。
此外,我还在为类别使用 OneHotEncoder:
data = asarray([['red'], ['green'], ['blue']])
print(data)
encoder = OneHotEncoder(sparse=False)
onehot = encoder.fit_transform(data)
print(onehot)
输出将是
[['red']
['green']
['blue']]
[[0. 0. 1.]
[0. 1. 0.]
[1. 0. 0.]]
是否可以对两个或更多类别使用 OneHotEncoding?
喜欢 Red,Green
转换为 [0. 1. 1.]
?
我正在阅读 OneHotEncoder 和 tensorflow.keras.utils.to_categorical 文档,但找不到这样的解决方案。
另一个解决方案
我在某处遇到意见,我需要将我的逻辑更改为:
Name | Color (Category) (Remove) | Red | Green | Blue | Black | White |
---|---|---|---|---|---|---|
Car | //Red | True | False | False | False | False |
Grass | //Green | False | True | False | False | False |
Sky | //Blue | False | False | True | False | False |
Apple | //Red,Green | True | True | False | False | False |
Photo | //Black,White | False | False | False | True | True |
因此只需忽略 颜色 列,并为顺序模型进行少量输出。
但是把Red,Green
转成[0. 1. 1.]
不就完全一样了吗?
我觉得我漏掉了一些明显的东西,如果我的问题很愚蠢,抱歉。
在你的情况下,最好使用 sklearn
中的 MultiLabelBinarizer
。如果 df
是包含数据集数据的数据框,您可以这样做:
mlb = MultiLabelBinarizer()
mlb.fit_transform(df["Color (Category)"].str.split(","))
Link 到 sklearn 文档:https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.MultiLabelBinarizer.html
一个热编码名称来自单个高位,其他都是低位。所以如果你将它编码为 011 它就不再是一种热编码了。 有一种二进制编码方法,但在那种情况下,如果你像这样随机编码
001 blue
010 red
011 green
100 blue red
那么这个场景就会有问题,因为红色和绿色会共享第二个位,它们会在整个训练过程中相互影响。
因此,为了安排这些共享位以促进学习,您展示的 table 是解决此问题的合乎逻辑的方法,如下所示
001 blue
010 red
100 green
110 green red
111 green blue red