본문 바로가기
DataScience/머신러닝

머신러닝 :: 이진 논리회귀(Logistic Regression)_캐글(Kaggle) 타이타닉 생존자 예측

by 올커 2022. 10. 12.

머신러닝 이진 논리회귀_캐글(Kaggle) 타이타닉 생존자 예측


1. 이진 논리회귀(Binary Logistic Regression)

  ※ 타이타닉 생존자 예측하기

1) 데이터 다운로드

 · 캐글(Kagge) 사용자 API 정보 입력

import os
os.environ['KAGGLE_USERNAME'] = 'username' # username
os.environ['KAGGLE_KEY'] = 'key' # key

 · 데이터 다운로드

!kaggle datasets download -d heptapod/titanic
!unzip titanic.zip

 

2) 필요한 패키지 임포트

from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense
from tensorflow.keras.optimizers import Adam, SGD
import numpy as np
import pandas as pd
import matplotlib.pyplot as plt 
import seaborn as sns
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler

 

3) 데이터 로드

df = pd.read_csv('train_and_test2.csv')

df.head(5)

4) 데이터 전처리

 · 사용할 컬럼 추출

df = pd.read_csv('train_and_test2.csv', usecols=[
  'Age', # 나이
  'Fare', # 승차 요금
  'Sex', # 성별
  'sibsp', # 타이타닉에 탑승한 형제자매, 배우자의 수
  'Parch', # 타이타니게 탑승한 부모, 자식의 수
  'Pclass', # 티켓 등급 (1, 2, 3등석)
  'Embarked', # 탑승국
  '2urvived' # 생존 여부 (0: 사망, 1: 생존)
])

 · 간단하게 데이터셋 미리보기

sns.countplot(x='Sex', hue='2urvived', data=df)

 · 생존여부 클래스의 개수 확인

sns.countplot(x=df['2urvived'])

 · 비어있는 행 삭제

   : null 또는 na 값이 있는지 확인하고 비어있는 값을 포함한 행을 제거한다. (df.dropna())

print(df.isnull().sum())

print(len(df))

df = df.dropna()

print(len(df))


"""
1309
1307
"""

# 빈 행이 2개 지워졌다.

 

 

 · x_data, y_data 분할

x_data = df.drop(columns=['2urvived'], axis=1)
x_data = x_data.astype(np.float32)

y_data = df[['2urvived']]
y_data = y_data.astype(np.float32)

 

 · 표준화(Standardize) : 평균을 0으로, 표준편차를 1으로 맞춘다!

   ※ 참고 : https://scikit-learn.org/stable/modules/generated/sklearn.preprocessing.StandardScaler.html

   z = (x - u) / s

   z = (x - 평균) / 표준편차

 

  표준화 : scaler에서 fit_transform이라는 메서드 호출

  표준화를 할 데이터는 단위가 다른 x데이터만 진행한다.

scaler = StandardScaler()
x_data_scaled = scaler.fit_transform(x_data)

print(x_data.values[0])
print(x_data_scaled[0])

 

 · 학습 데이터, 검증 데이터 분할

x_train, x_val, y_train, y_val = train_test_split(x_data, y_data, test_size=0.2, random_state=2021)

print(x_train.shape, x_val.shape)
print(y_train.shape, y_val.shape)

"""
(1045, 7) (262, 7)
(1045, 1) (262, 1)
"""

 

5) 모델 학습시키기

  logistic regression에서는 sigmoid function을 사용하기 때문에 Dense의 activations='sigmoid'를 추가한다. 

  이진 논리회귀이기 때문에 model.complile의 loss에는 binary_crossentropy를 지정한다.

   metrics은 loss값만 보고는 얼마나 학습되었는지 알기 어렵기 때문에 주어진다. metrics='acc'로 넣어준다.(*acc = accuracy, 정확도를 0에서 1사이로 나타내주는 지표. 1에 가까울수록 100%)

model = Sequential([
  Dense(1, activation='sigmoid')
])

model.compile(loss='binary_crossentropy', optimizer=Adam(lr=0.01), metrics=['acc'])

model.fit(
    x_train,
    y_train,
    validation_data=(x_val, y_val), # 검증 데이터를 넣어주면 한 epoch이 끝날때마다 자동으로 검증
    epochs=20 # epochs 복수형으로 쓰기!
)

 

  결과적으로 val_acc(정확도)가 78.6%를 갖는 모델을 만들게 된다.

 

 

 

 

반응형

댓글