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

nealzs님의 프로필 이미지
nealzs

작성한 질문수

[개정판] 파이썬 머신러닝 완벽 가이드

교차검증 성능평가 cross_val_score()와 하이퍼 파라미터 튜닝을 위한 GridSearchCV - 01

test data를 예측할때 scaling 질문

작성

·

763

0

train data를 train과 test로 나누어 학습과 검증을 하게 되는데

이후 실제 예측을 하기 위한 test data 에도 train 데이터에서 해서 했던 데이터 스케일링과 같은 작업은 동일하게 해줘야 하나요??

그리고 해당 강의에서 grid search cv를 수행할때

eval set에는 train 데이터를 train 과 validation으로 나누고 해당 train을 또 test로 나누어서 eval set에 넣어야 하나요??

답변 7

0

권 철민님의 프로필 이미지
권 철민
지식공유자

1.  xgboost, lightgbm를  하이퍼 파라미터 튜닝을 한다면

첫번째 경우는 GridSearch를 이용하되, CV를 활용하지 않는 것입니다. cv를 활용하면 eval_set에서 지정한 검증 데이터와 Grid search 의 CV검증 데이터가 서로 맞지 않을 것입니다.

그리고 eval_set에 학습 데이터를 쪼개서 train과 valid로 데이터를 입력합니다. eval_set=[(X_train, y_train), (X_valid, y_valid)]

두번째는 GridSearch를 이용하지 않는 것입니다.  Cross validation 코드를 직접 짜거나 Lightgbm, XGBoost 모두 python 모듈(사이킷런 호환 모듈이 아니라) 자체적으로 cv() 메소드를 가지고 있으므로 이를 이용합니다. 이를 이용하면 eval_set를 사용할 수 있습니다.

하지만 이 경우는 다양한 하이퍼 파라미터를 넣고 검증해보는 코드를 직접 짜야 합니다.

세번째로 Bayesian optimization 을 활용합니다. XGBoost, Lightgbm을 파라미터가 많아서 GridSearchCV로 튜닝하기가 매우 시간이 오래 걸립니다. 때문에 Bayesian optimization을 활용합니다.

아래 링크에 이에 대한 자료가 있으니 참조 부탁드립니다.

https://www.facebook.com/groups/KaggleKoreaOpenGroup/permalink/286144512117655/

https://data-newbie.tistory.com/160

2.

여기서 대체하고자 하는 레코드의 target 값에(binary라면 0 또는 1) 따라 outlier의 target class가 1일때 혹은

 target class 0일때로 나누어 값을 대체하게 된다면 더욱더 과적합의 위험성이 커지는지 궁금합니다.

=> 과적합이 있을 수 있지만 충분히 시도할 가치가 있어보입니다. 시도해서 과적합이 높으면 변경하면 됩니다.

또한 scaling이나 이상치 처리를 어느정도 끝냈다면 (classification기반의 알고리즘 일때) feature data 간의 correlation도 성능에 큰 영향을 끼치는지 궁금합니다.

=> feature 간의 correlation이 너무 높으면 선형 기반의 머신러닝 알고리즘에서 성능에 나쁜 영향을 미치는 걸로 알려져있는데, 실제 테스트 해보면 그렇게 까지 나빠지지 않습니다. 성능을 평가해 보고, 나중에 성능 향상을 모색할때 feature간의 correlation이 과하게 높다면 제거를 고려해 볼수 있습니다.

0

nealzs님의 프로필 이미지
nealzs
질문자

아 넵 항상 자세한 답변 감사합니다!

grid search로 light gbm을 이용할 시 eval set를 지정해주지 않으면 아예 코드가 돌지 않는 거 같습니다.

더 검색해보고 있습니다!! ㅎㅎ

질문1)

"eval_set은 검증 데이터 셋을 직접 지정하는 것인데" 라고 가르쳐주셨는데

=> 그렇다면 보통 grid search cv를 이용하여 분석시

