尝试在python中标记编码时,ValueError包含新标签
我有一个需要标签编码的数据集。我正在使用sklearn的标签编码器进行同样的操作 以下是问题的可再现代码:尝试在python中标记编码时,ValueError包含新标签,python,pandas,dataframe,encoding,Python,Pandas,Dataframe,Encoding,我有一个需要标签编码的数据集。我正在使用sklearn的标签编码器进行同样的操作 以下是问题的可再现代码: import pandas as pd from sklearn.preprocessing import LabelEncoder data11 = pd.DataFrame({'Transaction_Type': ['Mortgage', 'Credit reporting', 'Consumer Loan', 'Mortgage'],
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']
})
问题是当我尝试对列进行编码时:
“交易类型”和“公司响应”成功编码,但“投诉原因”、“消费者争议”和“投诉状态”列出现错误
就“投诉理由”而言:
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']
文件“C:/Users/Ashu/untitled0.py”,第26行,在
data11['Complaint_reason']=le.transform(data11['Complaint_reason'])
ValueError:y包含新标签:[“APR或利率”“开户、结账或管理”
“账户条款和变更”。。。
被批准贷款,但没有收到钱
“关于债务的书面通知”“收取或收到的金额错误”]
同样,对于“消费者纠纷”:
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']
文件“”,第1行,在
data11['Consumer_disferences']=le.transform(data11['Consumer_disferences'].astype(str))
ValueError:y包含新标签:[“否”“是”]
与“投诉状态”类似:
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']
文件“”,第1行,在
data11['Complaint_Status']=le.transform(data11['Complaint_Status'])
ValueError:y包含新标签:[“关闭”以解释结束“以货币减免结束”
“以非货币救济结束”“响应不及时”]
这些都是以句子形式固定输入的分类变量。以下是数据切片图像:
关于这方面有几个问题,但没有一个得到成功回答。由于所有列都不同,我认为您需要为每个列初始化
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
您缺少fit\u transform(),这就是为什么会出现错误 sklearn.preprocessing.LabelEncoder->对值介于0和n_classes-1之间的标签进行编码(来自官方文档) 不过,如果您想在1和n_类之间对类进行编码,只需添加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
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
注意这里,LabelEncoder()按字母顺序编码,它将给消费者贷款提供一个0的标签,该标签按字母顺序排在第一位。类似地,它给出了一个标签2 toMortage,该标签按顺序排在最后
现在,您有两种方法对其进行编码,或者像这样接受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
或
输出:
0 2
1 1
2 0
3 2
Name: Transaction_Type, dtype: int64
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
是的,这种方法会起作用,但我不需要每次初始化le,abdur的答案是正确的。我错过了未转换的one中的fit_转换。但你的解决方案也会奏效。谢谢:)是的,你说得对。。。我真傻。。在发布之前应仔细遵守代码。。谢谢