티스토리 뷰

※데이터 전처리는 이전 포스팅에 개재

2019/05/06 - [데이터분석/분석 연습] - Kaggle 캐글 연습#1_Titanic 타이타닉 생존자 예측_1/2

  1. 데이터 전처리

    • 데이터 준비

    • 데이터 변수(feature)확인

    • 탐색적 데이터 분석(EDA)

    • Feature Engineering 

  2. 예측 모델 구축 및 적용

  3. 모델 평가

이번 포스팅에서는 예측 모델 적용과 평가를 진행하도록 하겠습니다.

 

2. 예측 모델 구축 및 적용 

 

타이타닉 데이터 분석의 목적은 "승객들의 생존 여부 예측"으로, 

1. Classification(분류) : 생존 or 사망

2. Regression(회귀) : 변수 간 선형 인과관계를 조사하여, 종속 변수(생존)의 관측치를 예측

이렇게 2가지 분석으로 좁혀집니다. 

 

이는 머신러닝 중 지도학습(Supervised Learning)

대표적인 개념이라 할 수 있습니다.

※이번 포스팅에서는 수학적 개념을 깊이있게 다루지 않습니다. 

자세한 내용은 각 본문에 첨부된 링크를 참고해주세요.

분석 방법

알고리즘

Regression(회귀)

Logistic Regression

Classification(분류)

KNN

분류 혹은 회귀

(이번 분석에서는

분류에 가까움)

Artificial Neural Network(ANN)

SVM(Support Vector Machine)

Random Forest

모델 적용 전, 필요한 라이브러리를 설치합니다.

#딥러닝 라이브러리로, scikit-learn(사이킷런)을 이용합니다.
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.svm import SVC
from sklearn.neural_network import MLPClassifier
from sklearn.ensemble import RandomForestClassifier

모델에 필요한 데이터를 준비합니다.

X_train = train.drop("Survived", axis=1)#목적 변수 제거
Y_train = train["Survived"]#목적 변수 역할
X_test  = test.copy() # 예측 대상 데이터셋
 

로지스틱 회귀 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 로지스틱 회귀(영어: logistic regression)는 D.R.Cox가 1958년[1] 에 제안한 확률 모델로서 독립 변수의 선형 결합을 이용하여 사건의 발생 가능성을 예측하는데 사용되는 통계 기법이다. 로지스틱 회귀의 목적은 일반적인 회귀 분석의 목표와 동일하게 종속 변수와 독립 변수간의 관계를 구체적인 함수로 나타내어 향후 예측 모델에 사용하는 것이다. 이는 독립 변수의 선형 결합으

ko.wikipedia.org

 

독립 변수와 종속변수(생존)의 선형 결합을 통한 확률 P을 계산합니다. 

여기서 확률이란 2개의 종속변수 중 어느 하나에 해당될 가능성을 의미,

이번 분석에서는 생존으로 분류될 확률을 계산하게 됩니다. 

 

회귀식은 P=ax+b 의 형태로,

독립변수 x의 회귀계수 a와 절편b의 결합을 통해 P를 계산합니다.  

 

Python을 이용한 로지스틱 회귀는 아래와 같습니다. 

logreg = LogisticRegression()
logreg.fit(X_train, Y_train)
Y_predLR = logreg.predict(X_test)
#logistic regression의 결과; X_test의 생존 예측 변수 생성 

 

※참고

설명변수의 목적변수(생존)에 대한 회귀계수

coeff_df = pd.DataFrame(train.columns.delete(0))
coeff_df.columns = ['Feature']
coeff_df["Correlation"] = pd.Series(logreg.coef_[0])

print(coeff_df.sort_values(by='Correlation', ascending=False))
     Feature  Correlation
1        Sex     2.201527
5      Title     0.398234
2        Age     0.287164
4   Embarked     0.261762
6    IsAlone     0.129140
3       Fare    -0.085150
7  Age*Class    -0.311199
0     Pclass    -0.749006

생존 여부 예측에 영향력이 큰 변수는 Sex

 

 

