작성
·
378
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
아하 그러면 스태킹에 베이스가 되는 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")
혹시 강의에서 사용하셨던 hyperopt 모듈과는 별개로, optuna 라는 모듈도 사용해 보셨을까요?
목적함수를 거의 동일하게 설정 후, 하이퍼파라미터를 구해봤는데, 두 모듈이 서로 다른 값을 반환하더라구요..
=> 두 모듈은 조금 다른 베이지안 최적화를 사용하므로 다른 값을 반환할 수 있습니다.
머신러닝 모델의 성능지표로 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로 적용해 봐도 큰 차이는 없었던것 같습니다.