sklearn の OrdinalEncoder の挙動
sklearn の OrdinalEncoder の挙動

sklearn の OrdinalEncoder の挙動

OrdinalEncoder の挙動についてのメモ

カテゴリカル feature を int にします

>>> df = pd.DataFrame([1,2,3,2,1])
>>> oe = OrdinalEncoder(categories='auto', dtype=np.int64)
>>> oe.fit(df)
>>> oe.transform(df)
array([[0],
       [1],
       [2],
       [1],
       [0]])

>>> oe.categories_
[array([1, 2, 3])]

カテゴリーの型は全て同じである必要がある

>>> df = pd.DataFrame([1,2,3,2,1])
>>> categories = [[1,2,3, 'na']]
>>> oe = OrdinalEncoder(categories=categories, dtype=np.int64)
>>> oe.fit(df)
---------------------------------------------------------------------------
ValueError                                Traceback (most recent call last)
<ipython-input-92-fbe59670fc3d> in <module>()
      2 categories = [[1,2,3, 'na']]
      3 oe = OrdinalEncoder(categories=categories, dtype=np.int64)
----> 4 oe.fit(df)
      5 oe.transform(df)

1 frames
/usr/local/lib/python3.7/dist-packages/sklearn/preprocessing/_encoders.py in _fit(self, X, handle_unknown)
     86                 cats = _encode(Xi)
     87             else:
---> 88                 cats = np.array(self.categories[i], dtype=Xi.dtype)
     89                 if Xi.dtype != object:
     90                     if not np.all(np.sort(cats) == cats):

ValueError: invalid literal for int() with base 10: 'na'

必要があれば value を str に変換するなど必要

df = pd.DataFrame([1,2,3,2,1]).astype('str') # astype(str) すれば問題ない
categories = [['1', '2', '3', 'na']]
oe = OrdinalEncoder(categories=categories, dtype=np.int64)
oe.fit(df)
oe.transform(df)