Inflearn Community Q&A
KFold와 StratifiedKFold에 대해 질문 드립니다
Written on
·
231
0
KFold와 SKFold는 본고사 전에 모의고사를 보는 거라고 했죠. 이걸 cross_val_score로 편하게 할 수 있구요.
위 세 기능들은 test 데이터에 대한 예측 전에 내가 만든 classifier가 어느정도 성능을 내는지 확인하기 위한거라고 생각해도 될까요?
그리고 저 세 기능들로 데이터를 나눠서 fitting을 시킬 수 있나요?
train_test_split으로 train 데이터와 test 데이터를 만들어서 classifier에 입력하듯이, KFold를 이용해서 학습데이터와 검증데이터를 만들수 있는지 궁금해요. 위 세 기능들은 단순히 모의고사를 쳐보는 목적인가요???
cross_validation.train_test_split이라는걸 봤는데, 여기서 stratify = y_label 이런 식으로 SKFold가 샘플링 하듯 균일하게 데이터를 나누는 것 같더라구요.
만약 검증과정을 건너뛰고 skfold처럼 균일하게 데이터를 균일하게 학습데이터와 검증데이터로 나누려면 이 기능을 써도 되는건지 궁금합니다.
공부할수록 궁금한게 많아지네요ㅜ
Answer 3
0
테스트는 많이 할수록 좋습니다.
어떻게 보면 테스트라는 관점에서 보면 테스트 데이터와 검증 데이터를 분리하는 것은 큰 차이가 없을 수 있습니다. 실전에서는 테스트 데이터를 만드는데 많은 공을 들여야 합니다. 현실의 상황을 반영해야 하고, 아예 테스트 데이터와 다른 분포도를 가진 데이터 세트를 넣어서 어느정도 성능이 나빠지는지 확인하기도 합니다. 그냥 임의의 값으로 나누지 않는 것이 바람직합니다. 하지만 이렇게 테스트 데이터를 준비하는데 많은 시간이 필요하기 때문에, 실상은 전체 데이터에서 어느정도 임의의 값으로 나누는 것이 현실이기도 합니다.
전체 데이터가 작을 경우는 더욱 테스트 데이터 결과로만 판단해서는 안됩니다. 테스트 데이터를 임의로 나누면 운좋게도 테스트 결과 성능이 좋게 나올 수도(학습 데이터와 중요 피처들의 분포도등이 같다면), 반대로 결과 성능이 나빠 질수도 있습니다(학습 데이터와 중요 피처들의 분포도등이 다를 경우)
따라서 검증 데이터를 여러번 사용하여 이 결과 역시 테스트 결과와 더불어 최종 결과에 참조하는 것이 좋습니다.
결론적으로 말씀드리면 검증 데이터로 여러번 검증하는 것이 정상 프로세스 입니다.
그리고 Stratified에서 Skew된 데이터 세트라는 의미는 결과값(타겟값)이 특정 값으로 치우쳐 있을 경우를 의미합니다. 예를 들어 금융사기 데이터가 있다면 전체 데이터 중에 금융사기가 아닌 건이 99% 이상 차지하고, 나머지 1%가 금융사기 데이터가 될 것입니다. 이때 학습 데이터가 금융사기 아닌것 99%, 금융사기 1% 로 나누고, 테스트 데이터는 금융사기 아닌것 90%, 금융사기 10% 로 나누는 것은 바람직 하지 않습니다(때로는 테스트 데이터를 학습 환경과 다르게 구성하기도 합니다만, 이 경우는 예외로 하겠습니다). 이때 Stratified 기법을 이용하여 학습과 테스트 데이터 모두 99대 1로 결과값을 동일하게 설정하면서 분리해 줍니다.
감사합니다.
0
제가 이해한 것이 맞는 지 확인 부탁드립니다.
보통 실습에선 데이터가 학습용과 테스트용으로 나뉘어져 있습니다.
그리고 KFold를 통해 학습용 데이터를 쪼개어 학습도 하고 검증도 했습니다.
그런데 이렇게 하는 것이 아니라 학습/검증/테스트 데이터로 분리하여 학습용으로 피팅을 시키고, 검증데이터로 검증을 따로하고 최종적으로 테스트데이터로 테스트를 한다는 건가요??
그리고 그냥 검증 안하고 테스트데이터로 성능 확인하면 안되나요?
자꾸 헷갈립니다...
그리고 skew된 형태의 분포도라는게 어떤거죠
0
안녕하십니까,
아래와 같이 답변을 정리하였습니다.
1. 위 세 기능들은 test 데이터에 대한 예측 전에 내가 만든 classifier가 어느정도 성능을 내는지 확인하기 위한거라고 생각해도 될까요?
=> 네. 맞습니다. 하지만 어느정도 성능을 낸다라는 의미라기 보다는 여러개의 검증용 데이터 세트로 예측 성능을 다양하게 검증해 본다고 생각하시면 좋을 것 같습니다.
2. 그리고 저 세 기능들로 데이터를 나눠서 fitting을 시킬 수 있나요?
train_test_split으로 train 데이터와 test 데이터를 만들어서 classifier에 입력하듯이, KFold를 이용해서 학습데이터와 검증데이터를 만들수 있는지 궁금해요. 위 세 기능들은 단순히 모의고사를 쳐보는 목적인가요???
=> 질문을 정확히는 이해하지 못했지만 대략적으로 이해하여 아래와 같이 답변드립니다. 원하시는 답이 아니시면 다시 말씀해 주십시요.
cross_validation.train_test_split 은 train_test_split은 과거 버전 사이킷런에서 train_test_split의 패키지 입니다. 현재는 model_selection.train_test_split입니다.
train_test_split()함수의 stratify=y를 하게 되면 말씀하신 대로 StratifiedKFold와 유사하게 학습과 테스트 데이터 세트를 만들때 두 데이터 세트의 결과값 분포를 동일하게 맞춰 줍니다. 결과값이 skew된 형태의 분포도를 가질때 학습과 테스트 데이터 세트로 나누고자 한다면 보통 stratify=y를 설정합니다.
그리고 train_test_split()은 검증 데이터를 만든다기 보다는 학습과 테스트 데이터로 만드는 데 보통 사용됩니다. 강의에서는 데이터 세트가 모자라서 검증용 데이터를 테스트 데이터로 사용하기도 하였지만 학습/검증/테스트 데이터는 각각 분리되어 만들어 지는것이 정석입니다.
감사합니다.





