Создание входных данных для классификации Multilabel - PullRequest
3 голосов
/ 08 июля 2019

Я работаю над проблемой многоуровневой классификации. Каждое значение в X является категориальным значением. Исходные данные ниже

ID  X1  X2  X3  Y
111 AA  LL  KK  MMM
111 AA  LL  KK  MMM
111 BB  LL  jj  NNN
121 HH  DD  uu  III
121 HH  DD  yy  OOO
121 HH  LL  aa  PPP

Я пытаюсь преобразовать это в фрейм данных, где каждое уникальное значение, присутствующее в столбцах (X1, X2, X3, Y), станет новым столбцом, и каждый идентификатор будет иметь одну запись. Ожидаемый результат, который я пытаюсь получить -

ID  X1_AA   X1_BB   X1_HH   X2_LL   X2_DD   X3_KK   X3_jj   X3_uu   X3_yy   x3_aa   Y_MMM   Y_NNN   Y_III   Y_OOO   Y_PPP
111 1   1   0   1   0   1   1   0   0   0   1   1   0   0   0
121 0   0   1   1   1   0   0   1   1   1   0   0   1   1   1

Я пытался использовать pandas get_dummies, он создает фиктивный столбец, но идентификаторы дублируются. Здесь Y - мой целевой столбец. Несколько значений Y для идентификатора означают, что идентификатор имеет доступ к нескольким каналам.

Также, пожалуйста, предложите, если я могу напрямую использовать исходные данные, создав фиктивные столбцы для X и Y в классификации

Ответы [ 2 ]

1 голос
/ 08 июля 2019

Для манекенов на выходе необходим агрегат max:

df1 = pd.get_dummies(df).groupby('ID', as_index=False).max()
print (df1)
    ID  X1_AA  X1_BB  X1_HH  X2_DD  X2_LL  X3_KK  X3_aa  X3_jj  X3_uu  X3_yy  \
0  111      1      1      0      0      1      1      0      1      0      0   
1  121      0      0      1      1      1      0      1      0      1      1   

   Y_III  Y_MMM  Y_NNN  Y_OOO  Y_PPP  
0      0      1      1      0      0  
1      1      0      0      1      1  
1 голос
/ 08 июля 2019
new_df = pd.get_dummies(df).groupby('ID').sum()
new_df[new_df > 1] = 1

ID  X1_AA   X1_BB   X1_HH   X2_DD   X2_LL   X3_KK   X3_aa   X3_jj   X3_uu   X3_yy   Y_III   Y_MMM   Y_NNN   Y_OOO   Y_PPP
111 1   1   0   0   1   1   0   1   0   0   0   1   1   0   0
121 0   0   1   1   1   0   1   0   1   1   1   0   0   1   1

Редактировать: я не знал о методе .max() в групповом. Ответ @ Jezrael определенно лучше.

...