작성
·
180
0
안녕하세요!
캐글 T2-1에서 질문이 있어 문의드립니다.
배경 지식이 없다보니 캐글의 예시 답안만으로 이해가 안 돼서 강의 5-1과 5-2에서 풀이해 주신 방법을 따라하긴 했는데 결과를 어떻게 해석해야 할지 몰라 질문드립니다.ㅠㅠ
풀이 과정을 요약하자면 아래와 같습니다.
데이터 전처리 과정에서 결측치가 많은 컬럼은 삭제, 1개인 컬럼은 최빈값으로 채웠고, 고유값이 데이터 개수만큼 있는 컬럼은 삭제, object인 컬럼은 숫자형으로 바꿨습니다.
검증 데이터 분리하려고 했는데 X_train과 X_test에 타겟 컬럼이 없어서 분리하지 않았습니다.
모델은 랜덤포레스트를 사용했고 rf.score는 0.936 정도 나왔습니다.
정답 채점을 했을 때에는 0.731 정도 나왔습니다.
이때 rf.score 값은 클수록 좋은 것인가요?
또, 0.936과 0.731로 차이가 나는 것은 어떤 의미인지 궁금합니다.
(아래 코드는 제가 풀이한 내용입니다. 긴 글이라 정말 죄송하지만 작업형2를 처음 풀어봐서 이런 풀이가 맞는 방법인지 한번 확인 부탁드려도 될까요?ㅠㅠ)
항상 빠르고 친절한 답변 감사합니다!
[T2-1 풀이 과정] _ EDA 생략
# ## 불러오기
import pandas as pd
X_train.shape, X_test.shape, y_train.shape
# ## 데이터 전처리
# 결측치 처리
# X_train.isnull().sum() # age 137개, Cabin 542개, Embarked 1개
# X_test.isnull().sum() # age 40개, Cabin 145깨, Embarked 1개
# y_train.isnull().sum() # 0개
# 결측치가 있는 age와 Cabin은 삭제
print(X_train.shape, X_test.shape) # (712, 11) (179, 11)
cols1 = ['Age', 'Cabin']
X_train = X_train.drop(cols1, axis=1)
X_test = X_test.drop(cols1, axis=1)
print(X_train.shape, X_test.shape) # (712, 9) (179, 9)
# Embarked는 최빈값으로 채우기
print(X_train.isnull().sum(), X_test.isnull().sum()) # 1개
X_train['Embarked'] = X_train['Embarked'].fillna(X_train['Embarked'].mode()[0])
X_test['Embarked'] = X_test['Embarked'].fillna(X_test['Embarked'].mode()[0])
print(X_train.isnull().sum(), X_test.isnull().sum()) # 0개
# 고유값 개수 구하기
X_train.nunique() # Name, Ticket은 데이터 개수만큼 있으니까 삭제해도 될듯..?
cols2 = ['Name', 'Ticket']
# print(X_train.shape, X_test.shape) # (712, 9) (179, 9)
X_train = X_train.drop(cols2, axis=1)
X_test = X_test.drop(cols2, axis=1)
# print(X_train.shape, X_test.shape) # (712, 7) (179, 7)
# 최종 파일에서 쓸 PassengerId 따로 빼 놓기
# train에서는 더이상 필요 없으니까 삭제
X_train = X_train.drop(['PassengerId'], axis=1)
X_train.shape # (712, 6)
# test에서는 필요하니까 유지
X_test_id = X_test.pop('PassengerId')
X_test_id.shape, X_test.shape # ((179,), (179, 6))
# 라벨 인코딩으로 object를 모두 숫자로 변환
# X_train.info() # Sex, Embarked만 object
cols3 = ['Sex', 'Embarked']
from sklearn.preprocessing import LabelEncoder
for col in cols3:
le = LabelEncoder()
X_train[col] = le.fit_transform(X_train[col])
X_test[col] = le.transform(X_test[col])
X_train[cols3].head()
# ## 검증 데이터 분리
# X_train, X_test에 타겟인 Survived가 없어서 분리 필요 없음...?
Xtr = X_train
Xval = X_test
ytr = y_train['Survived']
Xtr.shape, Xval.shape, ytr.shape
# ## 모델 및 평가
from sklearn.ensemble import RandomForestClassifier
rf = RandomForestClassifier()
rf.fit(Xtr, ytr)
pred = rf.predict(Xval)
pred
# 평가
rf.score(Xtr, ytr) # 0.9367977528089888
# ## 제출
submit = pd.DataFrame({'PassengerId': X_test_id,
'Survived' : pred})
submit.to_csv("0000.csv", index=False)
# ## 채점
rf.score(Xval, y_test['Survived']) # 0.7318435754189944
답변 1
1
안녕하세요 최보윤 님, 인프런 AI 인턴이에요.
rf.score 값은 높을수록 모델의 예측력이 높다는 의미입니다. 따라서 0.936의 rf.score 값은 모델이 학습 데이터셋에 대해 약 93.6%의 정확도를 가지고 있다는 것을 의미합니다.
하지만, rf.score 값과 0.731의 채점 결과 값은 차이가 나는 것으로 보입니다. 이는 모델이 학습 데이터셋에 과적합되어 있을 수 있기 때문입니다. 즉, 학습 데이터셋에 대해서는 좋은 성능을 보여주지만 새로운 데이터인 검증 데이터셋에 대해서는 성능이 낮게 나타나는 것입니다.
이러한 경우 모델이 학습 데이터에 너무 꼭 맞게 학습되어서 새로운 데이터에 대한 일반화 능력이 떨어지는 것입니다. 이를 해결하기 위해서는 모델의 복잡성을 줄이거나, 데이터셋을 더 다양하게 수집하여 모델을 학습시키는 등의 방법을 고려해볼 수 있습니다.
피드백을 주신 코드를 확인해보니 별다른 문제 없이 수행되는 것 같습니다. 이와 관련된 추가적인 질문이 있다면 언제든지 물어보세요. 감사합니다!
상세한 답변 감사합니다!
한 가지 더 궁금한 게 있어 질문 드립니다.
시험 준비를 하는 다른 분들의 말을 들어보면 무조건 랜덤포레스트를 쓰는 것을 추천한다고 하더라고요!
하지만 모델에 따라 score 차이가 날테니 시험에서 여러 가지 모델을 해 보고 score가 가장 높은 것을 선택해야 하는 것일까요? 그런데 채점 결과를 미리 알 수 없으니 이것이 과적합인지 판단할 수도 없고... 어떻게 해야하는지 헷갈리는 것 같습니다.ㅠㅠ