Функция обратного преобразования не возвращает правильное значение

Я следую руководству по мультимаркировке жанров фильмов из https://www.analyticsvidhya.com/blog/2019/04/predicting-movie-genres-nlp-multi-label-classification/

Я использую этот учебник для создания тега прогнозирования для регистрации жалоб. В моем случае я помечаю «Жанр» для реестра жалоб, например, 1 жалоба может иметь много ярлыков/тегов жанра). Например: Жалоба №1 имеет несколько жанров = Гарантия, Кондиционер.

Я дошел до стадии, когда я вызываю функцию multilablebinarizer(), чтобы пометить фильм «Жанр».

Моя проблема заключается в следующем:

Общее количество уникальных жанров = 55 (см. скриншот ниже) image.png

Я запустил функцию Multilabel_binarizer и преобразовал целевую переменную «Жанр» в y.

Вопросы:

  1. Я встречаю только y (166,49). Если я правильно понимаю, существует только 49 жанров, а не 55 уникальных жанров.

  2. Я получаю сообщение об ошибке: C:\Users\LAUJ3\Documents\Python Project\env\lib\site-packages\sklearn\multiclass.py:74: UserWarning: Label not 47 присутствует во всех обучающих примерах. warnings.warn("Ярлык %s присутствует во всех обучающих примерах." %

  3. Функция inverse_transfrom результата multilabel_binarizer не имеет смысла. Ожидается появление метки жанра вместо тарабарщины multilabel_binarizer.inverse_transform(y_pred)[3]

    y_pred[3] Out[57]: array([1, 1, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1, 0, 1, 0, 1, 0, 1, 0, 1, 0, 0, 0, 1, 1, 0, 0, 1, 0, 1, 0, 0, 0, 0, 0])

    multilabel_binarizer.inverse_transform(y_pred)[3] Out[58]: (' ', ',', 'a', 'c', 'e', ​​'g', 'i', 'n', 'o', «р», «т»)

Я не знаю, что пошло не так. Заранее благодарны за Вашу помощь.

Снимок экрана


person J.L    schedule 11.12.2019    source источник


Ответы (1)


from sklearn.preprocessing import MultiLabelBinarizer

mlb =  MultiLabelBinarizer()
mlb.fit_transform(df['genre'])

print(mlb.classes_)
#op
[' ' '"' '&' "'" ',' '-' '/' '0' '1' '2' '3' '4' '5' '6' '7' '8' '9' ':'
'A' 'B' 'C' 'D' 'E' 'F' 'G' 'H' 'I' 'J' 'K' 'L' 'M' 'N' 'O' 'P' 'Q' 'R'
'S' 'T' 'V' 'W' 'Z' '[' '\\' ']' '_' 'a' 'b' 'c' 'd' 'e' 'f' 'g' 'h' 'i'
'j' 'k' 'l' 'm' 'n' 'o' 'p' 'q' 'r' 's' 't' 'u' 'v' 'w' 'x' 'y' 'z' '{'
'}']

вы получаете символ как класс, потому что содержимое df['genre'] является строкой

#printing type of df['genre']
print(type(df['genre'][0]))
#op
<class 'str'>

преобразовать столбец жанра в dict и вытащить значение

df['genre'] = df['genre'].apply(lambda x :[value for value in eval(x).values()])
print(type(df['genre'][0]))
#op
<class 'list'>

теперь вы можете применить MultilabelBinarizer для столбца df['genre'], и теперь inverse_transform будет работать для вас

mlb.fit_transform(df['genre'])
print(mlb.classes_[0:10]) # taking only 10 element from array since there is 363 different classes

#op
array(['Absurdism', 'Acid western', 'Action', 'Action Comedy',
   'Action Thrillers', 'Action/Adventure', 'Addiction Drama', 'Adult',
   'Adventure', 'Adventure Comedy'], dtype=object)

обновленный код

#replace  df['genre'] = df['genre'].apply(lambda x :[value for value in eval(x).values()])
df['Genre'] = df['Genre'].apply(lambda x: x.split(',')) 
mlb.fit_transform(df1['Genre'])

print(mlb.classes_)
#op
array([' Curtain/Blinds', ' Delays', ' Electricial Compliance',
   ' Granny Flat', ' Heating/Cooling', ' Payment', ' Refund',
   ' Unlicensed', ' Warranty', 'Airconditioning', 'Heating/Cooling',
   'Warranty'], dtype=object

в более ранних данных это строка со словарным форматом, но в вашей строке данных разделена запятой, вам не нужно использовать функцию eval, простое разделение будет работать для вас

person qaiser    schedule 11.12.2019
comment
Спасибо за ваш ответ. Вы правы, что столбец находится в классе STR. Я попытался следовать вашему коду и попытаться преобразовать его в список, но получил сообщение об ошибке, указывающее, что значение в столбце не определено. Не уверен в этом. Tag['Genre'] = Tag['Genre'].apply(lambda x :[value for value in eval(x).values()]) File ‹string›, строка 1, в ‹module› NameError: name Кондиционер' не определен - person J.L; 12.12.2019
comment
Сообщите мне, можете ли вы открыть drive.google.com/open?id=10yLOVWZPgl1shVwwM5qDy7iyMCm7cS9A - person J.L; 12.12.2019
comment
я использовал movie.metadata.tsv ссылку, которая была дана в analyticsvidhya для данных, Learning Data 9-12-2019.xls, которые вы использовали, и movie.metadata.tsv такие же, или вы внесли некоторые изменения ???? - person qaiser; 12.12.2019
comment
Я использовал свой собственный файл, но отформатировал его в формате xls, чтобы пропустить процесс очистки. Файл также находится на этом диске Google (всего 4 столбца, включая «Жанр»). - person J.L; 12.12.2019
comment
Я использовал только один файл с 4 столбцами. - person J.L; 12.12.2019
comment
У меня такое ощущение, что я неправильно преобразовал этот столбец «Жанр» (множественное значение в формате списка) - person J.L; 12.12.2019
comment
Вначале я столкнулся с проблемой, следуя руководству, чтобы преобразовать столбец «Жанр» в список и добавить его обратно в DF (тег). Учебник относится к использованию JSON. См.: Genre_convert_to_list_JSON.txt drive.google.com/open?id=10yLOVWZPgl1shVwwM5qDy7iyMCm7cS9A Спасибо. вам снова за помощь. - person J.L; 12.12.2019
comment
@J.L, не нужно конвертировать в json, он будет работать .. я обновил код .. вместо eval используйте разделение запятой, это будет работать - person qaiser; 12.12.2019
comment
Большое спасибо! Просто поделиться здесь тоже. Я нашел способ преобразовать многозначный столбец в список. # Создайте пустой массив с именем Test #Tag -> Имя фрейма данных #Genre -> Имя столбца Test = [] Test = Tag['Genre'].str.split(), .tolist() Tag['genre_new'] = Test - person J.L; 12.12.2019
comment
Как вы думаете, вы можете помочь мне с моим новым постом? stackoverflow .com/questions/59349516/ @qaiser - person J.L; 17.12.2019