scikit-learn报”ValueError: y contains previously unseen labels: {unseen_labels} “的原因以及解决办法

  • Post category:Python

该错误指示数据集中的标签包含了未知的类别。这通常会发生在训练模型时,用于训练的数据集和测试时使用的数据集中包含的标签不一致的情况下。

解决办法主要有两种:

  1. 确保训练和测试数据集中的标签一致。在将数据集分割为训练集和测试集时,可以使用train_test_split()函数的stratify参数,确保分割后的数据集中的标签比例与原始数据集一致,如下:
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, stratify=y)

其中X为特征矩阵,y为标签向量,stratify=y表示按照y的比例来划分训练和测试数据集。

  1. 在训练模型之前,先对数据进行预处理,将所有未知的标签删除或替换。例如,将出现次数较少的标签视为未知标签,并将其替换为出现次数最多的标签:
from collections import Counter
count_y = Counter(y)
most_common_labels = count_y.most_common()  # 获取出现最多的元素
labels_to_keep = { label for label, count in most_common_labels if count >= 2 }  # 只保留出现次数大于1的元素
y[y.apply(lambda label:label not in labels_to_keep)] = "unknown"  # 未知标签使用"unknown"替代

这样就能避免在训练模型时出现未知标签的情况。