Remind
이전 글에서 모델링 적합을 위해 데이터 전처리를 진행해 줬다.
이번 글에는 본격적으로 모델링 작업을 해보려 한다.
Train data, Test data 분류
모델 적합에 앞서 원본 데이터를 75 : 25 비율로 분류해 준다.
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.25)
Logistic Regression Classifier
먼저 로지스틱 선형 회귀 분석을 적합해보겠다.
모델 적합
sklearn 라이브러리로 선형 회귀를 불러와 X_train 데이터와 y_train 데이터를 적합한다.
from sklearn.linear_model import LogisticRegression
model = LogisticRegression()
model.fit(X_train, y_train)
적합된 모델을 X_test 데이터를 기반으로 y 값을 예측한다.
y_pred = model.predict(X_test)
성능평가
분류 모델의 성능을 평가하기 위해 precision, recall, f1-score, support 값을 구했다.
전체 샘플 중 88%를 정확히 예측하여 준수한 성능을 보인다.
from sklearn.metrics import classification_report
print(classification_report(y_test, y_pred))
Random Forest Classifier
그다음으로 Random Forest 분류 모델을 활용해 모델을 예측해 보겠다.
모델 적합
앞선 로지스틱 모델과 같이 모델을 적합한다.
from sklearn.ensemble import RandomForestClassifier
model = RandomForestClassifier()
model.fit(X_train, y_train)
성능평가
이후 동일한 방법으로 정확도를 측정하니, 0.85로 로지스틱 모델과 거의 동일한 성능을 보인다.
Sequential
마지막으로 앞선 머신러닝 모델과 다르게 Keras의 신경망 모델인 Sequential를 사용해 모델을 생성해 보겠다.
계층 생성
입력 데이터를 받아 3개의 은닉층을 거치고 최종적으로 이진 분류를 수행한다.
import tensorflow as tf
# 계층 생성
model = tf.keras.models.Sequential()
model.add(tf.keras.layers.Dense(units = 500, activation = 'relu', input_shape = (50, )))
model.add(tf.keras.layers.Dense(units = 500, activation = 'relu'))
model.add(tf.keras.layers.Dense(units = 500, activation = 'relu'))
model.add(tf.keras.layers.Dense(units = 1, activation = 'sigmoid'))
모델 요약
- 입력 크기 : 50
- 은닉층 1 : 500 뉴런(ReLU)
- 은닉층 2 : 500 뉴런(ReLU)
- 은닉층 3 : 500 뉴런(ReLU)
- 출력층 : 1 뉴런(Sigmoid)
- 총 파라미터 수 : 527,001개
모델 컴파일
컴파일을 진행하여 모델 학습 과정에서 필요한 설정(최적화, 손실 계산, 평가)을 정의하여 모델 학습을 준비를 완료한다.
이번에는 Optimizer로 일반적으로 사용되는 Adam, loss로 이진 분류인 binary_crossentropy, Metrics으로는 accuracy로 설정하여 컴파일을 진행하였다.
model.compile(optimizer = 'Adam', loss = 'binary_crossentropy', metrics = ['accuracy'])
모델 적합
데이터셋 전체를 학습하는 반복 횟수인 epochs를 100으로,
모델이 가중치를 업데이트하기 전 처리하는 데이터 샘플의 수는 batch_size를 60으로 설정한 뒤 모델을 적합하고,
모델 성능이 어떻게 변화를 알 수 있는 epochs_hist를 통해 트레이닝 과정을 시각화한다.
epochs_hist = model.fit(X_train, y_train, epochs = 100, batch_size = 60)
이후 모델의 예측값(y_pred)을 계산하고, 임계값을 적용해 0 또는 1로 이진 분류한다.
y_pred = model.predict(X_test)
y_pred = (y_pred>0.5)
성능 평가
먼저 모델의 손실 값을 확인하다.
학습이 진행될수록 손실 값이 점진적으로 감소하는 경황이 나타난다.
plt.plot(epochs_hist.history['loss'])
plt.title('Model Loss Progress During Training')
plt.xlabel('Epoch')
plt.ylabel('Training Loss')
plt.legend(['Training Loss'])
그다음 모델 학습 과정 중 정확도(accuracy)의 변화를 시각화한다.
학습이 진행됨에 따라 정확도가 높아지는 것을 보아 학습이 잘 진행된 것을 알 수 있다.
plt.plot(epochs_hist.history['accuracy'])
plt.title('Model Accuracy Progress During Training')
plt.xlabel('Epoch')
plt.ylabel('Training Accuracy')
plt.legend(['Training Accuracy'])
마지막으로 classification_report을 확인해 보면, 정확도 값이 0.87로 준수한 것으로 알 수 있다.
결론 & 리뷰
비즈니스 사례 이해 및 모델 구축 계획 - EDA - 전처리 - 모델링
이 순서로 이직률을 예측해 보았다.
또한 정확도도 3가지 모두 모델 85% 이상이었고, 그중 로지스틱 선형 회귀 모델이 88%이기에 최적의 모델로 선정하였다.
이전에 사용해보지 못한 신경망 모델인 Sequential을 사용해 볼 수 있어서 좋았고,
실제 기업 내부에서도 유용하게 쓰일만한 모델인 것 같아 재미있게 만들었다.
이를 통해 기업 외부 데이터를 확보하는 것도 중요하고 많은 인사이트를 만들 수 있지만,
내부 데이터를 활용해서도 여러 인사이트를 만들 수 있을 것이라 생각했고,
데이터는 어떻게 사용될지 모르기에 잘 축적해 두는 게 중요하는 생각이 들었다.
앞으로 AI의 시대가 도래하면서 그것의 기반이 되는 데이터가 더욱 중요해질 것 같다.
'프로그래밍 > AI&Data' 카테고리의 다른 글
머신러닝[Machine Learning] - 비지도학습 (0) | 2024.12.05 |
---|---|
머신러닝[Machine Learning] - 선형회귀(Linear Regression) (0) | 2024.12.05 |
데이터 사이언스 [Data Science] - HR - 전처리(인코딩 및 스케일링) (4) | 2024.11.30 |
데이터 사이언스 [Data Science] - HR - EDA(탐색적 데이터 분석) (0) | 2024.11.29 |
데이터 사이언스 [Data Science] - HR - 비즈니스 사례 이해 및 모델 구축 계획 (1) | 2024.11.28 |