해결된 질문
작성
·
23
0
기출 9회 작업2유형 풀이 코드입니다.
# print(train.shape,test.shape) # (4000, 9) (1000, 8)
# print(train.info(), test.info()) # float64(3), int64(2), object(4), float64(3), int64(1), object(4)
# print(train.nunique(), test.nunique()) # 농업면적 4000, 비료사용량 3997, 비료잔여량 4000
# print(train.head(30))
# train = train.drop(columns = '농업면적')
# test = test.drop(columns = '농업면적')
# train = train.drop(columns = '비료사용량')
# test = test.drop(columns = '비료사용량')
# train = train.drop(columns = '비료잔여량')
# test = test.drop(columns = '비료잔여량')
# target = train.pop('농약검출여부')
from sklearn.preprocessing import LabelEncoder
le = LabelEncoder()
cols = train.select_dtypes(include = 'O').columns
for col in cols:
train[col] = le.fit_transform(train[col])
test[col] = le.transform(test[col])
from sklearn.model_selection import train_test_split
X_tr, X_val, y_tr, y_val = train_test_split(train, target, test_size =0.2, random_state = 0)
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier(random_state = 0, max_depth = 11, n_estimators = 200, class_weight = 'balanced')
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)
from sklearn.metrics import f1_score, accuracy_score, recall_score
print('f1 : ', round(f1_score(y_val, pred, average = 'macro'), 3))
print('acc : ', round(accuracy_score(y_val, pred), 3))
print('recall : ', round(recall_score(y_val, pred, average = 'macro'), 3))
처음 학습을 진행할 때 랜덤포레스트에 class_weight 하이퍼파라미터는 적용하지 않은 상태에서 학습을 진행했고, f1 : 0.887 acc : 0.97 recall : 0.848이라는 높은 수치가 나왔습니다.
GPT 확인해보니 accuracy_score 점수가 f1_score 점수보다 높으면 과적합 문제가 있을 수도 있다고해서
확인을 해보니 과적합 문제는 아닌 것 같았습니다.
이후에 train['농약검출여부'].value_counts()를 해보니 클래스 불균형으로 판단을 했습니다.
(농약검출여부 = (2 : 1989, 0 : 1758, 1 : 253))
확인 후에 class_weight 하이퍼 파라미터를 추가했는데도 수치가 크게 달라지지 않더라구요.
f1 : 0.856 acc : 0.945 recall : 0.887
이런 경우에는 그냥 제출하는게 맞을까요 ?
지난 9회차 시험에 평가지표 수치가 높게 나오긴 했는데 만점은 받았거든요..
그래도 수치가 높으면 좀 불안하네요..
답변 2
0
기사 시험이 베이스 점수가 없고 데이터에 따라 너무 달라져요
0.6이 40점대였을 때도 있었고 0.9가 40점대였을 때도 있어서
이 숫자는 무의미 합니다.
첫 모델 만들고, 다른 모델 또는 개선된 전처리를 진행해보고 평가지표를 보고 판단 하시죠!
데이터 불균형과 관련해서는 잘 처리해 주시고 계세요 🙂
0
안녕하세요, 인프런 AI 인턴입니다. rokkk님.
클래스 불균형 문제에 대해 고민하고 계신 것 같은데, 기본적으로 랜덤 포레스트 모델에 class_weight='balanced'
옵션을 추가함으로써 클래스 불균형을 어느 정도 해결할 수 있습니다. 하지만, 이 추가적인 설정에도 불구하고 결과가 크게 변하지 않는 경우들이 종종 발생합니다. 이러한 이상적인 수치들이 꼭 문제가 되는 것은 아니지만 몇 가지 고려 사항을 공유 드립니다:
클래스 불균형 해결:
class_weight='balanced'
를 설정하여 대부분의 불균형 문제를 개선할 수 있지만, 이 외에도 샘플링 기법(SMOTE 등)을 사용할 수 있습니다.f1_score
, recall_score
등 불균형 데이터에 적합한 지표를 확인하는 것도 중요합니다.과적합 의심:
accuracy_score
가 불균형 데이터에 과적합될 가능성을 무시할 수 없으나, 이는 accuracy_score
보다 다양한 지표(f1, recall)와 함께 모델을 평가할 때 이러한 이슈를 줄일 수 있습니다.cross-validation
을 통해 모델의 일반화 성능을 사전 검증해보는 것도 도움이 됩니다.실제 시험 시 성능:
관련 자료:
모델 평가 지표에서 얻은 결과가 높은 점수를 받았다면, 큰 이슈 없이 제출해도 무방할 것으로 판단됩니다. 다만, 항상 데이터의 특성과 모델의 일반화 성능을 고려하여 평가하는 것이 중요합니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏 추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.