이전 포스팅에서 기계학습을 위한 Feature Engineering을 진행해 학습에 사용할 Train 데이터와 테스트에 사용할 Test 데이터를 만들고 One-Hot Encoding을 진행했습니다. 이번 포스팅에서는 Model에 학습시키고 예측하는 과정을 진행하겠습니다.


3. Modeling

  • 우선 이 프로젝트는 Train 데이터로 정답을 알려주며 학습시키는 지도학습입니다.
  • 지도학습은 크게 분류(Classification)회귀(Regression) 가 있습니다.
  • Titanic 생존 예측은 0(사망)/1(생존) 두 가지 중 하나로 분류하는 이진 분류(Binary Classification) 에 속합니다.
  • 머신러닝에 사용되는 알고리즘을 제공하는 Python 라이브러리 Scikit-Learn을 사용합니다.


3.1. Train-Validation-Test

  • 가지고 있는 Train 데이터를 Train set과 Validation set으로 나눠야 합니다.
  • Train set 으로 학습한 후 Validation set 을 이용해 모델의 성능을 평가해야 합니다.
  • Test 데이터는 모델의 최종 성능을 평가하기 위해 사용되기 때문입니다.
  • 데이터를 분리하기 위한 사전작업을 해줍니다.
  • Sklearn의 train_test_split을 불러옵니다.
1
2
# 데이터 분리 준비
from sklearn.model_selection import train_test_split

  • 7:3의 비율로 Train set 과 Validation set 을 생성합니다.
1
2
3
4
5
6
7
# Train, Test, Target을 분리
X_train = train_dt.drop('Survived', axis=1).values
target_label = train_dt['Survived'].values
X_test = test_dt.values
 
# train_test_split 을 사용해 7:3의 비율로 train set과 validation set을 생성
X_tr, X_vid, y_tr, y_vid = train_test_split(X_train, target_label, test_size=0.3, random_state=1230, shuffle=True)


3.2. Model

  • 사용할 모델
    1. Logistic Regression
    2. K-Nearest Neighbors(K-NN)
    3. Decision Tree
    4. Random Forest
    5. Naive Bayes
    6. Support Vector Machine(SVM)
  • Model 을 하나하나 분석하기 보다는 사용위주의 측면에서 진행합니다.
  • 이번 분석에서는 Parameter 은 대부분 Default 값을 사용합니다.
  • 사용할 Model 을 가져옵니다.
1
2
3
4
5
6
7
8
9
10
# 분석 모델 가져오기
from sklearn.linear_model import LogisticRegression
from sklearn.neighbors import KNeighborsClassifier
from sklearn.tree import DecisionTreeClassifier
from sklearn.ensemble import RandomForestClassifier
from sklearn.naive_bayes import GaussianNB
from sklearn.svm import SVC
 
# 분석 성능을 측정할 도구
from sklearn import metrics


3.2.1. Logistic Regression

  • Logistic Regression(로지스틱 회귀) 는 데이터가 어떤 범주에 속할 확률을 0에서 1사이의 값으로 예측하고 분류하는 알고리즘입니다.

  • Model을 사용하는 방법은 간단합니다.

  • X_tr 과 y_tr 을 학습한 후 X_vid를 이용해 예측합니다.

1
2
3
4
5
6
7
8
# Model 적용
model = LogisticRegression()
model.fit(X_tr, y_tr)
 
#예측
prediction = model.predict(X_vid)
 
prediction

  • 다음과 같이 사망과 생존을 예측했습니다.
  • 예측한 결과의 정확도(Accuracy)를 측정합니다.
1
2
#예측값으로 accuracy 측정
print('Logistic Regression - {:.2f}% 확률로 생존 맞춤'.format(metrics.accuracy_score(prediction, y_vid) * 100))

  • 78.36%의 정확도로 생존율을 맞췄습니다.
  • 같은 방법으로 다른 Model 도 측정해 봅니다.


3.2.2. K-Nearest Neighbors(K-NN)

  • K-NN(최근접 이웃)은 가장 가까운 거리에 있는 K개의 이웃과 비교하여 예측하는 방법입니다.
  • K의 값는 Default 값으로 5를 가집니다.
