티스토리 뷰
※데이터 전처리는 이전 포스팅에 개재
2019/05/06 - [데이터분석/분석 연습] - Kaggle 캐글 연습#1_Titanic 타이타닉 생존자 예측_1/2
-
데이터 전처리
-
데이터 준비
-
데이터 변수(feature)확인
-
탐색적 데이터 분석(EDA)
-
Feature Engineering
-
-
예측 모델 구축 및 적용
-
모델 평가
이번 포스팅에서는 예측 모델 적용과 평가를 진행하도록 하겠습니다.
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() # 예측 대상 데이터셋
독립 변수와 종속변수(생존)의 선형 결합을 통한 확률 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-NN의 각 데이터는 다차원 공간에서 여러 분류명을 가지는 벡터로서 존재합니다.
분류의 대상이 되는 벡터(A)는 기존 벡터들간의 거리가 계산되고,
A에 가까운 순서대로 벡터 K개를 선정해 분류합니다.
예를 들어
초록색 ●을 분류할 때
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의 생존과 사망을 분류하는 변수 생성
인간 뇌의 패턴 인식 방식;
뉴런 간 신호를 통해 정보 저장 및 새로운 신호를 출력하는 방식을 모방한 알고리즘입니다.
인공신경망 알고리즘 중 하나인 퍼셉트론(Perceptron)은
다수의 신호를 입력받아 하나의 신호를 출력하며, 출력 신호는 1과 0으로 나눠집니다.
이 때, 구조는 2가지; 입력 layer과 출력 layer로만 구성됩니다. (단층 퍼셉트론)
각 입력값(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은 카테고리를 나누는 경계선 중, 가장 큰 폭 (W)을 가지는 경계(Optimal Hyperplane)
를 찾는 알고리즘입니다.
검은색 벡터●그룹 중, 가장 바깥쪽의 회색 경계선을 가진 벡터●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을 통해 생존 혹은 사망 분류
앙상블(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)을 의미합니다.
※참고
모델 성능 평가의 대표적 지표들;
-
정확성(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
'데이터분석 > 분석 연습' 카테고리의 다른 글
Kaggle 캐글 연습#1_Titanic 타이타닉 생존자 예측_1/2 (0) | 2019.05.06 |
---|
- Total
- Today
- Yesterday
- Lambda
- 상관관계
- programmers
- 뇌하수체
- 평균
- 확률
- 확률분포
- SQL
- 분산
- 군고구마
- Python
- 중앙값
- 쿠싱
- 힙
- 상대도수
- 조건부확률
- counter
- neural network
- 쿠싱증후군
- 분당서울대병원
- 사분위수
- 코딩테스트
- 파이썬
- 프로그래머스
- random forest
- TensorFlow
- leatcode
- 통계
- 뇌하수체선종
- hash
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
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 |