【问题标题】:MultiLabelBinarizer output classes in letters instead of categoriesMultiLabelBinarizer 以字母而不是类别输出类
【发布时间】:2018-12-22 10:47:16
【问题描述】:

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

我正在尝试使用 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

【问题讨论】:

  • print (df['short_name'].head().to_dict()) 是什么?
  • {0: nan, 1: 'CE', 2: 'NPP', 4: 'SE, CB, CBN, OOM, BCI', 5: 'RCS'}
  • 预期输出是什么?删除值有问题的行?
  • array([[0, 0, 0, 0, 0,0,0,0], [0, 1, 0, 0, 0,0,0,0], [0, 0, 1, 1, 1,1,1,0], [0, 0, 0, 0, 0,0,01],如果其他行有公共标签,则应该指向同一列中的1 [ 1, 0, 0, 0, 1]])

标签: python multilabel-classification


【解决方案1】:

如果需要,我认为需要 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

另一种解决方案是将missing values 替换为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

【讨论】:

  • 有效!谢谢 。错误的原因是什么?
  • 为什么输出的是字母而不是短名称?
  • 如果我想将这些列组合在一起,我应该怎么做?假设我想将 CE 和 CBN 中的“1”组合成一个新列
  • @Lko - 如果认为a = one_hot.fit_transform(df['short_name'].astype(str))有问题需要列表,而不是字符串。如果是字符串,那么每个值都是单独处理的
  • @jezrael 所以我应该只适合one_hot (训练集和仅转换测试集) 还是适合(训练和测试集)两者.
猜你喜欢
  • 1970-01-01
  • 2022-01-02
  • 2017-10-03
  • 1970-01-01
  • 2019-05-19
  • 2018-01-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多