해결된 질문
작성
·
41
0
import pandas as pd
train = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p2/heart/2files/train.csv")
test = pd.read_csv("https://raw.githubusercontent.com/lovedlim/inf/main/p2/heart/2files/test.csv")
# train = pd.read_csv("train.csv")
# test = pd.read_csv("test.csv")
train.info()
train.describe()
test.info()
train.isnull().sum()
y_train = train.pop('output')
#원-핫 인코딩
train_oh = pd.get_dummies(train)
test_oh = pd.get_dummies(test)
data = pd.concat([train,test],axis=0)
data_oh = pd.get_dummies(data)
train_oh=data_oh.iloc[:len(train)]
test_oh=data_oh.iloc[len(train):]
#데이터 분리
from sklearn.model_selection import train_test_split
X_tr,X_val,y_tr,y_val=train_test_split(train_oh,y_train,test_size=0.15,random_state=0)
print(X_tr.shape,X_val.shape,y_tr.shape,y_val.shape)
from sklearn.ensemble import RandomForestClassifier
from sklearn.metrics import roc_auc_score, f1_score, accuracy_score
rf = RandomForestClassifier(random_state=2022, max_depth=5, n_estimators=400)
rf.fit(X_tr, y_tr)
pred = rf.predict(X_val)
pred_proba = rf.predict_proba(X_val)
print(roc_auc_score(y_val, pred_proba[:,1]))
print(f1_score(y_val, pred))
print(accuracy_score(y_val, pred))
이 코드를 여기까지 실행했을때 위의 사진처럼 과적합이 발생한거 같은데 무엇을 조정하면 좋을지잘 모르겠습니다. 그리고 id컬럼은 삭제를 안하고 진행을 해왔는데요! 이 영향때문에 과적합이 나오는 것인지 궁금합니다
답변 3
0
이 문제는 데이터가 단순해서 생긴 결과일 가능성이 큽니다 :)
지수님이 잘못한 부분은 전혀 없습니다!
ID 컬럼이 과적합에 크게 영향을 주지는 않아요.
랜덤포레스트는 해당 변수의 중요도를 낮게 평가하는 경향이 있습니다.
0
from sklearn.ensemble import RandomForestClassifier
rf=RandomForestClassifier(random_state=0)
rf.fit(X_tr,y_tr)
pred=rf.predict_proba(test_oh)[:,1]
print(pred)
submit = pd.DataFrame({
'id':test['id'],
'output':pred
})
submit.to_csv("20250614.csv",index=False)
print(pd.read_csv("20250614.csv"))
0
안녕하세요, 인프런 AI 인턴입니다. 김지수님.
과적합 문제와 관련하여 질문을 주셨네요. 과적합은 주로 모델이 훈련 데이터에 너무 잘 맞추어서 검증 데이터에 대한 예측 성능이 떨어지는 현상입니다. 이를 방지하기 위해 몇 가지 조치를 고려할 수 있습니다.
특성 선택 및 중요도 분석:
id
와 같은 비관련 변수를 포함하고 있다면, 이것이 과적합을 유발할 가능성이 있습니다. 일반적으로 id
는 예측과 무관한 변수이므로 모델에 영향을 주지 않게 제거하는 것이 좋습니다.모델 복잡도 감소:
max_depth
를 줄여 모델의 복잡도를 낮추거나, n_estimators
값을 줄여 모델의 복잡성을 줄일 수 있습니다. 현재 max_depth=5
와 n_estimators=400
을 사용하고 있는데, 이미 상당히 낮은 깊이라서 다른 하이퍼파라미터를 조정할 수 있습니다.더 많은 데이터 사용:
Cross-validation 사용:
train_test_split
대신 교차 검증(cross_val_score
)을 사용하여 모델의 성능을 검증할 수 있습니다.정규화 및 데이터 스케일링:
관련된 문제와 해결 방법을 다루고 있는 유사한 질문 링크를 아래에 첨부드립니다:
위의 방법들을 통해 모델의 과적합을 줄여보시기 바랍니다. 데이터 전처리와 모델 구축에서 중앙 특성의 사용을 줄임으로써 모델 일반화를 향상시킬 수 있습니다.
저는 질문자님의 이해를 돕고자 지식공유자님의 기존 답변을 참고하여 유사한 답변 링크를 추천해드리고 있습니다.
현재 베타 기능으로 답변이 만족스럽지 않을 수 있는 점 양해 부탁드립니다. 🙏
추가적으로 궁금한 점이 있으시면, 이어서 질문해 주세요. 곧 지식공유자께서 답변해 주실 것입니다.