hyeori

범주형 데이터 다루기 본문

머신러닝

범주형 데이터 다루기

혜오리이 2024. 5. 8. 22:11

4.2.1 판다스를 사용한 범주형 데이터 인코딩

  • color : 순서 X
  • size : 순서 O
  • price : 수치형 특성

4.2.2 순서가 있는 특성 매핑

  • 학습 알고리즘이 순서 특성을 올바르게 인식하려면
  • → 범주형의 문자열 값 → 정수로 변환
size_mapping = {'XL': 3,
                'L': 2,
                'M': 1}

df['size'] = df['size'].map(size_mapping)
df
  • 정수 → 원래 문자열 표현 : inv_size_mapping = {v: k for k, v in size_mapping.items()}
inv_size_mapping = {v: k for k, v in size_mapping.items()}
df['size'].map(inv_size_mapping)

4.2.3 클래스 레이블 인코딩

  • 클래스 레이블은 순서가 없다.
  • 특정 레이블에 할당한 정수는 아무런 의미가 없다.
  1. enumerate 함수를 사용하여 클래스 레이블을 0부터 할당
  2. map 딕셔너리 사용하여 클래스 레이블을 정수로 변환
  • sklearn에 구현된 LabelEncoder 클래스 사용 ← 편리inverse_transform : 정수 클래스 레이블 → 원본 문자열
  • fit_transform : fit + transform

4.2.4 순서가 없는 특성에 원-핫 인코딩 적용

  • color 열에 적용
X = df[['color', 'size', 'price']].values
color_le = LabelEncoder()
X[:, 0] = color_le.fit_transform(X[:, 0]) #le.fit?
X
# blue = 0, green = 1, red = 2
  • ColumnTransformer → 여러개의 열을 한번에 정수로 변환 가능

이 배열을 분류기에 주입하면 X → color 값에 순서가 없는데, 있다고 간주하게 된다.

해결하기 위해 One-hot encoding 원-핫 인코딩 , 순서 없는 특성에 들어 있는 고유한 값마다 dummy 더미 특성 생성

ex) blue = 1, green = 0, red = 0 알파벳 순으로

from sklearn.preprocessing import OneHotEncoder

X = df[['color', 'size', 'price']].values
color_ohe = OneHotEncoder()
color_ohe.fit_transform(X[:, 0].reshape(-1, 1)).toarray() # 배열의 다른 두 열 수정X, 여러개의 특성이 있는 배열에서 특정 열만 변환하려면 ColumnTransformer 사용
from sklearn.composeimport ColumnTransformer

X= df[['color', 'size', 'price']].values
c_transf= ColumnTransformer([ ('onehot', OneHotEncoder(), [0]),
                               ('nothing', 'passthrough', [1, 2])])
c_transf.fit_transform(X)
  • get_dummies 가 더 편리한 방법 이다.
pd.get_dummies(df[['price', 'color', 'size']], columns=['size'])

다중 공선성 (multicolinearity) 문제 유념, 변수 간의 상관관계 높게 나타나는 것 주의

→ 변수 간의 상관관계를 감소하기 위해, 원-핫 인코딩된 배열에서 특성 열 하나를 삭제한다.

pd.get_dummies(df[['price','color','size']], drop_first = True) # 첫 번째 열 삭제
# OneHotEncoder에서 다중 공선성 문제 처리

color_ohe = OneHotEncoder(categories='auto', drop='first') # OneHotEncoder 에서 중복된 열 삭제하기 
c_transf = ColumnTransformer([ ('onehot', color_ohe, [0]),
                               ('nothing', 'passthrough', [1, 2])])
c_transf.fit_transform(X)