处理标签编码的未知值

Geo*_*ler 13 python pandas scikit-learn dummy-variable one-hot-encoding

如何在sk-learn中处理标签编码的未知值?只有在检测到新标签时,标签编码器才会爆炸.

我想要的是通过one-hot -encoder 对分类变量进行编码.但是,sk-learn不支持字符串.所以我在每列上都使用了标签编码器.

我的问题是,在我的交叉验证步骤中,管道中出现了未知标签.基本的单热编码器可以选择忽略这种情况.apriori pandas.getDummies /cat.codes是不够的,因为管道应该使用可能包含未知标签的真实,新鲜的传入数据.

是否有可能CountVectorizer为此目的使用?

mar*_*bel 10

有几个答案sklearn.preprocessing.OneHotEncoder作为一种方法提到,但我觉得这种pandas.get_dummies方法对于实现模型更为清晰.其他类似的答案提到使用labelEncoder此,但再次将整个转换DictVectorizer为dict可能不是一个好主意.

让我们假设以下有问题的列:

from sklearn.preprocessing import OneHotEncoder

enc = OneHotEncoder(handle_unknown='ignore')
enc.fit(train)

enc.transform(train).toarray()
Run Code Online (Sandbox Code Playgroud)

Utila是一个罕见的城市,它不存在于训练数据中,但在测试集中,我们可以在推理时考虑新数据.

诀窍是将此值转换为"other"并将其包含在labelEncoder对象中.然后我们可以在生产中重复使用它.

from sklearn import preprocessing
import numpy as np
import pandas as pd

train = {'city': ['Buenos Aires', 'New York', 'Istambul', 'Buenos Aires', 'Paris', 'Paris'],
        'letters': ['a', 'b', 'c', 'd', 'a', 'b']}
train = pd.DataFrame(train)

test = {'city': ['Buenos Aires', 'New York', 'Istambul', 'Buenos Aires', 'Paris', 'Utila'],
        'letters': ['a', 'b', 'c', 'a', 'b', 'b']}
test = pd.DataFrame(test)
Run Code Online (Sandbox Code Playgroud)

要将它应用于新数据,我们需要的是DataFrame为每个列保存一个可以使用Pickle轻松完成的对象.

这个答案是基于这个问题,我觉得这个问题对我来说并不完全清楚,因此添加了这个例子.

  • 如果在 `le.classes_` 中有一个比 `other` 更大的值,`bisect.insort_left(le_classes, 'other')` 会在该元素之前插入 `other` 吗?如果是这种情况,`other` 之后的元素的代码将会改变,从而危及代码映射的完整性。 (3认同)
  • 在修改labelEncoder之前,请注意不要执行“ le.fit_transform(train [c])”。否则,在训练和测试中,labelEncoder的映射将不同。而是执行“ le.fit(train [c])”,然后在修改labelEncoder之后执行“ le.transform(train [c])”。 (2认同)
  • 将旧答案中的 `le.classes_ = le_classes` 更改为 `le.classes_ = np.array(le_classes)` 以保留 `preprocessing.LabelEncoder().inverse_transform()` 的有用性 (2认同)