告诉LabelEnocder忽略新标签?

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了告诉LabelEnocder忽略新标签?相关的知识,希望对你有一定的参考价值。

我正在处理文本数据,其中必须考虑很多用户错误,例如。有很多情况下,在预测新数据时,由于拼写错误,编码器之前没有看到新标签。我只是想忽略这些(所以当我运行labelencoder.transform(df_newdata['GL_Description'])时,我只是想让它忽略任何它以前没有见过)。我怎样才能做到这一点?我没有在文档中找到这方面的参数,但是真正唯一的方法是“手动”逐个检查每个单词并删除它们?有没有办法告诉编码器忽略任何不在其字典中的新标签?

答案

为此,您可以使用自定义编码器覆盖原始LabelEncoder。像这样的东西:

import numpy as np
class TolerantLabelEncoder(LabelEncoder):
    def __init__(self, ignore_unknown=False,
                       unknown_original_value='unknown', 
                       unknown_encoded_value=-1):
        self.ignore_unknown = ignore_unknown
        self.unknown_original_value = unknown_original_value
        self.unknown_encoded_value = unknown_encoded_value

    def transform(self, y):
        check_is_fitted(self, 'classes_')
        y = column_or_1d(y, warn=True)

        indices = np.isin(y, self.classes_)
        if not self.ignore_unknown and not np.all(indices):
            raise ValueError("y contains new labels: %s" 
                                         % str(np.setdiff1d(y, self.classes_)))

        y_transformed = np.searchsorted(self.classes_, y)
        y_transformed[~indices]=self.unknown_encoded_value
        return y_transformed

    def inverse_transform(self, y):
        check_is_fitted(self, 'classes_')

        labels = np.arange(len(self.classes_))
        indices = np.isin(y, labels)
        if not self.ignore_unknown and not np.all(indices):
            raise ValueError("y contains new labels: %s" 
                                         % str(np.setdiff1d(y, self.classes_)))

        y_transformed = np.asarray(self.classes_[y], dtype=object)
        y_transformed[~indices]=self.unknown_original_value
        return y_transformed

用法示例:

en = TolerantLabelEncoder(ignore_unknown=True)
en.fit(['a','b'])

print(en.transform(['a', 'c', 'b']))
# Output: [ 0 -1  1]

print(en.inverse_transform([-1, 0, 1]))
# Output: ['unknown' 'a' 'b']

以上是关于告诉LabelEnocder忽略新标签?的主要内容,如果未能解决你的问题,请参考以下文章

谷歌地图在Android的标签片段上显示为灰色

忽略导航()调用

如何告诉Liquibase忽略db.changelog * .xml?

在片段中接收 NFC 的应用程序创建托管活动的新实例

是否可以告诉 libfuzzer 忽略某些代码?

如何告诉 git 忽略个别行,即特定代码行的 gitignore [重复]