만약에 제가 XGBoost를 사용한다면(scikit learn의 grid search와 호환이 잘 되는 알고리즘이라면)

eval_set에 넣을 검증용 데이터는 train data에서 분리한

test data(여기서의 test data는 실제 예측하고자하는 target이 아닌 train data에서 분리된 test data)

이외의 train data에서 별도로 분리한 (validation) data 를 넣는 것인가요? (많은 분석자들이 어떤식으로 하는지 궁금합니다)

질문2)

feature engineering 중 outlier들을 최대한 제거하지 않는 쪽으로 방향을 잡았고 이를 가령 평균이나 median등으로 대체하는 작업을 진행한다고 가정해보겠습니다.

여기서 대체하고자 하는 레코드의 target 값에(binary라면 0 또는 1) 따라 outlier의 target class가 1일때 혹은

 target class 0일때로 나누어 값을 대체하게 된다면 더욱더 과적합의 위험성이 커지는지 궁금합니다. 

위처럼 class의 따라 따로 처리해도 되는 지 그리고 실제로 많은 분석자들이 그렇게 하나요???

분석자의 경험의 영향이 크게 작용되는 부분인 것 같아 아직까지는 전처리를 하면서 "이렇게 해도 되나?"라는

생각을 많이 하게 되여 질문을 계속 하는 것 같습니다. 죄송함다 ㅜㅜ

또한 scaling이나 이상치 처리를 어느정도 끝냈다면 (classification기반의 알고리즘 일때) feature data 간의 correlation도 성능에 큰 영향을 끼치는지 궁금합니다.

regression 같은 경우에는 다중공선성 문제가 영향이 큰것으로 알고 있어서 문득 떠올랐습니다.

0

권 철민님의 프로필 이미지
권 철민
지식공유자

1. outlier제거는 학습데이터에만 하시면 되기에 상관없습니다. 그리고 강의에는 target이 1인 것만 outlier를 제거 했는데, target이 0인것도 outlier를 제거하면 성능이 조금 더 올라갑니다.

2. gridsearchcv와 lightgbm eval_set, eval_metric은 서로 호환되지 않으니 위와 같은 방법은 적용하지 않는게 좋을 것 같습니다. 다시 정리 드리면 lightgbm eval_set를 사용하고자 하신다면 gridsearchcv를 적용하지 않으시는게 좋을 것 같습니다.

0

nealzs님의 프로필 이미지
nealzs
질문자

네! 답변 감사합니다!!

3. 그리고 그 뒤로 이어지는 질문은 제가 잘 이해하지 못했습니다. 1번 답변과 연관된 부분도 있는 것 같으니 다시 한번 재 정리해서 질문을 올려주시기 바랍니다.

=>  질문1) binary 문제의 train 데이터를 전처리 및 스케일링하는  작업 중에 예를 들어

특정 feature의 outlier들을 해당 feature의 평균값으로 대체 하려고 합니다. 이 중 train 데이터의 target data class가 1인 경의 값들만 대체해도 되는 건지 궁금합니다.

이후 test data도 같은 작업을 수행한다면 test data에는 y data가 없으니 train data에 해줬던 작업을 못하게 되는거 아닌가요?

=> 질문2) grid_cv = GridSearchCV(lgbm_clf, param_grid = params, scoring = "precision")

grid_cv.fit(X_train, y_train, early_stopping_rounds = 100, eval_metric = "precision", eval_set = [(X_train, y_train),(X_test, y_test)])

위에서 답변해주신 것처럼 eval set가 해당 코드에서 영향이 없다면, eval_metric = "precision", 도 영향이 없는 것인가요?

 scoring = "precision" 과 eval_metric의 차이를 잘 모르겠습니다. 많은 검색을 해봤지만 해당 파라미터의 대한 설명이 자세히 없어서

질문드렸습니다. 

0

권 철민님의 프로필 이미지
권 철민
지식공유자