k-최근접 이웃 알고리즘 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 둘러보기로 가기 검색하러 가기 패턴 인식에서, k-최근접 이웃 알고리즘(또는 줄여서 k-NN)은 분류나 회귀에 사용되는 비모수 방식이다.[1] 두 경우 모두 입력이 특징 공간 내 k개의 가장 가까운 훈련 데이터로 구성되어 있다. 출력은 k-NN이 분류로 사용되었는지 또는 회귀로 사용되었는지에 따라 다르다. k-NN 분류에서 출력은 소속된 항목이다. 객체는 k개의 최근접 이웃 사이에서 가장 공통적인 항목에 할당되는 객체로

ko.wikipedia.org

패턴 인식을 통해 가까운 이웃들을 하나의 그룹으로 분류하는 방법을 말합니다. 

여기서 K는, 한 그룹 내의 개체 수를 의미, 사용자 정의 상수입니다. 

 

K-NN의 각 데이터는 다차원 공간에서 여러 분류명을 가지는 벡터로서 존재합니다.

분류의 대상이 되는 벡터(A)는 기존 벡터들간의 거리가 계산되고,

A에 가까운 순서대로 벡터 K개를 선정해 분류합니다.  

예를 들어

참조: https://ko.wikipedia.org/wiki/K-%EC%B5%9C%EA%B7%BC%EC%A0%91_%EC%9D%B4%EC%9B%83_%EC%95%8C%EA%B3%A0%EB%A6%AC%EC%A6%98

초록색 ●을 분류할 때 

K=3인 경우, 실선 원 안에 있는 파란색■1개, 빨간색▲2개와 같은 그룹으로 분류됩니다.

K=5인 경우, 점선 원 안에 있는 파란색■3개, 빨간색▲2개와 같은 그룹으로 분류됩니다. 

 

Python으로는 Sklearn의 KNeighborsClassifier알고리즘으로 간단히 작성 가능합니다.

knn = KNeighborsClassifier(n_neighbors = 3)# K=3 으로 지정
knn.fit(X_train, Y_train)
Y_predKnn= knn.predict(X_test)
# knn의 결과; X_test의 생존과 사망을 분류하는 변수 생성

 

 

인공 신경망 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 인공 신경망은 노드들의 그룹으로 연결되어 있으며 이들은 뇌의 방대한 뉴런의 네트워크과 유사하다. 위 그림에서 각 원모양의 노드는 인공 뉴런을 나타내고 화살표는 하나의 뉴런의 출력에서 다른 하나의 뉴런으로의 입력을 나타낸다. 인공신경망(人工神經網, 영어: artificial neural network, ANN)은 기계학습과 인지과학에서 생물학의 신경망(동물의 중추신경계중 특히 뇌)에서 영감을 얻은 통계학적 학습 알고리즘이다

ko.wikipedia.org

인간 뇌의 패턴 인식 방식;

뉴런 간 신호를 통해 정보 저장 및 새로운 신호를 출력하는 방식을 모방한 알고리즘입니다. 

 

인공신경망 알고리즘 중 하나인 퍼셉트론(Perceptron)은 

다수의 신호를 입력받아 하나의 신호를 출력하며, 출력 신호는 1과 0으로 나눠집니다. 

이 때, 구조는 2가지; 입력 layer과 출력 layer로만 구성됩니다. (단층 퍼셉트론)

 

참조: https://wikidocs.net/24958

각 입력값(X)에는 가중치(W)가 존재하며,

입력값과 가중치 곱의 합이 정해진 임계치를 넘으면 1, 그렇지 않으면 0이 출력(Y)되는 구조입니다. 

 

더 나아가, 다층퍼셉트론(Multi-layer Perceptron) 

입력과 출력layer사이에 다수의 은닉 layer(Hidden-Layer)가 존재합니다.

그렇기에 위의 단층 퍼셉트론보다 더 복잡한 문제도 해결 가능합니다. 

 

Python으로는 sklearn.neural_network의 MLPClassifier알고리즘을 이용합니다. 

Ann=MLPClassifier()
Ann.fit(X_train, Y_train)
Y_predAnn=Ann.predict(X_test)
#MLP의 결과; X_test의 생존과 사망을 분류하는 출력값

※참고

인공신경망 알고리즘과 같은 경우, 

파이썬으로 작성된 오픈 소스 신경망 라이브러리, 케라스(Keras)가 대두되고 있습니다. 

 

 

