Machine Learning & Data Analytics

Data encoding (2. One-hot Encoding)

Genie Lee 2022. 2. 17. 01:00
728x90
반응형

원핫 인코딩은 n개의 범주형 데이터를 n개의 비트(0,1) 벡터로 표현합니다.예를 들어, 위에서 언급한 소형, 중형, 대형으로 이루어진 범주형 변수를 원핫 인코딩을 통해 변환하면 다음과 같이 표현할 수 있습니다.소형 : [1, 0, 0]중형 : [0, 1, 0]대형 : [0, 0, 1]원핫 인코딩으로 범주형 데이터를 나타내게되면, 서로 다른 범주에 대해서는 벡터 내적을 취했을 때 내적 값이 0이 나오게 됩니다.이는 서로 다른 범주 데이터는 독립적인 관계라는 것을 표현할 수 있게 됩니다.

 

One-hot Encoding은 Scikit-Learn의 preprocessing 패키지에 있습니다.

 

from sklearn.preprocessing import OneHotEncoder
ohe = OneHotEncoder(sparse=False)

방법1. pandas.get_dummies 사용

  • 장점 : 간편하다
  • 단점 : 인코딩의 기준을 저장한 객체가 남지 않는다. 새로운 데이터가 들어오면 기존의 데이터와 한꺼번에 실행해야한다. Encoder 객체를 저장할 경우 새로운 데이터만 돌려서 합치면 된다.

col = ["총세대수_lb"]
col_dummies = pd.get_dummies(train[col])


방법2. sklearn.preprocessing.OneHotEncoder 사용

  • 주의할 점 : 원핫 인코더로 변환하기 전에 라벨인코더를 통해 모든 문자열이 숫자형 값으로 변환되어야 한다.
  • 따라서, '총세대_lb' 컬럼이 object(문자형) 이므로, 사용 불가능

3. 문자열(object)을 정수형(int)으로 return

  1. 2020-04-09을 parsing!
  2. int()로 변환
def parse_year(s):
    return int(s[:4]) # 2020
def parse_month(s):
    return int(s[5:7]) # 04   # [5;7] 이면 실제적으로는 5-6
def parse_day(s):
    return int(s[8:]) # 09


# 추가적으로 분석의 편리를 위해 열 이름을 영어로 바꿔줍니다.
# 9개의 컬럼을 새로 추가로 생성합니다.
# Pandas DataFrame에서는 row별로 loop를 도는 것이 굉장히 느리기 때문에, apply() 함수를 이용하여 벡터 연산을 진행합니다.
df['start_year'] = df['생산기간'].apply(parse_year)
df['start_month'] = df['생산기간'].apply(parse_month)
df['start_day'] = df['생산기간'].apply(parse_day)

df['end_year'] = df['생산기간.1'].apply(parse_year)
df['end_month'] = df['생산기간.1'].apply(parse_month)
df['end_day'] = df['생산기간.1'].apply(parse_day)

df['recall_year'] = df['리콜개시일'].apply(parse_year)
df['recall_month'] = df['리콜개시일'].apply(parse_month)
df['recall_day'] = df['리콜개시일'].apply(parse_day)

df.head(3)

728x90
반응형