1
2
3
4
5
6
7
8
9
# Model 적용
model = KNeighborsClassifier()
model.fit(X_tr, y_tr)
 
#예측
prediction1 = model.predict(X_vid)
 
#예측값으로 accuracy 측정
print('K-Nearest Neighbors - {:.2f}% 확률로 생존 맞춤'.format(metrics.accuracy_score(prediction1, y_vid) * 100))


3.2.3. Decision Tree

  • Decision Tree(의사결정 나무) 는 규칙들을 나무구조로 도표화해 분류와 예측을 수행하는 방법입니다.
1
2
3
4
5
6
7
8
9
# Model 적용
model = DecisionTreeClassifier()
model.fit(X_tr, y_tr)
 
#예측
prediction2 = model.predict(X_vid)
 
#예측값으로 accuracy 측정
print('Decision Tree - {:.2f}% 확률로 생존 맞춤'.format(metrics.accuracy_score(prediction2, y_vid) * 100))


3.2.4. Random Forest

  • Random Forest(랜덤 포레스트) 는 Ensemble(앙상블) 기법 중 하나로 무작위로 약한 학습기를 생성한 후 이를 선형결합하여 최종 학습기를 만드는 방법입니다.
1
2
3
4
5
6
7
8
9
# Model 적용
model = RandomForestClassifier()
model.fit(X_tr, y_tr)
 
#예측
prediction3 = model.predict(X_vid)
 
#예측값으로 accuracy 측정
print('Random Forest - {:.2f}% 확률로 생존 맞춤'.format(metrics.accuracy_score(prediction3, y_vid) * 100))


3.2.5. Naive Bayes

  • Naive Bayes(나이브 베이즈)는 조건부확률을 계산하는 방법 중 하나인 베이즈 정리에 기반한 분류 방법입니다.
1
2
3
4
5
6
7
8
9
# Model 적용
model = GaussianNB()
model.fit(X_tr, y_tr)
 
#예측
prediction4 = model.predict(X_vid)
 
#예측값으로 accuracy 측정
print('Naive Bayes - {:.2f}% 확률로 생존 맞춤'.format(metrics.accuracy_score(prediction4, y_vid) * 100))


3.2.6. Support Vector Machine(SVM)

  • SVM은 분류를 위한 기준 선을 정의해 경계의 어느 쪽에 속하는지 확인해 분류하는 방법입니다.
1
2
3
4
5
6
7
8
9
# Model 적용
model = SVC()
model.fit(X_tr, y_tr)
 
#예측
prediction5 = model.predict(X_vid)
 
#예측값으로 accuracy 측정
print('Support Vector Machine - {:.2f}% 확률로 생존 맞춤'.format(metrics.accuracy_score(prediction5, y_vid) * 100))


  • 6가지의 알고리즘을 사용해 예측을 돌려본 결과
    1. Logistic Regression-78.36%
    2. K-Nearest Neighbors(K-NN) - 77.61%
    3. Decision Tree - 76.87%
    4. Random Forest - 78.73%
    5. Naive Bayes - 76.12%
    6. Support Vector Machine(SVM) - 79.10%
  • Support Vector Machine 이 예측 정확도가 가장 높게 나왔습니다.
  • 하지만 만들어진 Model은 테스트로 사용한 Validation set 에만 잘 동작하게 됩니다.
  • train_test_split으로 다시 Train set과 Validation set을 만든다면 모델의 성능은 계속 달라질 것입니다.
  • 이 문제를 해결하기 위해 Cross Validation(교차 검증)을 사용할 수 있습니다.


3.3. Cross Validation

  • Cross Validation(교차 검증) 은 Train 데이터의 모든 부분을 사용하여 모델을 검증하는 방법입니다.
  • 교차 검증 방법 중 가장 일반적으로 사용되는 K-fold를 사용합니다.


3.3.1. K-fold Cross Validation

  • 위의 사진은 K=5의 Fold로 나눴을때 모습입니다.

  • K-fold 는 Train 데이터를 K등분하고 나누어진 데이터를 K개로 다시 나누어 그 안에서 학습과 검증을 K번 반복해 평균을 구하는 검증 방법입니다.

  • Sklearn에서 K-Fold를 가져옵니다.