서포트 벡터 머신 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 선형 SVM이 두 자료(흰색 원, 검은색 원)을 직선으로 분리하고 있다. 서포트 벡터 머신(support vector machine, SVM[1].[2])은 기계 학습의 분야 중 하나로 패턴 인식, 자료 분석을 위한 지도 학습 모델이며, 주로 분류와 회귀 분석을 위해 사용한다. 두 카테고리 중 어느 하나에 속한 데이터의 집합이 주어졌을 때, SVM 알고리즘은 주어진 데이터 집합을 바탕으로 하여 새로운 데이터가 어느 카테고

ko.wikipedia.org

분류에 주로 사용되는 지도 학습 알고리즘으로, 

분류 대상이 기존 벡터 카테고리 중 어느 카테고리에 포함되는지를 구분하는  

비확률적 이진 선형 분류 모델을 만듭니다.

여기서 SVM은 카테고리를 나누는 경계선 중, 가장 큰 폭 (W)을 가지는 경계(Optimal Hyperplane)

를 찾는 알고리즘입니다.  

 

참조:  https://ko.wikipedia.org/wiki/%EC%84%9C%ED%8F%AC%ED%8A%B8_%EB%B2%A1%ED%84%B0_%EB%A8%B8%EC%8B%A0

검은색 벡터●그룹 중, 가장 바깥쪽의 회색 경계선을 가진 벡터1개와 

원 벡터○그룹 중, 가장 바깥쪽의 진한 경계선을 가진 벡터2개가 

경계선(optimal hyperplane)을 찾는데 도움을 주는 벡터 역할을 하므로

이 벡터들을 Support Vector라고 부릅니다. 

※참고 

물론 비선형 분류에도 사용되는데

주어진 데이터를 고차원 특징 공간으로 변형하는 작업이 필요합니다. 이 때 커널 트릭이 사용됩니다. 

 

Python으로는 sklearn.svm의 SVC알고리즘을 이용합니다. 

svc = SVC()
svc.fit(X_train, Y_train)
Y_predSVC= svc.predict(X_test)
#SVM의 결과; optimal hyperplane을 통해 생존 혹은 사망 분류

 

 

 

랜덤 포레스트 - 위키백과, 우리 모두의 백과사전

위키백과, 우리 모두의 백과사전. 기계 학습에서의 랜덤 포레스트(영어: random forest)는 분류, 회귀 분석 등에 사용되는 앙상블 학습 방법의 일종으로, 훈련 과정에서 구성한 다수의 결정 트리로부터 부류(분류) 또는 평균 예측치(회귀 분석)를 출력함으로써 동작한다. 랜덤 포레스트는 다수의 결정 트리들을 학습하는 앙상블 방법이다. 랜덤 포레스트는 검출, 분류, 그리고 회귀 등 다양한 문제에 활용되고 있다. 초기 랜덤 포레스트는 단일 트리를 확장할

ko.wikipedia.org

 

앙상블(Ensemble) 학습 방법의 대표적인 알고리즘입니다.

앙상블은 조화, 통일이라는 의미를 가지며, 

앙상블 학습 방법은, 개별적인 알고리즘 적용보다 더 좋은 예측 결과를 얻기 위해 

다수의 알고리즘을 적용하는 방법을 말합니다.

 

이러한 랜덤 포레스트는 수많은 나무(Tree)가 무작위로 숲을 구성한 형태로,  

다수의 의사결정트리(Decision Tree)를 생성하여 예측값들을 출력한 후, 

가장 많이 나온 예측값을 선택하는 방법을 취합니다. (이 때 각 트리는 훈련과 검증으로 구분됨)

그리고 트리모델 중 목표 변수가 유한한 값(e.g., 0과 1)을 가지면 분류 트리,

연속적인 값(e.g., 실수)을 가지면 회귀 트리라 합니다. 

생존 혹은 사망을 예측하는 분석을 진행 중이므로, 분류 트리라고 할 수 있습니다. 

 

 

※참고

랜덤 포레스트의 각 트리는 서로 독립된 예측을 갖도록 하여(=비상관성, 무작위, 즉 랜덤화)

예측값의 일반화 성능을 강화시킵니다. 랜덤화는 각 트리의 훈련과정에서 진행됩니다. 

트리의 랜덤한 구성의 방법으로 주로 배깅(bagging=bootstrap aggregating)이 사용됩니다.

배깅이란, 중복 허용 샘플링된 각 훈련 트리데이터를 원 데이터셋에 맞게 정렬하는 방법으로, 

