我正在使用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来处理所有这些不同的数据类型。如何解决这个问题,提前谢谢!
答案 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
的所选模型中使用它(应该支持上面的指标矩阵格式)。