1. grid search cv를 하기 위해서는 위 0.7에 해당하는 데이터를 validation용으로 또 나누어 eval set 에 넣으면 되는 건가요?

=> grid search에서 eval set을 설정하시는 시도때문에 헷갈리는것 같으십니다. 보통 grid search와 lightgbm 결합할 때 eval_set을 grid search에 설정하지 않습니다. grid search와 lightgbm eval_set과는 호환되지 않는것 같습니다(저도 넘 옛날에 테스트를 해봐서,, )

lightgbm이 원래 scikit learn으로 개발된게 아니어서 eval_set이 있을 경우 eval_set을 기반으로 해서 grid search와는 완벽하게 호환되지 않습니다. eval_set은 검증 데이터 셋을 직접 지정하는 것인데, grid search는 검증 데이터 셋을 k fold 방식으로 계속 교체하기 때문입니다.

따라서 lightgbm의 eval_set를 유지하면서 Grid search cv를 할 수 없기에 다른 방법등으로 hyper parameter를 교체해가면서 튜닝할 수 있도록 로직을 짜야 합니다.

2. 최종 예측하고자 하는 데이터 셋트, 즉 target value가 없는 데이터셋트에도 해주는게 맞는 건가요?

=> 네 맞습니다.

3. 그리고 그 뒤로 이어지는 질문은 제가 잘 이해하지 못했습니다. 1번 답변과 연관된 부분도 있는 것 같으니 다시 한번 재 정리해서 질문을 올려주시기 바랍니다.

감사합니다.

0

nealzs님의 프로필 이미지
nealzs
질문자

답변 감사합니다!!

그렇다면 만약에 binary 분류에서 train_test_split를 통해 test size를 0.3으로 데이터를 나눴다면

grid search cv를 하기 위해서는 위 0.7에 해당하는 데이터를 validation용으로 또 나누어 eval set 에 넣으면 되는 건가요? 

그리고 하이퍼 파라미터 튜닝 이후, 최종으로 예측하고자하는 데이터 셋트를 통해 예측치를 뽑으면 되는 건가요?

앞서 질문드렸던 데이터 스케일링에 관해

0.3 에 해당하는 test data 가 아닌

최종 예측하고자 하는 데이터 셋트, 즉 target value가 없는 데이터셋트에도 해주는게 맞는 건가요?

신용카드 사기 분류 강의를 듣다 의문점이 생겼습니다.

해당 강의에서 class 가 1에 해당되는 feature의 outlier들을 처리하게 되는데

만약 제가 class1에 해당되는 feature의 outlier들을 해당 feature의 평균값으로 변경하였다면

그렇다면 최종으로 예측하고자 하는 데이터는 어떤 식으로 처리해야되는지 궁금합니다

만약 제가 아래와 같이 light gbm을 수행한다면 overfitting 되는 건가요??

grid_cv = GridSearchCV(lgbm_clf, param_grid = params, scoring = "precision")

grid_cv.fit(X_train, y_train, early_stopping_rounds = 100, eval_metric = "precision", eval_set = [(X_train, y_train),(X_test, y_test)])

eval_set에 (X_vali, y_vali), (X_test, y_test)와 같이 넣어야 되는지 궁금합니다

또한 제가 만약 precision score를 중점으로 보고 싶다면 아래와 같이 하면 되는지...

scoring과 eval_metric의 차이를 잘 모르겠습니다.

질문이 많아서 죄송합니다!!

아직 많이 헷갈리고 배우는 중입니다!!

매번 감사합니다

0

권 철민님의 프로필 이미지
권 철민
지식공유자

안녕하십니까,

네, 맞습니다. 학습시 train 데이터에 스케일링과 같은 작업을 해줬으면 테스트 데이터도 동일하게 작업이 되어야 합니다.

train데이터를 일반적으로 다시 train과 validation으로 나누지만, train 을 test로 다시 넣어서는 안됩니다. 오버피팅됩니다.

감사합니다.

nealzs님의 프로필 이미지
nealzs

작성한 질문수

질문하기