인프런 커뮤니티 질문&답변

빅분기수강생님의 프로필 이미지

작성한 질문수

[퇴근후딴짓] 빅데이터 분석기사 실기 (작업형1,2,3)

ㅎㅇ

해결된 질문

24.06.14 13:28 작성

·

102

·

수정됨

0

저번에 질문한 거 코드 수정 및 정리했습니다. 선생님

 

※ 피쳐엔지니어링에서 train, test 셋을 분리( .copy() )해서 수치형은 스케일링하고 범주형은 인코딩 한 다음, 합치기 ( .concat() ) 하는 방식이 아니라

수치형 부분 칼럼을 변수(cols_n)로 받고, 범주형 부분을 변수(cols_c) 으로 받아서, 데이터셋을 수치와 범주형으로 분리하지 않은 상태에서 각각 스케일링, 인코딩을 적용하고 검증데이터셋 분리-> 모델 & 평가지표 불러오기 -> 예측(테스트셋 적용) -> df 생성 -> 제출 하는 방법에서

 

아래에 피쳐 엔지니어링 부분 코드 정리한거 확인 부탁드립니다.

 

 

경우 1. [train, test // 2개 데이터셋 제공시]

# train셋엔 있고 test셋엔 없는 "target"에 해당하는 칼럼 분리
# "target" 데이터는 범주형이든 수치형이든 스케일링이나 인코딩을 하면 안되므로 제외시킴

target = train.pop(["target"])
cols_n = train.select_dtypes(exclude="O").columns
cols_c = train.select_dtypes(include="O").columns
## 수치형 민맥스 스케일링 작업
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
           
train[cols_n] = scaler.fit_transform(train[cols_n])
test[cols_n] = scaler.transform(test[cols_n])

 

## 범주형 라벨 인코딩 작업
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

for col in cols_c:
    le = LabelEncoder()
    train[col] = le.fit_transform(train[col])
    test[col] = le.transform(test[col])


## or 범주형 원핫 인코딩 작업 시 

# .get_dummies() 원핫 인코딩은 자동으로 범주형만 찾아서 인코딩 함
# 방법 1
train = pd.get_dummies(train)   
test = pd.get_dummies(test)

## 라벨 인코딩과 통일성을 원한다면 (방법 2)
train = pd.get_dummies(train[cols_c])   
test = pd.get_dummies(test[col_c])
# 다만 어차피 자동으로 찾아주니 이렇게 하지 말고 간편한 위의 방법 1 방식으로 하자

그 다음 검증데이터셋 분리 등 과정 이후 ~~~~~~~~~~~ 제출

 

 

 

경우 2. [X_train, y_train, X_test // 3개 데이터셋 제공시]

cols_n = X_train.select_dtypes(exclude="O").columns
cols_c = X_train.select_dtypes(include="O").columns
## 수치형(스케일링) 작업

##민맥스 스케일링
from sklearn.preprocessing import MinMaxScaler
scaler = MinMaxScaler()
          
X_train[cols_n] = scaler.fit_transform(train[cols_n])
X_test[cols_n] = scaler.transform(test[cols_n])
## 범주형(인코딩) 작업

## 라벨 인코딩
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()

for col in cols_c:
    le = LabelEncoder()
    X_train[col] = le.fit_transform(X_train[col])     
    X_test[col] = le.transform(X_test[col])


## or 원핫 인코딩 시 
# .get_dummies() 원핫 인코딩은 자동으로 범주형만 찾아서 인코딩 함
# 방법 1
X_train = pd.get_dummies(X_train)   
X_test = pd.get_dummies(X_test)

## 라벨 인코딩과 통일성을 원한다면 (방법 2)
X_train = pd.get_dummies(X_train[cols_c])   
X_test = pd.get_dummies(X_test[col_c])
# 다만 어차피 자동으로 찾아주니 이렇게 하지 말고 간편한 위의 방법 1 방식으로 하자

이후 검증데이터셋 분리 등 과정 이후 ~~~~~~~~~~~ 제출

 

이번 코딩엔 틀린게 없어야 할텐데.....

이거 제대로 한거 맞는지 확인 부탁드립니다. 선생님

여러 차례의 질문에 답변 해주셔서 감사합니다

 

 

답변 1

0

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

2024. 06. 14. 18:12

train = pd.get_dummies(train[cols_c]) 
test = pd.get_dummies(test[col_c])

이 코드 그대로 사용할 건 아니죠? 범주형만 저장됩니다.

 

그리고 만약 행의 수만큼 유니크한 ID가 있다면 ??

ID가 숫자라면 함께 스케일링 되지 않도록 제거 (스케일링 생략하면 상관없음)

ID가 문자라면 함께 인코딩 되지 않도록 제거

 

빅분기수강생님의 프로필 이미지

2024. 06. 15. 17:03

죄송한데요.... 그럼 제가 적은 원핫인코딩 방법 2 부분은 그냥 삭제하고 방법 1로만 하면 문제 없이 되는거 맞죠....??? 계속 질문이 생기게 되네요...

퇴근후딴짓님의 프로필 이미지
퇴근후딴짓
지식공유자

2024. 06. 15. 23:57

X_train = pd.get_dummies(X_train)

X_test = pd.get_dummies(X_test)

는 문제없습니다.