Titanic 문제 - 결측값, 랜덤 포레스트

1 minute read

결측값(Missing Value)이란?

결측값은 측정한 값이 없다는 것이다.
결측값을 삭제하거나, 대체함으로써 처리한다.

결측값 찾기

train.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 891 entries, 0 to 890
Data columns (total 12 columns):
PassengerId    891 non-null int64
Survived       891 non-null int64
Pclass         891 non-null int64
Name           891 non-null object
Sex            891 non-null object
Age            714 non-null float64
SibSp          891 non-null int64
Parch          891 non-null int64
Ticket         891 non-null object
Fare           891 non-null float64
Cabin          204 non-null object
Embarked       889 non-null object
dtypes: float64(2), int64(5), object(5)
memory usage: 83.7+ KB

pandas.DataFrame.info()는 DataFrame의 간단한 요약을 보여준다.
train의 891개 데이터 중 Age, Cabin, Embarked에 결측값이 존재한다.

test.info()
<class 'pandas.core.frame.DataFrame'>
RangeIndex: 418 entries, 0 to 417
Data columns (total 11 columns):
PassengerId    418 non-null int64
Pclass         418 non-null int64
Name           418 non-null object
Sex            418 non-null object
Age            332 non-null float64
SibSp          418 non-null int64
Parch          418 non-null int64
Ticket         418 non-null object
Fare           417 non-null float64
Cabin          91 non-null object
Embarked       418 non-null object
dtypes: float64(2), int64(4), object(5)
memory usage: 36.0+ KB

test의 418개 데이터 중 Age, Fare, Cabin에 결측값이 존재한다.

결측값 삭제

train = train.drop(['Name', 'Age', 'Cabin', 'Ticket', 'Fare'], axis=1)
test = test.drop(['Name', 'Age', 'Cabin', 'Ticket', 'Fare'], axis=1)

결측값이 존재하는 Age, Cabin, Fare를 삭제하였다.
Name, Ticket은 분석에 사용하지 않을 것이라 삭제하였다.

결측값 대체

train['Embarked'].value_counts()
S    644
C    168
Q     77
Name: Embarked, dtype: int64

train 데이터 중 Embarked의 값이 null인 경우는 2건이 존재한다.
결측값을 가장 많은 빈도의 값으로 대체한다.

train.loc[train['Embarked'].isnull(), 'Embarked'] = 'S'

랜덤 포레스트 적용

데이터 전처리

train['Embarked'] = train['Embarked'].map({'S':0, 'C':1, 'Q':2})
test['Embarked'] = test['Embarked'].map({'S':0, 'C':1, 'Q':2})
train['Sex'] = train['Sex'].map({'male':0, 'female':1})
test['Sex'] = test['Sex'].map({'male':0, 'female':1})

문자열 데이터를 정수형 데이터로 변환하였다.

train_x = train.drop(['PassengerId', 'Survived'], axis=1)
train_y = train['Survived']
test_x = test.drop('PassengerId', axis=1)

Pclass, Sex, SibSp, Parch, Embarked을 입력으로 받아 Survived를 예측하게 된다.

랜덤 포레스트

from sklearn.ensemble import RandomForestClassifier

rf = RandomForestClassifier()
rf.fit(train_x, train_y)
test_y = rf.predict(test_x)

train_x, train_y를 이용하여 학습한 후, test_x에 대해서 예측한다.

제출 데이터 생성

submission = pd.DataFrame({
    'PassengerId' : test['PassengerId'],
    'Survived' : test_y
})
submission.to_csv('rf.csv', index=None)

제출

0.75119점으로 성별만 이용하여 예측하는 것보다 1%p 낮은 결과를 얻었다.
데이터 처리나, 학습 방법을 조정하지 않으면 단순 예측보다 낮은 성능을 얻을 수도 있다.

정리

  • 결측값을 찾고 기초적으로 처리하는 방법을 배웠다.
  • random forest를 간단히 사용하는 법을 배웠다.

Categories:

Updated:

Comments