python - MultiLabelBinarizer 以字母而不是类别输出类

标签 python multilabel-classification

我有一个数据框,其中一列是 short_namesshort_names 由 2-5 个字母组成 => BG,OP,LE,WELLC。每行可以有任意数量的名称。

我正在尝试使用 MultiLabelBinarizer 将名称转换为单独的列,这样如果行具有相似的名称,那么列中将有 1

one_hot = MultiLabelBinarizer()
one_hot.fit_transform(df['short_name']) 
one_hot.classes__ 

因为其中一行中有一个 '-' 导致错误 TypeError: 'float' object is not iterable,我使用了

df['short_names']= df['short_names'].astype(str)

现在的问题是类输出是字母而不是短名称,即 ABC 而不是 BG OP

最佳答案

我认为需要dropna删除missing valuessplit如有必要:

df = pd.Series({0: np.nan, 1: 'CE', 2: 'NPP', 4: 'SE, CB, CBN, OOM, BCI', 5: 'RCS'})
       .to_frame('short_name')
print (df)
              short_name
0                    NaN
1                     CE
2                    NPP
4  SE, CB, CBN, OOM, BCI
5                    RCS

from sklearn.preprocessing import MultiLabelBinarizer
one_hot = MultiLabelBinarizer()
a = one_hot.fit_transform(df['short_name'].dropna().str.split(', ')) 
print (a)
[[0 0 0 1 0 0 0 0]
 [0 0 0 0 1 0 0 0]
 [1 1 1 0 0 1 0 1]
 [0 0 0 0 0 0 1 0]]

print(one_hot.classes_ )
['BCI' 'CB' 'CBN' 'CE' 'NPP' 'OOM' 'RCS' 'SE']

如果要输出DataFrame:

df = pd.DataFrame(a, columns=one_hot.classes_ )
print (df)
   BCI  CB  CBN  CE  NPP  OOM  RCS  SE
0    0   0    0   1    0    0    0   0
1    0   0    0   0    1    0    0   0
2    1   1    1   0    0    1    0   1
3    0   0    0   0    0    0    1   0

另一种解决方案是用 fillna 替换 缺失值 :

from sklearn.preprocessing import MultiLabelBinarizer
one_hot = MultiLabelBinarizer()
a = one_hot.fit_transform(df['short_name'].fillna('missing').str.split(', ')) 
print (a)
[[0 0 0 0 0 0 0 0 1]
 [0 0 0 1 0 0 0 0 0]
 [0 0 0 0 1 0 0 0 0]
 [1 1 1 0 0 1 0 1 0]
 [0 0 0 0 0 0 1 0 0]]

print(one_hot.classes_ )
['BCI' 'CB' 'CBN' 'CE' 'NPP' 'OOM' 'RCS' 'SE' 'missing']

df = pd.DataFrame(a, columns=one_hot.classes_ )
print (df)
   BCI  CB  CBN  CE  NPP  OOM  RCS  SE  missing
0    0   0    0   0    0    0    0   0        1
1    0   0    0   1    0    0    0   0        0
2    0   0    0   0    1    0    0   0        0
3    1   1    1   0    0    1    0   1        0
4    0   0    0   0    0    0    1   0        0

关于python - MultiLabelBinarizer 以字母而不是类别输出类,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51335535/

相关文章:

python - 如何在另一个搜索词中搜索和替换一个词

python - Keras 自定义损失函数在语义分割期间忽略特定类的漏报?

Python-请求在使用 session 下载时不清除内存

python - 将输入发送到劣质 python 进程时 Mac 变慢

numpy - y_test、sklearn 多标签分类上的 MultiLabelBinarizer 形状不一致错误

python - 在字典上使用标签编码器

python - 如何使用 PySide2 在 qml 中设置值?

python-2.7 - OnVsRestClassifier 给出 0 准确率

python - ValueError : logits and labels must have the same shape ((None, 14)与(无,1))

confusion-matrix - 为多类多标签分类构建混淆矩阵