본문 바로가기
인공지능/머신러닝

사이킷런으로 수행하는 타이타닉 생존자 예측

by bibibig_data 2021. 7. 8.

DACON - 주차 수요 예측  AI 경진대회

 

-----------------------------------------------------
> [예제] 사이킷런으로 수행하는 타이타닉 생존자 예측 <
-----------------------------------------------------

# Data Loading
# - 변수 설명 : https://computer-science-student.tistory.com/113
#
# Data Preprocessing
# - Null 처리
# - 불필요한 속성 제거
# - 인코딩 수행
#
# Model 학습 -> 예측 -> 평가 -> 최적화
# - Model 학습, 예측, 정확도 평가 : DecisionTreeClassifier, RandomForestClassifier, LogisticRegression
# - 교차검증으로 평가 : KFold Cross Validation
# - 교차검증으로 평가 : cross_val_score()
# - 하이퍼 파라미터 최적화 : GridSearchCV()

 

 

Titanic 생존자 예측

타이타닉 호 침몰 사건 당시의 사망자와 생존자를 구분하는 요인 분석을 통해, 승객들의 생존 여부를 예측

 

필요한 라이브러리 설치

In [1]:

# 데이터 불러오기 import pandas as pd import numpy as np import random as rnd

In [2]:

# 시각화 import seaborn as sns import matplotlib.pyplot as plt %matplotlib inline

In [3]:

# 머신러닝

from sklearn.linear_model import LogisticRegression

from sklearn.svm import SVC, LinearSVC

from sklearn.ensemble import RandomForestClassifier

from sklearn.neighbors import KNeighborsClassifier

from sklearn.naive_bayes import GaussianNB

from sklearn.linear_model import Perceptron

from sklearn.linear_model import SGDClassifier

from sklearn.tree import DecisionTreeClassifier

 

import warnings warnings.filterwarnings(action='ignore')

 

데이터 셋 불러오기

- train.csv : 모델 학습에 사용되는 데이터- test.csv : 모델 적용 대상이 되는 데이터

In [5]:

train_df=pd.read_csv("titanic/train.csv") test_df=pd.read_csv("titanic/test.csv") # 모델 적용의 일관성을 위해, # train과 test를 합한 combine 데이터 셋도 지정 combine=[train_df,test_df]

 

데이터 변수(Feature) 확인

In [6]:

# 변수 보기 print(train_df.columns.values)

 

['PassengerId' 'Survived' 'Pclass' 'Name' 'Sex' 'Age' 'SibSp' 'Parch' 'Ticket' 'Fare' 'Cabin' 'Embarked']

 

변수설명

PassengerId : 각 승객의 고유 번호

Survived : 생존 여부(종속 변수)

  • 0 = 사망
  • 1 = 생존

Pclass : 객실 등급 - 승객의 사회적, 경제적 지위

  • 1st = Upper
  • 2nd = Middle
  • 3rd = Lower

Name : 이름

Sex : 성별

Age : 나이

SibSp : 동반한 Sibling(형제자매)와 Spouse(배우자)의 수

Parch : 동반한 Parent(부모) Child(자식)의 수

Ticket : 티켓의 고유넘버

Fare : 티켓의 요금

Cabin : 객실 번호

Embarked : 승선한 항

  • C = Cherbourg
  • Q = Queenstown
  • S = Southampton

 


 

 

# Data Loading
# - 변수 설명 : https://computer-science-student.tistory.com/113
#
# Data Preprocessing
# - Null 처리
# - 불필요한 속성 제거
# - 인코딩 수행
#
# Model 학습 -> 예측 -> 평가 -> 최적화
# - Model 학습, 예측, 정확도 평가 : DecisionTreeClassifier, RandomForestClassifier, LogisticRegression
# - 교차검증으로 평가 : KFold Cross Validation
# - 교차검증으로 평가 : cross_val_score()
# - 하이퍼 파라미터 최적화 : GridSearchCV()


### 모듈, 함수, 클래스 임포트

import numpy as np
import pandas as pd
import matplotlib.pyplot as plt
import seaborn as sns

from sklearn import preprocessing
from sklearn.preprocessing import LabelEncoder

from sklearn.linear_model import LogisticRegression
from sklearn.ensemble import RandomForestClassifier
from sklearn.tree import DecisionTreeClassifier

from sklearn.metrics import accuracy_score

from sklearn.model_selection import train_test_split
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import GridSearchCV