1
2
3
# K-Fold를 위한 준비
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score

  • K-Fold와 Model을 사용할 데이터를 준비합니다.
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
# K = 10 의 K-Fold 설정
kfold = KFold(n_splits=10, random_state=1230)
 
# Model 의 결과를 담을 List 생성
mean = []
accuracy = []
std = []
 
# 사용할 Model 명
classifiers = ['Logistic Regression',
               'K-Nearest Neighbors(K-NN)',
               'Decision Tree',
               'Random Forest',
               'Naive Bayes',
               'Support Vector Machine(SVM)']
 
# 사용할 Model 설정
models = [LogisticRegression(), 
          KNeighborsClassifier(), 
          DecisionTreeClassifier(), 
          RandomForestClassifier(), 
          GaussianNB(), 
          SVC()]

  • 모델을 한번에 적용해 모델별 acuuracy 평균과 표준편차를 확인해 봅니다.
1
2
3
4
5
6
7
8
9
10
11
# Model 적용
for i in models:
    model = i
    cv_result = cross_val_score(model, X_train, target_label, cv = kfold, scoring='accuracy')
    cv_result = cv_result
    mean.append(cv_result.mean())
    std.append(cv_result.std())
    
# Model 별 accuracy 평균과 표준편차
kfold_models_dataframe = pd.DataFrame({'CV mean':mean, 'Std':std}, index=classifiers)
kfold_models_dataframe

  • 위의 표를 보면 평균 정확도(CV mean)는 높지만 표준편차(Std)가 큰 모델들이 있습니다.
  • 평균 정확도(CV mean)는 높고 표준편차(Std)는 작은 모델을 선별해보면 약 83% 정확도를 가진 Logistic Regression 을 선택할 수 있습니다.

3.4. Submission

  • Logistic Regression을 채택해 test 데이터를 예측합니다.
1
2
3
4
# Logistic Regression 으로 학습 후 예측
clf = LogisticRegression()
clf.fit(X_train, target_label)
prediction_LG = clf.predict(test_dt)

  • 예측한 결과로 Submission 파일을 만들어 줍니다.
1
2
3
4
5
6
7
8
# 제출에 Submission 파일 불러오기
submission = pd.read_csv('gender_submission.csv')
 
# 예측값 업데이트
submission['Survived'= prediction_LG
 
# CSV 파일로 제작
submission.to_csv('titanic_submission.csv', index=False)
  • 생성한 submission 파일을 Kaggle에 제출해봅니다.

  • 위에서 확인한 정확도 보다 떨어진 Score 0.75837 을 받았습니다.


3.5. Thinking

  • 예측 Model의 성능을 올리기 위해 개선해야 할 점을 생각해봅니다.
    1. EDA를 더 자세하게 해보기
    2. NaN(결측값)을 다른 방법으로 처리하기
    3. Feature Enginnering을 다양한 방법으로 적용시키기
    4. Ticket, Cabin 과 같은 사용하지 않은 Feature 활용해보기
    5. Model 설계 과정에서 parameter 값을 tuning 해보며 최적화 값 찾기


3.6. 마치며

머신러닝을 접하고 Kaggle을 알게되어 처음으로 진행한 주제였습니다. 머신러닝을 처음 접하고 시작해보고 싶을때 좋은 주제라고 생각합니다. 튜토리얼로 많이 사용되지만 Kaggle 에 있는 여러 사람들의 Notebook을 보며 공부하는 것이 정말 도움이 많이 됩니다. 조금씩 수정을 해가며 Model의 성능을 올리는 방법도 공부해야겠다고 느꼈습니다.

이번 포스팅에서 사용한 Model 들은 좀 더 공부와 이해를 하고 각각 포스팅을 해볼 생각입니다. (언제일지는 잘모름)

공부를 하면서 도움을 받은 곳

  • Kaggle 에 있는 수많은 인기 Notebook
  • 이유한님 Youtube