해결된 질문
작성
·
36
·
수정됨
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
을 통해 데이터를 검증하는 것도 충분히 유효합니다. 시험에서 중요한 것은 정확성과 자신의 익숙함이므로, 자신에게 가장 익숙한 방법을 사용하는 것이 좋습니다.
추가적으로 몇 가지 유사한 질문과 답변을 아래에서 확인하실 수 있습니다:
cross_val_score
사용에 대한 질문입니다. 여기서 cross_val_score
의 사용이 교차 검증을 대체하는 과정임을 설명하고 있습니다.train_test_split
의 활용 가능성에 대한 논의가 있습니다.cross_val_score
의 사용 예시와 train_test_split
의 대안 방법을 다룹니다.저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드립니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.