• 카테고리

    질문 & 답변
  • 세부 분야

    딥러닝 · 머신러닝

  • 해결 여부

    미해결

스태킹 모델 생성 후 새로운 데이터에 적용 문의드립니다.

22.11.14 13:19 작성 조회수 309

0

안녕하세요 강사님, 스태킹 모델 관련 질문 다시한번만 드리겠습니다 ㅠ

 

현재 xgb,lgbm, 랜덤포레스트, 결정트리 4가지 모델에 대한 stacking 모델을 만들고자 합니다.

 

각 모델에 대한 학습은 완료되었으며, pkl 파일로 추출하였습니다

 

강의에 사용된 get_stacking_base_datasets() 함수의 경우 아래 예시처럼 y_train을 인자로 받고 있는데,

xgb_train, xgb_test = get_stacking_base_datasets(xgb_clf, X_train, y_train, X_test, 7)

만약 경연 등의 목적으로 정답이 주어지지 않은 새로운 데이터가 주어졌을 경우, y_train값은 존재하지 않게 되는데, 이럴 경우 어떤 식으로 예측 코드를 작성해야 할 지 감이 잡히지 않아 다시 여쭙게 되었습니다..!

xgb_train, xgb_test = get_stacking_base_datasets(xgb_clf, X_train, y_train, X_test, 7)
lgbm_train, lgbm_test = get_stacking_base_datasets(lgbm_clf, X_train, y_train, X_test, 7)
rf_train, rf_test = get_stacking_base_datasets(rf_clf, X_train, y_train, X_test, 7)
dt_train, dt_test = get_stacking_base_datasets(dt_clf, X_train, y_train, X_test,  7)  

Stack_final_X_train = np.concatenate((xgb_train, lgbm_train, rf_train, dt_train), axis=1)
Stack_final_X_test = np.concatenate((xgb_test, lgbm_test, rf_test, dt_test), axis=1)

lr_final = LogisticRegression()
lr_final.fit(Stack_final_X_train, y_train)
stack_final = lr_final.predict(Stack_final_X_test)

 

 

답변 2

·

답변을 작성해보세요.

1

안녕하십니까,

y_train은 학습 데이터의 타겟값입니다.

그러니까 아래의 코드라면 X_train은 학습 데이터의 피처 데이터, y_train은 학습 데이터의 타겟값, 그리고 X_test가 경연대회 테스트 피처 데이터 입니다.

xgb_train, xgb_test = get_stacking_base_datasets(xgb_clf, X_train, y_train, X_test, 7)

그리고 반환되는 xgb_test는 경연 대회 테스트 피처 데이터를 기반으로 새롭게 테스트 데이터를 생성하는 것입니다. 그래서 아래와 같이 xgb_test, lgbm_test, rf_test, dt_test 데이터가 만들어지면,

xgb_train, xgb_test = get_stacking_base_datasets(xgb_clf, X_train, y_train, X_test, 7)
lgbm_train, lgbm_test = get_stacking_base_datasets(lgbm_clf, X_train, y_train, X_test, 7)
rf_train, rf_test = get_stacking_base_datasets(rf_clf, X_train, y_train, X_test, 7)
dt_train, dt_test = get_stacking_base_datasets(dt_clf, X_train, y_train, X_test,  7) 

아래 Stack_final_X_test가 최종적으로 만들어지는 경연대회용 테스트 데이터 이며,

Stack_final_X_test = np.concatenate((xgb_test, lgbm_test, rf_test, dt_test), axis=1)

이 테스트 데이터 데이터를 기반으로 최종 예측을 아래와 같이 할 수 있습니다.

stack_final = lr_final.predict(Stack_final_X_test)

 

요약하자면 경연 대회 테스트 데이터를 스태킹 메타 모델에서 사용하기 위해서 가공을 get_stacking_base_datasets()와 np.concatenate()를 이용해서 다시 만들어 줘야 합니다.

감사합니다.

0

한창현님의 프로필

한창현

질문자

2022.11.14

아하 그러면 스태킹에 베이스가 되는 xgb, lgbm 등의 모델만 먼저 준비 후, X_test를 제외한 값은 훈련에 사용했던 데이터를 그대로 넣어주면 되는거군요..!!

감사합니다~

 

혹시 강의에서 사용하셨던 hyperopt 모듈과는 별개로, optuna 라는 모듈도 사용해 보셨을까요?

목적함수를 거의 동일하게 설정 후, 하이퍼파라미터를 구해봤는데, 두 모듈이 서로 다른 값을 반환하더라구요..

 

머신러닝 모델의 성능지표로 precision 점수를 사용하다고 했을 때, 목적함수의 roc_auc_list에 append되는 score를 auc_roc_score가 아닌 precision_score를 사용할 경우, 결과적으로 precision점수가 높은 모델을 생성할 수 있을까요?

ex)

score = precision_score(y_val, xgb_clf.predict(X_val),average="macro")

  1. 혹시 강의에서 사용하셨던 hyperopt 모듈과는 별개로, optuna 라는 모듈도 사용해 보셨을까요?

    목적함수를 거의 동일하게 설정 후, 하이퍼파라미터를 구해봤는데, 두 모듈이 서로 다른 값을 반환하더라구요..

    => 두 모듈은 조금 다른 베이지안 최적화를 사용하므로 다른 값을 반환할 수 있습니다.

  2. 머신러닝 모델의 성능지표로 precision 점수를 사용하다고 했을 때, 목적함수의 roc_auc_list에 append되는 score를 auc_roc_score가 아닌 precision_score를 사용할 경우, 결과적으로 precision점수가 높은 모델을 생성할 수 있을까요?

    => 원칙적으로는 모델의 목적함수 평가지표로 테스트에 사용되는 성능지표를 사용하는게 맞습니다. 그러니까 테스트 데이터의 평가 지표가 precision_score이면 모델의 목적함수 학습/검증 평가 지표도 precision_score로 하는게 맞습니다. 그런데 문제가 lightgbm, xgboost 모두 목적함수 지표로 precision_score를 default로 제공하지는 않습니다.

    이걸 precision_score로 변경하는 방법도 있는데(오랜전에 해봐서 잘 기억이 나지는 않습니다만), 실제로 roc_auc가 아닌 precsion_score로 적용해 봐도 큰 차이는 없었던것 같습니다.