👨‍💼

2.8 타이타닉 Tensorflow

1. 필요 라이브러리 불러오기

분석을 시작하기 전에 필요한 라이브러리를 불러옵니다.
import pandas as pd import numpy as np import matplotlib.pyplot as plt import seaborn as sns from tensorflow import keras import os %matplotlib inline

2. 데이터 불러오기

타이타닉 분석에 필요한 Train 데이터와 Test 데이터를 다음과 같이 불러옵니다.

1) 데이터 불러오기

분석용 데이터는 train_df 테스트 데이터는 test_df로 정의합니다. 향후 test 데이터셋을 위해 predId를 먼저 만들어 놓습니다.
train_df = pd.read_csv('../Downloads/titanic/train.csv') train_df.info()
test_df = pd.read_csv('../Downloads/titanic/test.csv') test_df.info() predId = test_df['PassengerId']

2) 데이터 전처리

2-1 불필요한 데이터 제외

불러온 데이터 중에서 Name, Cabin PassengerId, Ticket를 제외합니다. Train, Test 데이터셋 둘다 동일하게 적용합니다.
train_df = train_df.drop('Name', axis=1) train_df = train_df.drop('Cabin', axis=1) train_df = train_df.drop('PassengerId', axis=1) train_df = train_df.drop('Ticket', axis=1) test_df = test_df.drop('Name', axis=1) test_df = test_df.drop('Cabin', axis=1) test_df = test_df.drop('PassengerId', axis=1) test_df = test_df.drop('Ticket', axis=1)

2-2 Age

Age는 결측값에 평균값을 적용하여 전처리를 합니다.
train_df['Age'] = train_df['Age'].fillna(train_df['Age'].mean()) test_df['Age'] = test_df['Age'].fillna(test_df['Age'].mean())

2-3 Embarked

Embark에는 어떤값이 있나 확인해볼까요?
train_df['Embarked'].unique() test_df['Embarked'].unique()
전에 했던 분석과 동일하게 Embarked는 결측값에 S를 적용하여 전처리를 합니다.
train_df['Embarked'] = train_df['Embarked'].fillna('S') test_df['Embarked'] = test_df['Embarked'].fillna('S')
이제 Missing 값이 다 처리가 된 것을 확인 할 수 있습니다.
train_df.info() test_df.info()
S는 1 C는 2 Q는 3으로 변환합니다.
train_df['Embarked'].replace({'S':1,'C':2,'Q':3} , inplace =True) test_df['Embarked'].replace({'S':1,'C':2,'Q':3} , inplace =True)
이제 변환된 값을 확인할 수 있습니다. 데이터 타입도 object 에서 int 64로 변경되었습니다.
train_df['Embarked'].unique() test_df['Embarked'].unique()

2-4 Sex

Sex 변수는 숫자형으로 변환하기 위해 male을 1 female을 2로 전처리합니다.
train_df['Sex'].replace({'male':1,'female':2} , inplace =True) test_df['Sex'].replace({'male':1,'female':2} , inplace =True)

2-5 Fare(Test 데이터)

test 데이터에서 Fare가 missing값이 있으므로 평균값으로 전처리합니다.
test_df['Fare'] = test_df['Fare'].fillna(test_df['Fare'].mean())
변수에 대한 처리가 모두 끝났습니다. 이제 모델을 만들어봅시다.

3. 모델링

1) 입력변수, 타겟변수 분리

train_x은 입력변수, train_y는 타겟변수로 지정합니다.
train_x = train_df.drop('Survived', axis = 1) train_y = train_df['Survived']

2) 딥러닝 모델 구축 - Tensorflow(Keras) 활용

model을 구축합니다. keras.Sequential()을 사용하여 초기 모델을 구축합니다.
Sequential 모델의 특징은 계층을 선형으로 쌓은겁니다.
model = keras.Sequential()
먼저 InputLayer를 첫번째 층으로 추가하면서 첫번째 레이어 유닛 갯수를 정해줍니다. 그다음 Dense(완전연결계층)을 이용하여 총 24개의 두번째 은닉층을 추가합니다. Dense 레이어는 입력과 출력을 모두 연결시키며, 각각 가중치를 포함하고 있습니다.
이진분류를 수행하려면 마지막 Dense층이 하나의 유닛을 가져야하고 시그모이드 활성화 함수를 사용해야합니다.
model.compile은 모델을 훈련하기 전에 몇가지 설정하는 단계입니다. Optimizer는 데이터와 손실함수를 바탕으로 모델의 업데이트 방법을 결정합니다. Loss는 손실함수로 훈련하는 동안 모델의 오차를 측정하는 방법입니다. 모델의 학습이 올바르게 되도록 최소화 하는 방안입니다. 마지막으로 Metric는 Train과 Test 데이터셋의 검증방법입니다. 여기서는 분류 정확도를 위해 accuracy를 사용합니다.
model.summary()는 생성된 모델을 요약하는 함수입니다.
이제 실행해봅시다.
model.add(keras.layers.InputLayer(input_shape=(7))) model.add(keras.layers.Dense(24, activation='relu')) model.add(keras.layers.Dense(1, activation='sigmoid')) model.compile(optimizer='adam', loss=keras.losses.binary_crossentropy, metrics=['accuracy']) model.summary()
이제 모델을 생성했으니 훈련을 시켜봅시다. 입력데이터 train_x와 출력데이터인 train_y를 인자로 넣고 epochs = 100 100번 훈련시킨다는 의미입니다. batch_size는 작업단위를 의미합니다.
epochs = 100 history = model.fit(x=train_x, y=train_y, batch_size=32, epochs=epochs, validation_split=0.1)
이제 그래프를 그려 구축된 모델의 정확도를 확인해봅시다.
loss = history.history['loss'] acc = history.history['accuracy'] val_loss = history.history['val_loss'] val_acc = history.history['val_accuracy']
plt.figure(figsize=(16, 8)) plt.subplot(1, 2, 1) plt.plot(range(epochs), acc, label='Train acc') plt.plot(range(epochs), val_acc, label='Val acc') plt.legend(loc='lower right') plt.title('Train and Val accuracy') plt.subplot(1, 2, 2) plt.plot(range(epochs), loss, label='Train loss') plt.plot(range(epochs), val_loss, label='Val loss') plt.legend(loc='lower right') plt.title('Train and Val loss') plt.show()
그림과 같이 모델이 학습을 진행할 수록 정확도가 높아지고, 손실은 지속적으로 줄어드는것을 확인할 수 있습니다.
notion imagenotion image

3) 결과 정리

먼저 모델을 저장합시다.
model.save('model_v1.h5')
이제 만들어진 모델에 test 데이터를 적합해봅시다.
pred_y = model.predict_classes(test_df) pred_y = pred_y.astype(int) pred_y = pd.Series(map(lambda x: x[0], pred_y))
pd.DataFrame을 활용하여 Kaggle에 제출할 최종 파일을 만들고 확인해봅시다.
predDf = pd.DataFrame( {'PassengerId': predId, 'Survived': pred_y}) print('Test result preview:', predDf.head())
CSV파일을 생성하여 캐글에 제출할 준비를 마칩니다. 이제 분석이 완료되었습니다. 결과를 확인해봅시다.
predDf.to_csv('pred_v1.csv')
다음과 같이 캐글에 제출한 결과는 0.73684로 초기 모델로는 괜찮은 성능을 나타냈습니다. 여기서는 텐서플로를 이용한 딥러닝 방법을 적용한 것에 의의를 두고 분석을 마치도록 하겠습니다.
notion imagenotion image