인프런 커뮤니티 질문&답변
교재 크로스벨리데이션, 하이퍼파라미터 관련 질문
해결된 질문
작성
·
99
·
수정됨
0
1. 교재 작업2 다중분류 약물종류 예측에서
크로스벨리데이션으로 평가하는 방법이 나와있는데 제가 이해한게 맞는지 질문드립니다.
from sklearn.metrics import f1_score
from sklearn.model_selection import cross_val_score
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier(random_state = 0)
f1 = cross_val_score(model ,train, target ,cv=3 , scoring="f1_macro")마지막 한줄에서 cross_val_score가 train , target을 3(cv=3)덩어리로 나눈 후
각 덩어리?를 model을 통해 학습한 후 나머지 데이터로 평가하여 f1_macro로 각각의 평가지표가 계산되는것이고,
이후 앞으로 돌아가 전처리 등을 통해서 평가지표를 향상할 수 있도록 해본 후에
최종 제출하기 전에
마지막에 model.fit(train,target)을 통해서 전체 train, test로 다시 학습을 시킨 후 제출을 하는 과정이 맞을까요?
- 이 문제에서 총 train 데이터가 100개라 그런지 f1이 1이 나오길래 
 검증 데이터수가 너무 적어서 점수가 높게 나왔다고 생각하여 test_size를 0.3로 변경하고 진행을 하였습니다. 이런식으로 하는 방법은 train 데이터 수가 작아지기 때문에 옳은 방법이 아닌걸까요?
 3. 하이퍼파라미터 max_depth , n_estimators 등은 lightgbm, 랜포에서 동일하게 사용하는걸까요? lightgbm에 대한 하이퍼파라미터 튜닝은 다루지 않은것 같아서요(아직 기출 강의는 듣지 않아서 강의에서 다뤘을지도 모르겠습니다..)
- 1)튜닝을 하는 경우에는 데이터셋에 과적합 우려가 있기 때문에 cross_val_score을 사용하는것이 나아보이기도 하고, 2)튜닝값이 분할된 각 데이터셋에 적용되는 것이므로 , 마지막에 전체 데이터로 다시 학습시키는 과정에서 동일한 튜닝값이 적용되면 더 안좋아질 수도 있을 것 같은데 1) 2) 중 어느것이 옳은 생각일까요? 
- train_test_split을 이용하는 경우 전처리 + X_tr, y_tr을 통해 학습한 모델로 검증한 후 마지막에 전체 train, target으로 다시 학습시키는게 더 좋을 것 같은데(데이터 양의 증가), 튜닝을 한 경우에는 X_tr, y_tr로 학습한 모델로 제출을 하는 것이 옳을까요? 
- train_test_split을 했을때 하이퍼 파라미터 튜닝으로 f1이 0.61 ->0.65로 올라갔으나, 
 cross_val_score에서 같은 튜닝값을 적용하니 f1이 0.71 -> 0.69으로 내려갔습니다. 이런 경우 튜닝전후 어떤 값으로 제출하는게 좋을까요?
- 시험이 며칠 안남기는 했지만 cross_val_score을 익숙하게 쓸 수 있으면 시험에서도 train_test_split 대신 cross_val_score을 사용하는게 좋을까요? 아니면 train_test_split으로만 검증해도 상관없을까요 
질문이 많아서 죄송합니다.
감사합니다.
답변 2
0
- 네 맞습니다. cross_val_score은 평가 또는만 할 뿐 학습/예측을 하는 것은 아니라서 마지막에 학습 및 예측이 별도로 필요합니다. 
- 데이터 사이즈가 있다면 제가 답변드릴 수 있는데 혹시나 시험에서 데이터 사이즈가 작아 0.3으로 할 시 학습데이터가 작진 않을까 우려가 됩니다. 1이 나온 케이스는 아직은 없었어요 
- 튜닝은 지금 상황에서 감이 없다면 생략하시죠! 오히려 성능이 떨어질까봐 우려가 됩니다. 
- 우려가 있다면 튜닝 없이 전체 train 학습해서 제출 추천합니다. 튜닝을 해서 과적합이 일어나는 것은 아니고 잘못 튜닝해서 그렇습니다. 
- 둘 다 40점에 문제가 없었어요 
- cross_val_score이 좀 더 정확합니다. 
- train_test_split으로만 검증해도 됩니다. 응원합니다 💪 
0
안녕하세요, 인프런 AI 인턴입니다. 위잉님이 제기하신 질문에 대해 자세히 설명드리겠습니다.
- 교차검증(cross-validation)의 이해: 
 마지막 줄- cross_val_score는 데이터를- cv=3로 나누어 각 부분에 대해 학습 및 평가를 진행합니다. 즉, 데이터셋을 세 부분으로 나누어 두 부분으로 모델을 학습하고 나머지 한 부분으로 평가하는 과정을 세 번 반복합니다. 각 반복에서- f1_macro를 기준으로 평가가 이루어지며, 그 평균으로 성능이 측정됩니다. 전처리 등을 통해 성능을 개선한 후, 최종 제출 전에- model.fit(train, target)을 사용해 전체 데이터를 통해 모델을 학습시키는 과정이 맞습니다.
- train_test_split에서 데이터 분리: 
 - train_test_split의- test_size는 데이터를 분리할 비율을 지정합니다.- random_state를 변경하면 분리되는 데이터가 달라집니다. 즉,- random_state를 사용하여 데이터 분할을 반복적으로 변경할 수 있습니다. 매번 다른 데이터를 사용할 수 있어 일반화 성능 평가에 유리합니다.
- 데이터 분할비율 변경의 의미: 
 데이터가 적을 때, 검증 데이터 비율을 높이면 학습에 사용되는 데이터가 부족하게 되어 모델 성능 평가가 왜곡될 수 있습니다. 너무 적은 학습 데이터는 모델이 충분히 학습되지 않을 위험이 있으므로, 상황에 따라 적절한 비율을 선택하는 것이 중요합니다. 데이터가 많지 않다면,- cv값을 높이는 것이 하나의 방법이 될 수 있습니다.
- 시험에서 cross_val_score 사용: 
 - cross_val_score를 사용하는 것은 데이터 전반의 성능을 평가하는 데 도움이 되는 강력한 방법입니다. 그러나 시험 환경에서 익숙하지 않으면 오히려 혼란을 줄 수 있습니다.- train_test_split을 통해 데이터를 검증하는 것도 충분히 유효합니다. 시험에서 중요한 것은 정확성과 자신의 익숙함이므로, 자신에게 가장 익숙한 방법을 사용하는 것이 좋습니다.
추가적으로 몇 가지 유사한 질문과 답변을 아래에서 확인하실 수 있습니다:
- 4회 기출-2유형 macro-f1 score 관련: 교차 검증과 cross_val_score사용에 대한 질문입니다. 여기서cross_val_score의 사용이 교차 검증을 대체하는 과정임을 설명하고 있습니다.
 
- 기출 4회 (작업형 2): 교차 검증의 필요성과 train_test_split의 활용 가능성에 대한 논의가 있습니다.
 
- 기출4회 유형2  문의드립니다.: cross_val_score의 사용 예시와train_test_split의 대안 방법을 다룹니다.
 
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드립니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.






