작성
·
250
0
안녕하세요? 강의와 교재 전부 구입해서 잘 보고있습니다!
지금 스태킹 앙상블 부분을 보고있는데 이해가 안되는 부분이 있어 질문드립니다.
교재 p280~282 부분, 코드는 4.10 스태킹 앙상블 파트입니다.
코드를 보면 기본 스태킹 모델에서
1) 먼저 데이터를 1/5 로 나누어서 4/5는 학습데이터로, 1/5는 테스트 데이터로 나눈뒤 :
X_train , X_test , y_train , y_test = train_test_split(X_data , y_label , test_size=0.2 , random_state=0)
2) 개별 모델들이 학습데이터에서 학습 한 후, 테스트데이터(X_test)에서 예측을 합니다:
(모델들).fit(X_train, y_train)
(모델들).predict(X_test)
3)그리고 각 모델의 예측결과를 붙인 뒤(pred), 이것을 기반으로 최종모델인 로지스틱회귀로 학습 후:
pred = np.array([knn_pred, rf_pred, dt_pred, ada_pred])
lr_final.fit(pred, y_test)
4)예측을 합니다
final = lr_final.predict(pred)
여기서 질문이 두가지가 있습니다.
1. 첫 번째는 개별 알고리즘의 예측값을 피처로 이용해 학습한다는 것이 무슨 의미인지 모르겠습니다.
제가 개별 모델의 예측값과 final값을 비교해 보았는데 다수결방식으로 선택하고 동률일땐 1로 선택하는 것 같았습니다.
아래 그림은 개별모델의 예측값이 전부1이거나 전부0인 경우를 제외한 row만 보여줍니다.
그런데 이 예측값을 피처로 y_test값을 타켓으로 학습을 한다는게 잘 이해가 안됩니다.
각 모델에 가중치를 준다는 의미인 것같기고 하고...
2. 두번째 질문은 아래 코드입니다.
----------
lr_final.fit(pred, y_test)
final = lr_final.predict(pred)
print('최종 메타 모델의 예측 정확도: {0:.4f}'.format(accuracy_score(y_test , final)))
----------
여기서 보면 두번째 줄에서 예측을 할 때, 이미 학습한 pred를 가지고 예측을 하는데, 그러면 정확도가 100%가 나와되지 않나요? 그럼에도 정확도가 100%가 안나오는 이유를 알고싶고, 또한 왜 왜 다른 test데이터아닌 pred로 예측을 하는지 알고싶습니다.
+추가로, 데이터셋 나누는게 자꾸 헷갈리네요 ㅠㅠ train,test,학습데이터,검증데이터,평가데이터등등 가끔 보면 어디서 부터 어떻게 나누어졌는지 헷갈릴때가 많네요. 특히 뒤에 CV기반 스태킹에서 머리 터지는 줄 알았습니다..(조만간 또 질문할듯)
이제 공부단계라 질문이 좀 두서없지만 답변해주시면 감사하겠습니다.^^
답변 4
2
안녕하십니까,
스태킹 모델을 간략하게 요약하면 학습 데이터를 개별 모델이 예측한 결과값으로 재 생성한 뒤 최종 메타 모델이 이 결과값을 기반으로 다시 재 학습하는 방식입니다.
스태킹 모델은 앙상블 알고리즘에서도 특이한 형태입니다. 다른 알고리즘은 개별 모델이 예측한 결과값을 어떻게 잘 섞어서 성능을 보완할것인가에 촛점을 맞추지만, 스태킹 모델은 학습 데이터로 학습된 개별 모델들을 검증 데이터로 예측한 결과 값을 이용하여 이번엔 최종 메타 모델이 학습할 학습 데이터를 만드는 것입니다.
예를 들자면 10명의 학생이 객관식 수학 시험을 본다고 가정하면 스태킹 모델은 여러 학생들이 푼 답만 다시 학습을 하는 방식입니다. 즉 답의 패턴을 학습하는 것입니다. 이런 답의 패턴을 학습하기 위해서 여러번 시험을 보게 한 결과 답 데이터로 학습 데이터를 만드는 것입니다. 이렇게 답의 패턴을 학습하는 학습데이터는 보통 폴드 방식으로 검증 데이터를 여러번 사용하여 만들게 됩니다.
그리고 이렇게 만들어진 최종 메타 모델을 테스트 하기 위해서는 기존 피처 데이터 세트로는 불가능하므로 테스트 데이터의 답으로 구성된 별도의 테스트 데이터를 만들어서 테스트 하는 것입니다.
이렇게 최종 메타 모델이 학습할 학습 데이터와 테스트 데이트를 만드는 방식이 복잡해서 처음엔 누구나 이해하는데 시간이 필요합니다.
1. 책에 나와 있는 기본 스태킹 모델은 바람직한 모델은 아닙니다. 스태킹 모델이 복잡해서 이해를 돕기위해 간략한 형태로 설명드릴려고 했는데, 오히려 예측 데이터 세트를 바로 학습 데이터 세트로 활용하는 바람에 오해의 소지를 높인것 같습니다.
보다 정확한 모델이 되려면 예측 데이터 세트가 아니라 검증 데이터 세트로 예측한 결과를 스태킹 모델의 학습 데이터로 사용해야 하는데, 그러면 처음부터 너무 어려운 설명이 될 것 같아서 기본 모델에서는 이해를 돕는 차원에서 그렇게 작성하였습니다. (다음 책 개정 할때는 변경을 고려하겠습니다. )
2.
lr_final.fit(pred, y_test)
final = lr_final.predict(pred)
코드도 오해의 소지가 있겠군요. 추후에 수정이 필요할 것 같습니다.
일반적으로 학습에 사용된 데이터 세트를 다시 테스트 데이터 세트로 활용하더라도 반드시 동일한 결과를 나타내어 정확도가 100%가 나오지는 않습니다.
좋은 질문 감사합니다.
0
0
안녕하십니까,
스태킹 모델이 실제 업무 환경에 적응이 어려운 부분이 크게 두가지 입니다.
하나는 수행 시간이 상대적으로 오래 걸립니다.
두번째는 지적하신대로 실시간으로 새로운 데이터를 예측하기가 어렵습니다. 따라서 배치성으로 예측할 데이터 세트(테스트 데이터 세트)를 미리 만들어 놓아야 합니다. 스태킹 용으로 다시 테스트 데이터 세트를 만드는 별도의 과정이 필요하기 때문에 실시간으로 새로운 데이터를 예측해야 한다면 스태킹은 적용이 어렵습니다.
하지만 스태킹은 캐글과 같은 컴피티션에서 자주 활용되는 방식입니다. 일반적으로 분류 보다는 회귀에서 성능향상에 기여하는 경우가 많습니다.
감사합니다.
0
답변 감사합니다.
지금 CV기반의 스태킹을 보고 있는데 어느정도는 감이 오는 것 같습니다.
그런데 한가지 의문점이 있습니다.
CV기반 스태킹의 알고리즘은 알거 같은데, 여기서 새로운 데이터셋들이 올 때, 이것을 어떻게 예측하는지가 궁금합니다.
무슨 얘기인가 하면, 앞선 학습알고리즘들은 학습은 한 뒤(fit) , 그 학습한 모델의 예측 알고리즘을 기반으로 새로운 데이터셋들이 올 때, 그 데이터를 갖고 예측을 하기만 하면 됩니다. (predict(test_data_1) , predict(test_data_2), 등등)
그런데 CV기반 스태킹은 새로운 데이터가 올 때, 최종모델이 예측을 하기 위해선 새로운 데이터가 아닌, 개별모델들의 예측값들이 필요합니다.
이 때, 개별모델들이 새로운 데이터들을 어떻게 예측하는지가 궁금합니다. 다시 말해보자면, 최종모델은 이미 학습이 된 상태인 경우이고, 개별모델들의 예측값만 필요한 상태입니다.
여기서 개별모델들은 예측을 위한 학습데이터를 3개의 폴드로 나누어서 각각 (1,2) , (2,3), (1,3) 폴드의 데이터를 학습한 모델, 즉 개별모델들의 각 부분모델들(m1,m2,m3라고 한다면)이 있고, 그 m1,m2,m3 모델이 검증폴드를 이용해 최종모델 학습을 위한 데이터를 생성해서 평균을 취하고 다시 개별모델을 합쳐서 최종모델의 학습을 위한 데이터를 주었습니다.
그런데 이미 최종모델은 학습이 되있는 상태라, 이 과정은 필요가 없습니다.
궁금한 점은 새로운 데이터들이 들어올때, 이것들을 개별모델들이 예측을 할 때,
1) 위해서 말한 각 개별모델의 부분모델인 m1,m2,m3의 예측알고리즘을 갖고 새로운 데이터를 예측해 평균을 낸 뒤, 개별모델들을 합쳐서 최종모델의 예측을 위한 데이터를 주는 것인지,
2) 아니면, 개별모델들이 학습데이터를 3개로 폴드 시키지 않고, 전체데이터로 학습한 뒤, 그 모델의 예측알고리즘을 갖고 새로운 데이터를 예측을 한뒤, 개별모델들을 합쳐서 이것을 최종데이터의 예측을 위한 데이터를 주는 것인지 알고 싶습니다.
혹시 제가 잘 못 이해하고 있는게 있으면 알려주시면 감사하겠습니다.