1 분 소요


원-핫 인코딩

정형데이터 분석, 전처리시 유의

In [1]:
from konlpy.tag import Okt
In [2]:
okt = Okt()
tokens = okt.morphs("나는 자연어 처리를 배우는 거겠지")
tokens
Out [2]:
['나', '는', '자연어', '처리', '를', '배우는', '거', '겠지']

one hot encoding vs label encoding

In [3]:
items = ['남자', '여자', '여자', '남자', '여자']
In [4]:
from sklearn.preprocessing import LabelEncoder
In [5]:
le = LabelEncoder()
le.fit_transform(items)
Out [5]:
array([0, 1, 1, 0, 1], dtype=int64)

레이블 인코딩은 숫자의 크기가 결과에 영항을 미친다라고 학습할 가능성이 있다. -> 잘 사용하지 않음

원-핫 인코딩

원-핫 인코딩의 한계

  1. 수학적으로 처리해야할 차원이 늘어나 연산에 부담이 됨
  2. 각 원소들의 유사도를 표현하지 못함
  • pandas: get_dummies
  • sklearn: OnHotEncoder
  • tf.keras: to_categorical

keras의 to_categorical

In [6]:
text = "나는 자연어 처리를 배우는 거겠지 자연어 처리는 어렵지 않기를 바래"
In [7]:
from keras.preprocessing.text import Tokenizer
from keras.utils import to_categorical
In [8]:
tok = Tokenizer()
tok.fit_on_texts([text])
print(tok.word_index)
Out [8]:
{'자연어': 1, '나는': 2, '처리를': 3, '배우는': 4, '거겠지': 5, '처리는': 6, '어렵지': 7, '않기를': 8, '바래': 9}

In [9]:
sub_text = "나는 어렵지 않기를 바래"
enc1 = tok.texts_to_sequences([sub_text])[0]
enc1
Out [9]:
[2, 7, 8, 9]
In [10]:
ohe1 = to_categorical(enc1)
ohe1
Out [10]:
array([[0., 0., 1., 0., 0., 0., 0., 0., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 1., 0., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 1., 0.],
       [0., 0., 0., 0., 0., 0., 0., 0., 0., 1.]], dtype=float32)

pandas의 get_dummies

In [11]:
import pandas as pd
In [12]:
X = ['b', 'r', 'r', 'g', 'g']
y = [0, 1, 1, 0, 0]

df1 = pd.DataFrame({'X': X, 'y':y})
df1
Out [12]:
X y
0 b 0
1 r 1
2 r 1
3 g 0
4 g 0
In [13]:
pd.get_dummies(df1['X'])
Out [13]:
b g r
0 1 0 0
1 0 0 1
2 0 0 1
3 0 1 0
4 0 1 0

sklearn의 OneHotEncoder

In [14]:
from sklearn.preprocessing import OneHotEncoder
In [15]:
ohe = OneHotEncoder(sparse=False)
ohe.fit_transform(df1)
Out [15]:
C:\Users\user\anaconda3\envs\sesac\lib\site-packages\sklearn\preprocessing\_encoders.py:808: FutureWarning: `sparse` was renamed to `sparse_output` in version 1.2 and will be removed in 1.4. `sparse_output` is ignored unless you leave `sparse` to its default value.
  warnings.warn(

array([[1., 0., 0., 1., 0.],
       [0., 0., 1., 0., 1.],
       [0., 0., 1., 0., 1.],
       [0., 1., 0., 1., 0.],
       [0., 1., 0., 1., 0.]])
In [16]:
ohe.categories_
Out [16]:
[array(['b', 'g', 'r'], dtype=object), array([0, 1], dtype=int64)]

태그: ,

카테고리:

업데이트:

댓글남기기