범주형 값에 의미있는 값이 많이 없다면 단순하게 드랍하는 것도 가능하다.
물론 이렇게 하면 정확도가 낮아질 확률은 있지만 그래도 제일 간단하다.
drop_X_train = X_train.select_dtypes(exclude=["object"])
drop_X_valid = X_valid.select_dtypes(exclude="object")
QnA
: exclude = ‘object’ 와 exclude = [’object’] 모두 되는 이유
순서 인코딩은 주어진 열에 있는 값에 누구나 납득할만한 랭킹(순서)가 있다는 가정하에 실행한다.
예시로 초등학교, 중학교, 고등학교, 대학교 같은 랭킹을 부여할 수 있는 값은 순서 인코딩으로 처리할 수 있다.
# 범주형 값 가져오기
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])
위와 같이 범주형 열에만 인코딩을 수행하고, 필요시 순서 인코딩할 열을 더 꼼꼼하게 선정해서 정확도를 올릴 수 있다.
원핫 인코딩은 각 범주형 열에 있는 고유 데이터의 개수마다 새로운 열을 만든다.
예를 들어 차량 종류를 수집했을 때 원핫 인코딩을 사용할 수 있다.
굳이 생각하자면 열을 옆으로 눕혀서 행으로 만든다고 생각하면 편할 것 같다.
새로 만들어진 열에 만약 해당 행이 조건을 충족한다면 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에서는 사용하지 않는지?)