python教程—sklearn。标签编码器与从未见过的价值观-Python实用宝典

python教程—sklearn。标签编码器与从未见过的价值观

如果一个sklearn。LabelEncoder已安装在训练集上,如果在测试集上使用时遇到新值,它可能会崩溃。

如果一个sklearn。LabelEncoder已安装在训练集上,如果在测试集上使用时遇到新值,它可能会崩溃。

我能想到的唯一解决方案是将测试集中所有的新内容(即不属于任何现有类)映射到“< unknown >”,然后显式地向标签编码器添加相应的类:

# 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中的实现发生了变化。变换,现在似乎用np。搜索排序(我不知道以前是不是这样)。所以我们不添加< unknown >类到LabelEncoder的已提取类列表中,需要按顺序插入:

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

然而,由于这感觉相当笨拙,我肯定有一个更好的方法。

回答

​Python实用宝典 (pythondict.com)
不只是一个宝典
欢迎关注公众号:Python实用宝典

本文由 Python实用宝典 作者:Python实用宝典 发表,其版权均为 Python实用宝典 所有,文章内容系作者个人观点,不代表 Python实用宝典 对观点赞同或支持。如需转载,请注明文章来源。
1

发表评论