### 데이터 로딩한 뒤 Null 값 처리

# 데이터 로딩
titanic_df = pd.read_csv("D://pythonclass//train.csv")

# 로딩된 데이터 확인
titanic_df.head(3)

# train 데이터셋 정보 확인
titanic_df.info()

# Age, Cabin, Embarked 컬럼의 Null 값 처리
titanic_df['Age'].fillna(titanic_df['Age'].mean(), inplace=True) # 비어있는 age에 평균을 넣음
titanic_df['Cabin'].fillna('N', inplace=True) # null에 N 넣음
titanic_df['Embarked'].fillna('N', inplace=True) # null에 N 넣음

# 데이터셋 전체 Null 값 갯수 확인
titanic_df.isnull()
titanic_df.isnull().sum()
titanic_df.isnull().sum().sum() # 전체의 null값 확인


### 탐색적 데이터 분석

titanic_df['Sex'].value_counts()  # 성별 카운트
titanic_df['Cabin'].value_counts()  # 선실 번호별 카운트
titanic_df['Embarked'].value_counts()  # 중간 정착 항구별 카운트

# 선실 등급을 나타내는 첫번째 알파벳 자르기
titanic_df['Cabin'] = titanic_df['Cabin'].str[:1] # 등급의 첫글자만 추출
titanic_df['Cabin'].head(3)

# 성별 생존자별 카운트
titanic_df.groupby(['Sex', 'Survived'])['Survived'].count() # 성별과 생존자별 빈도 수 출력

# 성별 생존 확률을 그래프로 표현
sns.barplot(x='Sex', y='Survived', data=titanic_df) # 여성과 남성의 생존자 수 막대그래프 비교

# 객실등급별 성별 생존 확률을 그래프로 표현
sns.barplot(x='Pclass', y='Survived', hue='Sex', data=titanic_df) # 등급별 생존률 비교

# age에 따른 생존 확율을 확인하기 위해 age 컬럼의 값을
# 명목형으로 binning하기 위한 함수 생성
def get_category(age):
    cat = ''
    if age <= -1:
        cat = 'Unknown'
    elif age <= 5:
        cat = 'Baby'
    elif age <= 12:
        cat = 'Child'
    elif age <= 18:
        cat = 'Teenager'
    elif age <= 25:
        cat = 'Student'
    elif age <= 35:
        cat = 'Young Adult'
    elif age <= 60:
        cat = 'Adult'
    else:
        cat = 'Elderly'

    return cat

# X축의 값을 순차적으로 표시하기 위한 설정
group_names = ['Unknown', 'Baby', 'Child', 'Teenager', 'Student', 'Young Adult', 'Adult', 'Elderly']

# get_category(X)는 입력값으로 'Age' 컬럼값을 받아서 해당하는 cat 반환
titanic_df['Age_cat'] = titanic_df['Age'].apply(lambda x: get_category(x))

titanic_df.info()

# 막대그래프의 크기 figure를 더 크게 설정
plt.figure(figsize=(10, 6))

sns.barplot(x='Age_cat', y='Survived', hue='Sex', data=titanic_df, order=group_names)

titanic_df.drop('Age_cat', axis=1, inplace=True)


### 데이터 전처리에 사용할 사용자 정의 함수들 생성

# Null 처리 함수
def fillna(df):
    df['Age'].fillna(df['Age'].mean(), inplace=True)
    df['Cabin'].fillna('N', inplace=True)
    df['Embarked'].fillna('N', inplace=True)
    df['Fare'].fillna(0, inplace=True)
    return df


# 머신러닝 알고리즘에 불필요한 속성 제거
def drop_features(df):
    df.drop(['PassengerId', 'Name', 'Ticket'], axis=1, inplace=True)
    return df


# 문자열 값을 숫자형 값으 Encoding하는 함수
def format_features(df):
    df['Cabin'] = df['Cabin'].str[:1]
    features = ['Cabin', 'Sex', 'Embarked']
    for feature in features:
        le = LabelEncoder()
        le = le.fit(df[feature])
        df[feature] = le.transform(df[feature])
    return df


# 앞에서 설정한 Data Preprocessing 함수들을 호출하는 함수
def transform_features(df):
    df = fillna(df)
    df = drop_features(df)
    df = format_features(df)
    return df


### 원본 데이터를 재로딩

# 데이터 로딩
titanic_df = pd.read_csv("D://pythonclass//train.csv")

