OneHot编码完整的String数据帧

时间:2018-07-02 18:05:13

标签: python pandas numpy tensorflow keras

我有一个数据框,其中有6列,数据类型为string(所有数据均为String类型)。我想将数据编码为二进制矢量,以便在KerasTensorflow中进行训练。

  Llower  Lupper   Lbody        OpenStyle       CloseStyle  Color
0   long  middle    long   open_equal_low   open_equal_low  green
1  equal   short    long   open_equal_low   open_equal_low    red
2  equal  middle  middle  open_equal_high   open_equal_low    red
3  equal   short  middle  open_equal_high  open_equal_high  green
4  short   short  middle   open_equal_low  open_equal_high    red

我尝试将它们编码为int,然后再编码为binary vector。 我的转换为int的代码:

df = df.apply(labelEncoder.fit_transform)

结果:

   Llower  Lupper  Lbody  OpenStyle  CloseStyle  Color
0       1       2      1          2           2      1
1       0       3      1          2           2      2
2       0       2      2          1           2      2
3       0       3      2          1           1      1
4       3       3      2          2           1      2

当我尝试使用to_categorical进行转换时:

df.Llower = to_categorical(df.Llower,num_classes=4)
df.Lbody = to_categorical(df.Lbody,num_classes=4)
df.Lupper = to_categorical(df.Lupper,num_classes=4)
df.OpenStyle = to_categorical(df.OpenStyle,num_classes=5)
df.CloseStyle = to_categorical(df.CloseStyle,num_classes=5)
df.Color = to_categorical(df.Color,num_classes=3)

结果:

   Llower  Lupper  Lbody  OpenStyle  CloseStyle  Color
0     0.0     0.0    0.0        0.0         0.0    0.0
1     1.0     0.0    0.0        0.0         0.0    0.0
2     1.0     0.0    0.0        0.0         0.0    0.0
3     1.0     0.0    0.0        0.0         0.0    0.0
4     0.0     0.0    0.0        0.0         0.0    0.0

将数据转换为二进制向量是错误的。 我该如何正确地将数据编码为二进制矢量?

我的第二个问题:

在对数据进行编码之后,我必须将其转换为Np Array,并全部使用此代码float64。这种数据类型转换(从dataset = df.valuesbinary vector)对训练质量是否有任何影响?将数据转换为float64后如何将其保留为binary vectory

1 个答案:

答案 0 :(得分:1)

我将使用伪列,您可以使用pd.get_dummies进行设置。简而言之,这将为原始数据帧中每个级别的因子创建零列或一列。这是处理用于机器学习(包括用于神经网络)的分类数据的常用方法。例如:

pd.get_dummies(df, drop_first=True)

哪个返回:

   Llower_long  Llower_short  Lupper_short  Lbody_middle  \
0            1             0             0             0   
1            0             0             1             0   
2            0             0             0             1   
3            0             0             1             1   
4            0             1             1             1   

   OpenStyle_open_equal_low  CloseStyle_open_equal_low  Color_red  
0                         1                          1          0  
1                         1                          1          1  
2                         0                          1          1  
3                         0                          0          0  
4                         1                          0          1  

我之所以使用drop_first=True是因为您只需要n-1列,其中n是每个类别的级别数,因为其余信息是多余的。如果您出于某种原因保留所有列,则可以省略该参数