강의

멘토링

로드맵

인프런 커뮤니티 질문&답변

최보윤님의 프로필 이미지
최보윤

작성한 질문수

[질문] 캐글 T2-1 질문드립니다!

작성

·

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가 가장 높은 것을 선택해야 하는 것일까요? 그런데 채점 결과를 미리 알 수 없으니 이것이 과적합인지 판단할 수도 없고... 어떻게 해야하는지 헷갈리는 것 같습니다.ㅠㅠ

최보윤님의 프로필 이미지
최보윤

작성한 질문수

질문하기