sklearn - 如何在单热编码时合并丢失的数据

Joe*_*ggs 1 python numpy scikit-learn

我正在尝试在包含缺失数据的数据集中保留行.

使用sklearn对一列(或多列)进行单热编码时.是否有可能写一个规则if currentItem == nullif currentItem == 0然后设置输出数组为全0?

例如

A A B - > [[1, 0], [1, 0], [0,1]]

B B A - > [[0, 1], [0, 1], [1,0]]

null B A - > [[0, 0], [0, 1], [1,0]]


单热编码:

import numpy as np
from sklearn.preprocessing import LabelEncoder


dataset = np.loadtxt("someFile.csv", delimiter=",")
B = dataset[:,1]

encoder = LabelEncoder()
encoder.fit(B)
encoded_B = encoder.transform(B)

Y = to_categorical(encoded_B)
Run Code Online (Sandbox Code Playgroud)

编辑 - 示例数据集: 其中AE是输入,X和Y和输出

A     B     C     D     E     X      Y
7     6     3     3     2     11     4
5     6     0     0     7     15     7
3     3     9     null  7     12     7
7     null  7     null  7     12     13
null  7     4     6     12    13     4
null  5     7     6     null  14     7
2     6     0     0     2     13     3
7     null  7     null  2     13     7
Run Code Online (Sandbox Code Playgroud)

cs9*_*s95 7

如果你有熊猫,这很简单.

s = pd.Series(['A', 'A', 0, 'B', 0, 'A', np.nan])
s

0      A
1      A
2      0
3      B
4      0
5      A
6    NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)

使用replace转换0为NaN -

s = s.replace({0 : np.nan, '0' : np.nan})
s

0      A
1      A
2    NaN
3      B
4    NaN
5      A
6    NaN
dtype: object
Run Code Online (Sandbox Code Playgroud)

现在,调用pd.get_dummies,忽略NaN值.

pd.get_dummies(s)

   A  B
0  1  0
1  1  0
2  0  0
3  0  1
4  0  0
5  1  0
6  0  0
Run Code Online (Sandbox Code Playgroud)

对于数据帧,解决方案是相同的.

  • @JoeBoggs 为了详细说明上述评论,LabelEncoder(与 OneHotEncoder 结合使用)在将数据拆分为训练和测试的情况下很有用,测试和测试没有训练中的所有类别。在这种情况下, pd.get_dummies 将为训练和测试生成不同数量的列,并且可能会在管道的其他部分产生错误,因为列已更改。LabelEncoder 将保留列。但是当整体使用数据时,pd.get_dummies 会更好。 (2认同)