【问题标题】:ValueError: y contains previously unseen labels: 'A' using OrdinalEncoderValueError:y 包含以前看不见的标签:使用 OrdinalEncoder 的“A”
【发布时间】:2021-07-07 20:36:51
【问题描述】:
label_encode_dict['cat116']
# output
OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-99)

label_encode_dict['cat116'].transform(np.array([xq['cat116']]).reshape(-1,1))

堆栈跟踪

---------------------------------------------------------------------------
KeyError                                  Traceback (most recent call last)
/usr/local/lib/python3.7/dist-packages/sklearn/utils/_encode.py in _encode(values, uniques, check_unknown)
    177         try:
--> 178             return _map_to_integer(values, uniques)
    179         except KeyError as e:

6 frames
/usr/local/lib/python3.7/dist-packages/sklearn/utils/_encode.py in _map_to_integer(values, uniques)
    122     table = _nandict({val: i for i, val in enumerate(uniques)})
--> 123     return np.array([table[v] for v in values])
    124 

/usr/local/lib/python3.7/dist-packages/sklearn/utils/_encode.py in <listcomp>(.0)
    122     table = _nandict({val: i for i, val in enumerate(uniques)})
--> 123     return np.array([table[v] for v in values])
    124 

/usr/local/lib/python3.7/dist-packages/sklearn/utils/_encode.py in __missing__(self, key)
    116             return self.nan_value
--> 117         raise KeyError(key)
    118 

KeyError: 'A'

During handling of the above exception, another exception occurred:

ValueError                                Traceback (most recent call last)
<ipython-input-120-25237eb44032> in <module>()
----> 1 label_encode_dict['cat116'].transform(np.array([xq['cat116']]).reshape(-1,1))

/usr/local/lib/python3.7/dist-packages/sklearn/preprocessing/_encoders.py in transform(self, X)
    785             Transformed input.
    786         """
--> 787         X_int, X_mask = self._transform(X, handle_unknown=self.handle_unknown)
    788         X_trans = X_int.astype(self.dtype, copy=False)
    789 

/usr/local/lib/python3.7/dist-packages/sklearn/preprocessing/_encoders.py in _transform(self, X, handle_unknown, force_all_finite)
    152             # already called above.
    153             X_int[:, i] = _encode(Xi, uniques=self.categories_[i],
--> 154                                   check_unknown=False)
    155 
    156         return X_int, X_mask

/usr/local/lib/python3.7/dist-packages/sklearn/utils/_encode.py in _encode(values, uniques, check_unknown)
    178             return _map_to_integer(values, uniques)
    179         except KeyError as e:
--> 180             raise ValueError(f"y contains previously unseen labels: {str(e)}")
    181     else:
    182         if check_unknown:

ValueError: y contains previously unseen labels: 'A'

为什么这个看不见的标签错误是因为handle_unknown已经在Ordinal Encoder中指定了。

Sk 学习版本 = 0.24.1

**已编辑:简短示例 **

from sklearn.preprocessing import OrdinalEncoder
enc = OrdinalEncoder(handle_unknown = 'use_encoded_value', unknown_value = -9)
PP = [['AA','B']]
enc.fit(PP)

print(enc.categories_)

enc.transform(np.array(['A','B']).reshape(1,-1))  # gives the same  ValueError: y contains previously unseen labels: 'A'

enc.transform(np.array(['AC','B']).reshape(1,-1))  # this works as expected

我现在认为它处理的 unkown_values 高于字母顺序。在上面的示例中,“A”小于“AA”。它导致了错误。有什么好转的吗?

【问题讨论】:

  • 请将跟踪格式化为代码,而不是文本(已编辑)。
  • 在 sk-learn github repo 中打开了一个问题。 link 下个版本会修复。

标签: python scikit-learn


【解决方案1】:

你不适合序数编码器,它不知道如何转换数据。

enc = OrdinalEncoder(handle_unknown='use_encoded_value', unknown_value=-99)
enc.fit(label_encode_dict['cat116'])
enc.transform(np.array([xq['cat116']])

【讨论】:

  • 对不起。但它之前已安装在火车数据上。
  • 哦,好吧,我的错。编码器只能转换它已经看到的值。它创建了一种带有 2 个列表的地图。第一个列表是一个字符串,第二个列表是转换后的值。因此,如果您的训练数据中没有字符串“A”,那么它将无法转换它,因为它没有映射。
  • 是的,这就是我使用 handle_unkown 参数的原因。它有望处理训练中未见的值。
猜你喜欢
  • 2020-02-03
  • 2021-05-29
  • 2021-05-27
  • 2018-02-27
  • 2016-11-24
  • 1970-01-01
  • 2011-03-23
  • 1970-01-01
  • 2018-04-09
相关资源
最近更新 更多