
本文旨在解决在使用 LabelEncoder 对数据进行编码时,遇到的“y contains previously unseen labels”错误。该错误通常出现在训练集和测试集(或验证集)中包含不同的类别标签时。本文将详细解释错误原因,并提供正确的编码方法,确保模型能够正确处理所有类别。
在使用 LabelEncoder 对类别数据进行编码时,经常会遇到一个常见的错误:“ValueError: y contains previously unseen labels”。 这个错误通常发生在以下场景:你使用训练集拟合(fit)了 LabelEncoder,然后尝试使用该 LabelEncoder 转换(transform)包含训练集中未出现的类别标签的数据集(例如,测试集或验证集)。
错误原因分析
LabelEncoder 的工作原理是为每个唯一的类别标签分配一个唯一的整数。 当你使用 fit 方法时,LabelEncoder 会学习训练集中所有唯一的类别标签,并建立一个从标签到整数的映射。 当你使用 transform 方法时,LabelEncoder 会查找每个标签的对应整数。 如果 transform 方法遇到了一个在 fit 阶段未见过的标签,它就无法找到对应的整数,从而抛出 "unseen labels" 错误。
错误代码示例
以下代码演示了导致此错误的常见做法:
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# 假设 tr_df 是训练集 DataFrame,cv_df 是验证集 DataFrame
encodable_columns = ['Education', 'EmploymentType', 'MaritalStatus',
'HasMortgage', 'HasDependents', 'LoanPurpose', 'HasCoSigner']
le = LabelEncoder()
# 错误的做法:对 DataFrame 的每一列应用 fit_transform
encoded_df = cv_df[encodable_columns].apply(le.fit_transform)
cv_df.drop(columns=encodable_columns, axis=1, inplace=True)
cv_df = pd.concat([tr_df, encoded_df], axis=1) # 这行代码可能有误,请检查是否需要连接 tr_df 和 cv_df
encoded_df = tr_df[encodable_columns].apply(le.transform)
tr_df.drop(columns=encodable_columns, axis=1, inplace=True)
tr_df = pd.concat([tr_df, encoded_df], axis=1) # 这行代码可能有误,请检查是否需要连接 tr_df 和 cv_df上述代码的错误在于,你尝试使用 apply 方法将 le.fit_transform 应用于 DataFrame 的每一列。 这样做会导致 LabelEncoder 在每一列上单独进行 fit,而不是使用所有数据集中所有类别标签的全局视图。
正确的解决方案
正确的做法是为每一列创建一个独立的 LabelEncoder 实例,并先使用训练集 fit 每个 LabelEncoder,然后再使用训练集 fit 好的 LabelEncoder 对训练集和验证集进行 transform。
import pandas as pd
from sklearn.preprocessing import LabelEncoder
# 假设 tr_df 是训练集 DataFrame,cv_df 是验证集 DataFrame
encodable_columns = ['Education', 'EmploymentType', 'MaritalStatus',
'HasMortgage', 'HasDependents', 'LoanPurpose', 'HasCoSigner']
# 创建一个字典来存储每个列的 LabelEncoder
label_encoders = {}
# 循环处理每一列
for col in encodable_columns:
# 为当前列创建一个 LabelEncoder 实例
label_encoders[col] = LabelEncoder()
# 使用训练集拟合 LabelEncoder
tr_df[col] = label_encoders[col].fit_transform(tr_df[col])
# 使用训练集拟合好的 LabelEncoder 转换验证集
cv_df[col] = label_encoders[col].transform(cv_df[col])
# 如果需要,可以删除原始的类别列
# tr_df.drop(columns=encodable_columns, axis=1, inplace=True)
# cv_df.drop(columns=encodable_columns, axis=1, inplace=True)
# 打印转换后的 DataFrame (可选)
print("Training Data:")
print(tr_df.head())
print("\nValidation Data:")
print(cv_df.head())代码解释
注意事项
总结
LabelEncoder 是一个方便的类别数据编码工具,但必须正确使用才能避免 "unseen labels" 错误。 正确的做法是为每一列创建一个独立的 LabelEncoder 实例,并先使用训练集 fit 每个 LabelEncoder,然后再使用训练集 fit 好的 LabelEncoder 对训练集和验证集进行 transform。 同时,需要注意数据一致性,并考虑如何处理未知标签。
以上就是解决LabelEncoder无法识别先前“见过”的标签问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号