sklearn.LabelEncoder 具有以前从未见过的值

2023-11-29

If a 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])

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

Update

正如 @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>')

检索 Dataframe 列的标签:

df[your_col] = df[your_col].apply(lambda x: le_dict.get(x, <unknown_value>))
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

sklearn.LabelEncoder 具有以前从未见过的值 的相关文章

随机推荐