运行LabelEncoder命令后触发ValueError错误的技术求助
开发机器学习Web应用时,从CSV文件读取训练数据执行转换操作,触发ValueError错误。
代码片段
X[:, 0] = le_country.transform(X[:,0]) X[:, 1] = le_education.transform(X[:,1]) X = X.astype(float) X
报错信息(中文翻译)
在处理上述异常期间,又发生了另一个异常:
ValueError Traceback (most recent call last)
Cell In [54], line 1
----> 1 X[:, 0] = le_country.transform(X[:,0])
2 X[:, 1] = le_education.transform(X[:,1])
3 X = X.astype(float)文件 ~\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\preprocessing_label.py:138,在LabelEncoder.transform(self, y)中
135 if _num_samples(y) == 0:
136 return np.array([])
--> 138 return encode(y, uniques=self.classes)文件 ~\AppData\Local\Programs\Python\Python310\lib\site-packages\sklearn\utils_encode.py:226,在_encode(values, uniques, check_unknown)中
224 return _map_to_integer(values, uniques)
225 except KeyError as e:
--> 226 raise ValueError(f"y包含之前未见过的标签: {str(e)}")
227 else:
228 if check_unknown:ValueError: y包含之前未见过的标签: 'United States'
核心问题是:用于转换国家列的LabelEncoder(le_country)在训练阶段(调用fit())时,从未见过'United States'这个标签。LabelEncoder的transform()方法只能处理训练时已存在的类别,遇到新类别就会抛出该错误。
常见触发场景:
- 训练集和当前处理数据的国家类别不匹配,训练集遗漏了
'United States' - 数据预处理时,训练集的类别被过滤或修改,导致
le_country的classes_属性中没有该标签 - 数据存在格式差异,比如大小写、空格(如
'united states'和'United States'被视为不同类别)
1. 补全训练集类别并重新训练编码器
检查训练CSV文件,确认是否包含'United States'。如果训练集确实遗漏,补充对应数据后重新训练编码器:
# 用包含所有类别的训练数据重新拟合编码器 le_country.fit(training_data[:, 0]) # 再执行转换操作 X[:, 0] = le_country.transform(X[:,0])
2. 主动处理未知类别
如果无法确保训练集覆盖所有可能类别,可通过以下方式处理未知值:
方式一:替换未知类别为已知值
先将未知类别替换为训练集中存在的默认值(比如最常见类别),再执行转换:
import numpy as np # 获取编码器已识别的类别集合 known_countries = set(le_country.classes_) # 将未知类别替换为训练集中的常见类别(示例用'Unknown',需确保该值在训练集中存在) X[:, 0] = np.where(np.isin(X[:,0], known_countries), X[:,0], 'Unknown') # 执行转换 X[:, 0] = le_country.transform(X[:,0])
方式二:使用OrdinalEncoder处理未知类别
OrdinalEncoder比LabelEncoder更适合特征处理,支持配置未知类别处理逻辑:
from sklearn.preprocessing import OrdinalEncoder # 初始化编码器,设置未知类别编码为-1 oe_country = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-1) # 用训练数据拟合编码器 oe_country.fit(training_data[:, [0]]) # 转换当前数据(注意flatten适配维度) X[:, 0] = oe_country.transform(X[:, [0]]).flatten()
3. 统一数据格式
检查并统一当前数据与训练数据的类别格式,消除大小写、空格差异:
import numpy as np # 统一转为小写并去除首尾空格 X[:, 0] = np.char.strip(np.char.lower(X[:, 0])) # 训练编码器时也执行相同的格式处理 le_country.fit(np.char.strip(np.char.lower(training_data[:, 0]))) # 执行转换 X[:, 0] = le_country.transform(X[:,0])
内容的提问来源于stack exchange,提问作者birbhambra

