ValueError содержит новые метки при попытке маркировать кодирование в python - PullRequest
0 голосов
/ 29 декабря 2018

У меня есть набор данных, который требует кодирования метки.Я использую кодировщик этикеток sklearn для того же.

Вот воспроизводимый код проблемы:

import pandas as pd
from sklearn.preprocessing import LabelEncoder

data11 = pd.DataFrame({'Transaction_Type': ['Mortgage', 'Credit reporting', 'Consumer Loan', 'Mortgage'], 
                       'Complaint_reason': ['Incorrect Info', 'False Statement', 'Using a Debit Card', 'Payoff process'],
                       'Company_response': ['Response1', 'Response2', 'Response3', 'Response1'],
                       'Consumer_disputes': ['Yes', 'No', 'No', 'Yes'],
                       'Complaint_Status': ['Processing','Closed', 'Awaiting Response', 'Closed']
                       })

le = LabelEncoder()
data11['Transaction_Type'] = le.fit_transform(data11['Transaction_Type'])
data11['Complaint_reason'] = le.transform(data11['Complaint_reason'])
data11['Company_response'] = le.fit_transform(data11['Company_response'])
data11['Consumer_disputes'] = le.transform(data11['Consumer_disputes'])
data11['Complaint_Status'] = le.transform(data11['Complaint_Status'])

Желаемый результат должен быть примерно таким:

({'Transaction_Type': ['1', '2', '3', '1'], 
                       'Complaint_reason': ['1', '2', '3', '4'],
                       'Company_response': ['1', '2', '3', '1'],
                       'Consumer_disputes': ['1', '2', '2', '1'],
                       'Complaint_Status': ['1','2', '3', '2']
                       })

Проблема в том, что когда я пытаюсь кодировать столбцы: «Transaction_Type» и «Company_response» кодируются успешно, а столбцы «Complaint_reason», «Consumer_disputes» и «Complaint_Status» выдают ошибки.

Для 'Complaint_reason':

File "C:/Users/Ashu/untitled0.py", line 26, in <module>
    data11['Complaint_reason'] = le.transform(data11['Complaint_reason'])

ValueError: y contains new labels: ['APR or interest rate' 'Account opening, closing, or management'
 'Account terms and changes' ...
 "Was approved for a loan, but didn't receive the money"
 'Written notification about debt' 'Wrong amount charged or received']

и аналогично для 'Consumer_disputes':

  File "<ipython-input-117-9625bd78b740>", line 1, in <module>
    data11['Consumer_disputes'] = le.transform(data11['Consumer_disputes'].astype(str))

ValueError: y contains new labels: ['No' 'Yes']

и аналогично для 'Complaint_Status':

  File "<ipython-input-119-5cd289c72e45>", line 1, in <module>
    data11['Complaint_Status'] = le.transform(data11['Complaint_Status'])

ValueError: y contains new labels: ['Closed' 'Closed with explanation' 'Closed with monetary relief'
 'Closed with non-monetary relief' 'Untimely response']

Это все категориальные переменные с фиксированными входами в форме предложений.Ниже приведено изображение среза данных:

Кодировка метки категориальных данных

Есть несколько вопросов по SO, но ни на один не удалось успешно ответить.

Ответы [ 2 ]

0 голосов
/ 29 декабря 2018

Вам не хватает fit_transform () , и поэтому вы получаете ошибку.

sklearn.preprocessing.LabelEncoder -> Кодировать метки со значением от 0 до n_classes-1 (из официальных документов)

Тем не менее, если вы хотите закодировать свои классы между 1 и n_classes, вам просто нужно добавить 1.

data11['Transaction_Type'] = le.fit_transform(data11['Transaction_Type'])
data11['Transaction_Type']

Вывод:

0    2
1    1
2    0
3    2
Name: Transaction_Type, dtype: int64 

Обратите внимание здесь, LabelEncoder () выполняет кодирование в алфавитном порядке, она даст метку от 0 до Потребительский кредит , который идет первым в алфавитном порядке.Точно так же он дает метку от 2 до Mortage , которая идет последней по порядку.

Теперь у вас есть два способа кодирования: либо принять вывод LabelEncoder по умолчанию, например,

data11['Transaction_Type'] = le.fit_transform(data11['Transaction_Type'])
data11['Complaint_reason'] = le.fit_transform(data11['Complaint_reason'])
data11['Company_response'] = le.fit_transform(data11['Company_response'])
data11['Consumer_disputes'] = le.fit_transform(data11['Consumer_disputes'])
data11['Complaint_Status'] = le.fit_transform(data11['Complaint_Status'])

Выход:

        Transaction_Type  Complaint_reason Company_response Consumer_disputes Complaint_Status
0                   2            1              0              1                2
1                   1            0              1              0                1
2                   0            3              2              0                0
3                   2            2              0              1                1

ИЛИ

data11['Transaction_Type'] = le.fit_transform(data11['Transaction_Type'].sort_values()) + 1
data11['Complaint_reason'] = le.fit_transform(data11['Complaint_reason'].sort_values()) + 1
data11['Company_response'] = le.fit_transform(data11['Company_response']) + 1
data11['Consumer_disputes'] = le.fit_transform(data11['Consumer_disputes'].sort_values()) + 1
data11['Complaint_Status'] = le.fit_transform(data11['Complaint_Status'].sort_values()) + 1 

Выход:

    Transaction_Type    Complaint_reason    Company_response    Consumer_disputes   Complaint_Status
0   1                      1                  1                      1              1
1   2                      2                  2                      1              2
2   3                      3                  3                      2              2
3   3                      4                  1                      2              3
0 голосов
/ 29 декабря 2018

Поскольку все столбцы разные, я думаю, вам нужно инициализировать le для каждого столбца:

for col in data11.columns:
    le = LabelEncoder()
    data11[col] = le.fit_transform(data11[col])

   Transaction_Type  Complaint_reason  Company_response  Consumer_disputes  \
0                 2                 1                 0                  1   
1                 1                 0                 1                  0   
2                 0                 3                 2                  0   
3                 2                 2                 0                  1   

   Complaint_Status  
0                 2  
1                 1  
2                 0  
3                 1  
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...