gpt4 book ai didi

python - sklearn.LabelEncoder 具有从未见过的值

转载 作者:IT老高 更新时间:2023-10-28 20:31:04 58 4
gpt4 key购买 nike

如果 sklearn.LabelEncoder已在训练集上拟合,如果在测试集上使用时遇到新值,它可能会中断。

对此我能想出的唯一解决方案是将测试集中的所有新内容(即不属于任何现有类)映射到 "<unknown>" ,然后将相应的类显式添加到 LabelEncoder之后:

# train and test are pandas.DataFrame's and c is whatever column
le = LabelEncoder()
le.fit(train[c])
test[c] = test[c].map(lambda s: '<unknown>' if s not in le.classes_ else s)
le.classes_ = np.append(le.classes_, '<unknown>')
train[c] = le.transform(train[c])
test[c] = le.transform(test[c])

这可行,但有更好的解决方案吗?

更新

正如@sapo_cosmico 在评论中指出的那样,鉴于我认为LabelEncoder.transform 中的实现更改,上述内容似乎不再适用。 , 现在似乎使用 np.searchsorted (不知道以前是不是这样)。所以不要附加 <unknown>类到LabelEncoder的已提取类列表,需要按排序顺序插入:

import bisect
le_classes = le.classes_.tolist()
bisect.insort_left(le_classes, '<unknown>')
le.classes_ = le_classes

但是,总的来说,这感觉很笨拙,我确信有更好的方法。

最佳答案

LabelEncoder 基本上是一个字典。您可以提取它并将其用于将来的编码:

from sklearn.preprocessing import LabelEncoder

le = preprocessing.LabelEncoder()
le.fit(X)

le_dict = dict(zip(le.classes_, le.transform(le.classes_)))

检索单个新项目的标签,如果缺少项目,则将值设置为未知

le_dict.get(new_item, '<Unknown>')

检索数据框列的标签:

df[your_col] = df[your_col].apply(lambda x: le_dict.get(x, <unknown_value>))

关于python - sklearn.LabelEncoder 具有从未见过的值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21057621/

58 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com