# feature 데이터 셋과 Label 데이터 셋 분리
y_titanic_df = titanic_df['Survived']
X_titanic_df = titanic_df.drop('Survived', axis=1)
X_titanic_df = transform_features(X_titanic_df)

# Training set과 Testing set 분리
X_train, X_test, y_train, y_test = train_test_split(X_titanic_df, y_titanic_df, test_size=0.2, random_state=11)

# Decision Tree, Random Forest, Logistic Regression을 적용하기 위한 Classifier 생성
dt_clf = DecisionTreeClassifier(random_state=11)
rf_clf = RandomForestClassifier(random_state=11)
lr_clf = LogisticRegression()

# DecisionTreeClassifier 학습/예측/평가
dt_clf.fit(X_train, y_train)
dt_pred = dt_clf.predict(X_test)
print('DecisionTreeClassifier 정확도: {0:.4f}'.format(accuracy_score(y_test, dt_pred)))

# RandomForestClassifier 학습/예측/평가
rf_clf.fit(X_train, y_train)
rf_pred = rf_clf.predict(X_test)
print('RandomForestClassifier 정확도:{0:.4f}'.format(accuracy_score(y_test, rf_pred)))

# LogisticRegression 학습/예측/평가
lr_clf.fit(X_train, y_train)
lr_pred = lr_clf.predict(X_test)
print('LogisticRegression 정확도: {0:.4f}'.format(accuracy_score(y_test, lr_pred)))

### Cross Validation

def exec_kfold(clf, folds=5):
    # 폴드 세트를 5개인 KFold객체를 생성, 폴드 수만큼 예측결과 저장을 위한 리스트 객체 생성.
    kfold = KFold(n_splits=folds)
    scores = []

    # KFold 교차 검증 수행.
    for iter_count, (train_index, test_index) in enumerate(kfold.split(X_titanic_df)):
        # X_titanic_df 데이터에서 교차 검증별로 학습과 검증 데이터를 가리키는 index 생성
        X_train, X_test = X_titanic_df.values[train_index], X_titanic_df.values[test_index]
        y_train, y_test = y_titanic_df.values[train_index], y_titanic_df.values[test_index]

        # Classifier 학습, 예측, 정확도 계산
        clf.fit(X_train, y_train)
        predictions = clf.predict(X_test)
        accuracy = accuracy_score(y_test, predictions)
        scores.append(accuracy)
        print("교차 검증 {0} 정확도: {1:.4f}".format(iter_count, accuracy))

    # 5개 fold에서의 평균 정확도 계산.
    mean_score = np.mean(scores)
    print("평균 정확도: {0:.4f}".format(mean_score))

# exec_kfold 호출
exec_kfold(dt_clf, folds=5)

scores = cross_val_score(dt_clf, X_titanic_df, y_titanic_df, cv=5)

for iter_count, accuracy in enumerate(scores):
    print("교차 검증 {0} 정확도: {1:.4f}".format(iter_count, accuracy))

print("평균 정확도: {0:.4f}".format(np.mean(scores)))


parameters = {'max_depth': [2, 3, 5, 10],
              'min_samples_split': [2, 3, 5],
              'min_samples_leaf': [1, 5, 8]}

grid_dclf = GridSearchCV(dt_clf,
                         param_grid=parameters,
                         scoring='accuracy',
                         cv=5)

grid_dclf.fit(X_train, y_train)

print('GridSearchCV 최적 하이퍼 파라미터 :', grid_dclf.best_params_)
print('GridSearchCV 최고 정확도: {0:.4f}'.format(grid_dclf.best_score_))
best_dclf = grid_dclf.best_estimator_

# GridSearchCV의 최적 하이퍼 파라미터로 학습된 Estimator로 예측 및 평가 수행.
dpredictions = best_dclf.predict(X_test)
accuracy = accuracy_score(y_test, dpredictions)

print('테스트 세트에서의 DecisionTreeClassifier 정확도 : {0:.4f}'.format(accuracy))

'인공지능 > 머신러닝' 카테고리의 다른 글

Regularization 관련 유튜브 영상  (0) 2021.07.11
데이터 전처리, 릿지, 라쏘, 선형회귀,SST  (0) 2021.07.09
sklearn.model  (0) 2021.07.08
Scikit-Learn  (0) 2021.07.08
Sclkit - Learn을 이용 군집  (0) 2021.07.07