각 트리의 비상관성(랜덤)을 강화시킵니다.

 

Python으로는 sklearn.ensemble의 RandomForestClassifier알고리즘을 이용합니다.

random_forest = RandomForestClassifier(n_estimators=100)
#n_estimator=트리의 개수
#트리 개수의 디폴트 값은 기본 100으로 설정되어있습니다.
random_forest.fit(X_train, Y_train)
Y_predRF = random_forest.predict(X_test)
#RF의 결과; 생존과 사망을 예측하는 종단 노드 생성

 

예측값들이 형성된 학습데이터의 결과 데이터셋을 출력합니다.

X_test=X_test.assign(LR=Y_predLR,Knn=Y_preKnn,SVM=Y_predSVC,Ann=Y_predAnn,RF=Y_predRF)
print(X_test.head(10))
   Pclass  Sex  Age  Fare  Embarked  Title  IsAlone  Age*Class  Knn  LR  SVM  \
0       3    0    2     0         2      1        1          6    0   0    0   
1       3    1    2     0         0      3        0          6    0   0    0   
2       2    0    3     1         2      1        1          6    0   0    0   
3       3    0    1     1         0      1        1          3    0   0    0   
4       3    1    1     1         0      3        0          3    0   1    1   
5       3    0    0     1         0      1        1          0    0   0    0   
6       3    1    1     0         2      2        1          3    1   1    1   
7       2    0    1     2         0      1        0          2    0   0    0   
8       3    1    1     0         1      3        1          3    1   1    1   
9       3    0    1     2         0      1        0          3    0   0    0   

   Ann  RF  
0    0   0  
1    0   0  
2    0   0  
3    0   0  
4    1   1  
5    0   0  
6    1   1  
7    0   0  
8    1   1  
9    0   0  

3. 모델 평가

 

앞서 지정한 각 모델의 score를 계산합니다. 

여기서 알고리즘.score(X_train, Y_train)은 train데이터셋에 대한 모델의 정확성(Accuracy)을 의미합니다.

참조: https://ko.wikipedia.org/wiki/%EC%A0%95%EB%B0%80%EB%8F%84%EC%99%80_%EC%9E%AC%ED%98%84%EC%9C%A8

※참고

모델 성능 평가의 대표적 지표들;

  • 정확성(Accuracy)= (TP+TN)/(TP+FP+TN+FN) → 모든 예측값 중 맞게 예측한 비율

  • 정밀도(Precision)(TP/(TP+FP) → P라고 예측한 값 중 맞게 예측한 비율 

  • 재현율(Recall)=(TP)/(TP+FN) → 진짜 P인 값 중 맞게 예측한 비율

acc_log = round(logreg.score(X_train, Y_train) * 100, 2)
acc_knn = round(knn.score(X_train, Y_train) * 100, 2)
acc_svc = round(svc.score(X_train, Y_train) * 100, 2)
acc_Ann=round(Ann.score(X_train, Y_train)*100,2)
acc_random_forest = round(random_forest.score(X_train, Y_train) * 100, 2)
models = pd.DataFrame({
    'Model': ["Logistic Regression","Knn","SVM","Ann","RF"],
    'Score': [acc_log, acc_knn, acc_svc, 
              acc_Ann, acc_random_forest]})
print(models.sort_values(by='Score', ascending=False))
                 Model  Score
4                   RF  86.76
1                  Knn  84.74
2                  SVM  83.84
3                  Ann  81.71
0  Logistic Regression  80.36

모델 중 Random Forest의 예측 정확성이 다른 모델보다 높다는 것을 알 수 있습니다. 

 

  • 마무리

이렇게 캐글의 타이타닉 생존자 예측 분석 연습을 끝냈습니다. 

이전 포스팅에서는 데이터 전처리와 EDA에 대해서,

이번 포스팅을 통해서는 딥러닝의 알고리즘과 모델 평가에 대해 배울 수 있었습니다.

 

참고

캐글 커널: Titanic Data Science Solutions - by Manav Sehgal

 

공지사항
최근에 올라온 글
최근에 달린 댓글
Total
Today
Yesterday
링크
«   2024/11   »
1 2
3 4 5 6 7 8 9
10 11 12 13 14 15 16
17 18 19 20 21 22 23
24 25 26 27 28 29 30
글 보관함