如何在多标签二值化中处理NaN和None

时间:2018-04-17 04:21:57

标签: python scikit-learn

我正在使用scikitlearn进行多标签分类项目。我要做的是对目标功能进行二值化,但是,在数据转换过程中遇到了一些困难。

以下是原始数据:

107              RA37|RA41|RM153 |RWT037
108    DA35|DA47|DWT030|DA35|DA47|DWT030
109                                  NaN
110                        PI001 |PI040 
111                        PI001 |PI040 
112                     RA37|RA41|RWT037
113    DA35|DA47|DWT030|DA35|DA47|DWT030
114                                  NaN
Name: exclusions, dtype: object

然后我用str.split('|',expand=True)将其拆分为更多列,我得到以下输出:

        0   1   2   3   4   5   6   7   8   9   ... 18  19  20  21  22  23  24  25  26  27
107 RA37    RA41    RM153   RWT037  None    None    None    None    None    None    ... None    None    None    None    None    None    None    None    None    None
108 DA35    DA47    DWT030  DA35    DA47    DWT030  None    None    None    None    ... None    None    None    None    None    None    None    None    None    None
109 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN
110 PI001   PI040   None    None    None    None    None    None    None    None    ... None    None    None    None    None    None    None    None    None    None
111 PI001   PI040   None    None    None    None    None    None    None    None    ... None    None    None    None    None    None    None    None    None    None
112 RA37    RA41    RWT037  None    None    None    None    None    None    None    ... None    None    None    None    None    None    None    None    None    None
113 DA35    DA47    DWT030  DA35    DA47    DWT030  None    None    None    None    ... None    None    None    None    None    None    None    None    None    None
114 NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN ... NaN NaN NaN NaN NaN NaN NaN NaN NaN NaN

正如您所看到的,由于在处理之前有大量NaN,因此结果与NaN和无混合。这意味着我不能直接使用multilaberbinarizer来处理所有这些不同的数据类型。如何解决这个问题,提前谢谢!

1 个答案:

答案 0 :(得分:1)

假设以下列表是您的多标签目标:

107              RA37|RA41|RM153 |RWT037
108    DA35|DA47|DWT030|DA35|DA47|DWT030
109                                  NaN
110                         PI001 |PI040 
111                         PI001 |PI040 
112                     RA37|RA41|RWT037
113    DA35|DA47|DWT030|DA35|DA47|DWT030
114                                  NaN

第1部分:处理Nan

有多种方法可以处理Nan

1)'Nan'作为目标没有意义。如果您不知道目标是什么,您将如何训练模型,以及如何将其与输出进行比较。 所以这里的解决方案是删除其中包含Nan个的完整样本(行)。因此,最终目标将如下所示:

107              RA37|RA41|RM153 |RWT037
108    DA35|DA47|DWT030|DA35|DA47|DWT030
110                         PI001 |PI040 
111                         PI001 |PI040 
112                     RA37|RA41|RWT037
113    DA35|DA47|DWT030|DA35|DA47|DWT030

2)用新标签替换Nan,例如Unknown或Unclassified。

107              RA37|RA41|RM153 |RWT037
108    DA35|DA47|DWT030|DA35|DA47|DWT030
109                              UNKNOWN
110                         PI001 |PI040 
111                         PI001 |PI040 
112                     RA37|RA41|RWT037
113    DA35|DA47|DWT030|DA35|DA47|DWT030
114                              UNKNOWN

第2部分:使用MultiLabelBinarizer:

在上述两种解决方案中,您都会得到如下目标列表:

y = ['RA37|RA41|RM153|RWT037', 'DA35|DA47|DWT030|DA35|DA47|DWT030', 'UNKNOWN', 'PI001|PI040', 'PI001|PI040', 'RA37|RA41|RWT037', 'DA35|DA47|DWT030|DA35|DA47|DWT030', 'UNKNOWN']

但是MultilabelBinarizer接受列表列表,所以我们需要像你一样拆分上面的字符串:

y = [y_val.split('|') for y_val in y]

现在y格式正确。现在使用MLB:

from sklearn.preprocessing import MultiLabelBinarizer
mlb = MultiLabelBinarizer()
y_encoded = mlb.fit_transform(y)

# Output:
array([[0, 0, 0, 0, 0, 1, 1, 1, 1, 0],
       [1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1],
       [0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 1, 1, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 1, 1, 0, 1, 0],
       [1, 1, 1, 0, 0, 0, 0, 0, 0, 0],
       [0, 0, 0, 0, 0, 0, 0, 0, 0, 1]])

您可以在y的所选模型中使用它(应该支持上面的指标矩阵格式)。