본문 바로가기
머신러닝

타이타닉 생존자 예측_머신러닝

by 미생22 2024. 2. 26.
728x90

2. 머신러닝

2-1. 머신러닝을 위한 구조 짜기

이제 진짜 머신러닝을 할 차례입니다. 생존자 예측을 위해 간단히 구조를 확인해보겠습니다.

titanic.info()

pclass, sex, age, fare, sibsp(부모형제), parch(자녀) 이런걸 볼 예정입니다

우선 머신러닝을 하기 위해서는 column들이 숫자여야 하는데 보면, sex가 object로 되어있는 걸 확인할 수 있습니다.
머신러닝을 쓰기 위해서 성별을 숫자로 바꾸는 작업이 필요합니다.
이럴 때 Label Encode를 사용하면 편리합니다.

 

from sklearn.preprocessing import LabelEncoder

le = LabelEncoder() #Label encoder를 instanciation 시키고,
le.fit(titanic['sex']) #fit을 시킵니다. 무엇을? 타이타닉 승객의 성별을.

 

이제 LabelEncoder에 titanic['sex']가 들어있습니다. 확인해보겠습니다.

 

le.classes_

 

 

네 여기에는 female과 male이 있다고 알려주네요.

 

fit까지 했으니까 gender라는 column을 만들어주겠습니다.
le의 transform을 통해 0,1,2,...로 labeling 시켜주겠습니다.

 

titanic['gender'] = le.transform(titanic['sex'])
titanic.head()

 

info()를 다시 보겠습니다.

 

titanic.info()

 

1309개의 데이터가 있어야 하는데 사용해야할 컬럼들 중 age, fare에서 결측치가 있는 걸 확인할 수 있습니다.
이렇게 결측치가 있는 행은 그냥 버리도록 하겠습니다.

 

titanic = titanic[titanic['age'].notnull()]
titanic = titanic[titanic['fare'].notnull()]
titanic.info()

 

이러면 1045개로 데이터가 줄어들지만 결측치는 사라집니다.

 

corr() 함수를 통해 상관관계를 확인해보겠습니다. 생존율에 얼마나 영향을 미치는지 알 수 있는 함수를 사용할겁니다.

correlation_matrix = titanic.corr().round(1)
correlation_matrix

 

survived 열만 보겠습니다. (-)는 음의 상관관계를 나타내는 걸 나타내므로 pclass가 낮을수록 생존율이 높았으니 (-)가 나오는게 맞습니다.
0은 상관관계가 거의 안보인다라고 보면 됩니다.

 

이를 heatmap으로 보겠습니다.

 

sns.heatmap(data=correlation_matrix, annot=True, cmap='bwr')

 

이제 앞서서 iris에서 배운걸 적용해서 특성을 선택하고 데이터를 나눠보겠습니다.

 

2-2. 데이터 나누고 학습/예측

이전 iris 시간에 배운 train_test_split 모듈을 활용해 학습데이터와 예측데이터를 나누겠습니다. 기억해야 할 것은 데이터를 나누는 이유가 과적합을 방지하기 위한 것이라는 겁니다.

from sklearn.model_selection import train_test_split

X = titanic[['pclass', 'age', 'sibsp', 'parch', 'fare', 'gender']]
y = titanic['survived']

X_train, X_test, y_train, y_test = train_test_split(X, y,
                                                    test_size=0.2,
                                                    random_state=13)

 

train 시키겠습니다. accuracy score도 같이 불러오겠습니다.

 

from sklearn.tree import DecisionTreeClassifier
from sklearn.metrics import accuracy_score

dt = DecisionTreeClassifier(max_depth=4, random_state=13)
dt.fit(X_train, y_train)

 

예측해보겠습니다.

 

pred = dt.predict(X_test)
print(accuracy_score(y_test, pred))

 

76%의 성능을 가진 상태입니다.

이제 디카프리오는 정말 살 수 없었나를 확인해보겠습니다.

2-3. 디카프리오 생존율 예측하기

 

디카프리오라는 새로운 array를 특정지어야 합니다.

 

import numpy as np

# [['pclass', 'age', 'sibsp', 'parch'#자녀, 'fare', 'gender']]
dicaprio = np.array([[3, 18, 0, 0, 5, 1]])

#이제 dicaprio를 특정지은 상황입니다.

print('Dicaprio : ',dt.predict_proba(dicaprio))

결과가 두 개가 나왔는데 이는 생존하지 못할 확률, 생존할 확률이므로 결과적으로는 [0, 1]을 씌워줘야 생존율이 나옵니다.

 

print('Dicaprio : ',dt.predict_proba(dicaprio)[0, 1])

 

16.7%의 생존율을 보입니다. random성이 있기 때문에 대략 20%를 보이는 것을 알 수 있습니다.

#winslet의 데이터도 살펴보겠습니다.

 

winslet = np.array([[1, 16, 1, 1, 100, 0]])
print('Winslet : ', dt.predict_proba(winslet)[0, 1])

100%의 생존율을 보입니다... 영화는 머신러닝에 맞는 결과를 보였던 것 같습니다.

 


*. 새로배운 모듈/함수 목록

 

sklearn.preprocessing LabelEncoder

pd.corr()

sns.heatmap()

728x90