[Kaggle][Learn] Intermediate Machine Learning - (3)Categorical Variables ::

켈로그·2024년 1월 2일
0

Kaggle

목록 보기
11/11

머신러닝 모델에서 범주형 값(Categorical Value) 처리하기

(3) Categorical Variables :: **머신러닝 모델에서 범주형 값(Categorical Value) 처리하기**

3가지 방법

  • 범주형 값 드랍하기
  • 순서 인코딩(Ordinal Encoding)
  • 원핫 인코딩(One-hot Encoding)

범주형 값 드랍하기

범주형 값에 의미있는 값이 많이 없다면 단순하게 드랍하는 것도 가능하다.

물론 이렇게 하면 정확도가 낮아질 확률은 있지만 그래도 제일 간단하다.

drop_X_train = X_train.select_dtypes(exclude=["object"])
drop_X_valid = X_valid.select_dtypes(exclude="object")

QnA : exclude = ‘object’ 와 exclude = [’object’] 모두 되는 이유

  • 원래 iterable이 들어갈 수 있는데, 이렇게 하나만 선택할 때는 list형태가 아닌 문자열 형태로도 가능

순서 인코딩(Ordinal Encoding)

순서 인코딩은 주어진 열에 있는 값에 누구나 납득할만한 랭킹(순서)가 있다는 가정하에 실행한다.

예시로 초등학교, 중학교, 고등학교, 대학교 같은 랭킹을 부여할 수 있는 값은 순서 인코딩으로 처리할 수 있다.

# 범주형 값 가져오기
object_cols = [cols for col in X_train.columns if X_train[col].dtype == "object"]
# 인코더 가져오기
from sklearn.preprocessing import OrdinalEncoder
ordinal_encoder = OrdinalEncoder()
new_X_train[object_cols] = ordinal_encoder.fit_transform(X_train[object_cols])
new_X_valid[object_cols] = ordinal_encoder.transform(X_valid[object_cols])

위와 같이 범주형 열에만 인코딩을 수행하고, 필요시 순서 인코딩할 열을 더 꼼꼼하게 선정해서 정확도를 올릴 수 있다.

원핫 인코딩(One-hot Encoding)

원핫 인코딩은 각 범주형 열에 있는 고유 데이터의 개수마다 새로운 열을 만든다.

예를 들어 차량 종류를 수집했을 때 원핫 인코딩을 사용할 수 있다.

굳이 생각하자면 열을 옆으로 눕혀서 행으로 만든다고 생각하면 편할 것 같다.

새로 만들어진 열에 만약 해당 행이 조건을 충족한다면 1을 추가한다.

# 인코더 가져오기
from sklearn.preprocessing import OneHotEncoder
OH_encoder = OneHotEncoder(handle_unknown="ignore", sparse_output=False)

OH_X_train = pd.DataFrame(OH_encoder.fit_transform(X_train[object_cols]))
OH_X_valid = pd.DataFrame(OH_encoder.transform(X_valid[object_cols]))

위 작업에서 OH_X_train 은 새롭게 추가될 인코딩 행렬이다.

최종적으로 모델을 돌리려면 기존 DF에서 인코딩된 열을 제거하고, 위에서 만들어진 DF를 추가한 뒤 실행해야한다.

QnA : 원 핫 인코딩에서만 handle_unknown='ignore’ 을 쓰는 이유? (왜 ordinal에서는 사용하지 않는지?)

  • ordinal에서는 사용할 필요가 없음! 애초에 순서(단계)가 적용되어 있는 상황에서만 사용할 것이므로 그 외의 값이 들어올 땐 그저 drop
  • (추가) 원핫인코딩에서 train에서는 보지 못한 col 봣을 때 처리하는 다른 방법들 :
    • error
    • handle_unknown
    • infrequent
profile
호랑이기운

0개의 댓글