-
<입원 환자의 데이터를 바탕으로 한 입원 기간 예측>
현재 입원 기간 예측을 주제로 하는 졸업 프로젝트를 진행 중이다.
동시에 같은 주제로 2020 연구데이터 분석활용 경진대회에도 참가하고 있다. 1차 서류는 통과한 상태이고, 이틀 전 최종 발표까지 마친 상태...
(결과 기다리는 중 두구두구)

데이터는 캐글에서 제공하는 입원 환자 데이터를 사용했다.
https://www.kaggle.com/nehaprabhavalkar/av-healthcare-analytics-ii

먼저 데이터를 들여다보기 위한 EDA와 전처리를 진행하였다.
데이터를 다루면서 가장 먼저 힘들었던 점은 바로 범주형 변수가 매우 많았다는 점이다!
종속변수를 포함해 18개의 열 중 무려 13개가 범주형 변수였다.

범주형 변수 중에서도 문자열로 된 변수도 있었고, 수치형으로 된 변수도 있었는데,
(수치형은 str화 후) 더미화(원핫인코딩)를 통해 수치화하였다.
종속변수에 해당하는 Stay변수는 0-10, 11-20, ~ 의 형태였는데 중간값에 해당하는 5, 15, ~의 수치형 변수로 처리하였고, 나이 변수는 0-10은 0, 11-20은 1, ... 의 방법으로 매핑했다.
병의 중증도(Severity of Illness) 변수는 값에 정도가 있다고 판단하여 Minor, Moderate, Extreme에 대해 각각 0,1,2로 매핑하였다. 코드는 아래와 같다.

결측치는 총 31만개 중 113개인데 데이터셋에 비해 매우 적다고 판단하여 결측치는 모두 제거하였다.
이제 본격적인 모델링에 들어가보자!
-
RandomForest (랜덤 포레스트)
랜덤 포레스트는 학습 데이터로부터 부트스트랩(주어진 자료로부터 동일한 크기의 표본을 랜덤 복원 추출)을 통해 무작위 표본을 다수 생성하여 각 표본에 대한 독립적인 의사결정나무를 학습하고, 그 결과를 종합하여 최종 모형을 결정하는 의사결정나무 기반의 앙상블 방법(ensemble methods)이다(유진은, 2015; 오미애, 최현수, 김수현, 장준혁, 진재현, 천미경, 2017; 김보찬, 김유현, 김민정, 이종석, 2018).
이때 의사결정나무(Decision Tree)는 데이터의 속성에 따라 나무 형태의 의사결정 학습모델을 만들고, 반복을 통해 주어진 문제에 대한 최종 결정을 도출하는 방법이다(이근영, 2015). 랜덤 포레스트의 목적은 의사결정나무 모형을 다수 만들어 더 정확한 예측을 하는 것에 있다. 랜덤 포레스트는 독립변수에 대한 상대적 중요도 지수(variable of importance index)를 제공함으로써 종속변수에 대한 독립변수의 중요도를 숫자 또는 그래프로 알아볼 수 있도록 한다(유진은, 2015; 오미애, 최현수, 김수현, 장준혁, 진재현, 천미경, 2017).

결정 트리 훈련 단계 
랜덤 포레스트 모델의 성능 위의 new accuracy는 회귀 모델의 평가를 위해 우리가 자체적으로 개발한 성능 평가 함수이다.
정답값(중간값인 5, 15, 25 ~)에 ±15일 오차를 허용한 새로운 정확도 산출 함수를 정의하여 회귀 모델 성능 지표인 RMSE, r2_score와 함께 산출했다.

정답값에 ±15일 오차를 허용한 새로운 정확도 산출 함수 변수 중요도는 다음과 같다.

랜덤 포레스트 모델의 변수 중요도 그래프 feature importance 그래프를 통해 이 모델에 방문자 수, 예치금, 병실 타입, 나이의 순서로 중요도를 가짐을 알 수 있다.
-
XGBoost (Extreme Gradient Boosting)
XGBoost는 GBM(Gradient Boosting)을 병렬구조로 나눔으로써 속도와 성능을 향상시킨 모형이다(이은진, 2020). XGBoost는 회귀 및 분류, 순위 목표를 지원하는 모델로 트리 기반 앙상블 학습에서 각광받는 분석 모델이다. 처리 속도가 빠르며, 모델의 이전 결과를 활용하여 모델을 계속적으로 개선하고 훈련하는 등 성능이 뛰어나 Google, MS Azure, Alibaba 등 실무에서도 많이 활용되었다(하지은, 2017). XGBoost는 결측치를 내부적으로 자동 처리하며 트리를 생성할 때 병렬적으로 생성하며 새로운 데이터에 대해 이전의 학습 모델 결과를 반영하여 그 성능을 더 향상시키는 방법으로 훈련하는 특징을 가진다(Chen & Guestrin, 2016).
XGBoost는 CART(Classification And Regression Tree)라 불리는 앙상블 모델을 사용하는 트리를 만든다. 이후 부스팅(Boosting)을 통해 각 분류기 간 비중(weight)을 최적화한다. 일반적인 의사결정트리는 잎 하나에 대해서만 결정값(decision value)을 갖지만, CART 모델은 모든 잎들이 모델의 최종 스코어에 연관되어 있다. 또한 같은 분류 결과를 갖는 모델들의 우위를 점수로 비교할 수 있다(윤혜란, 2020).

이 모델의 성능은 다음과 같다.

xgboost 모델의 성능 랜덤포레스트 모델보다 개선된 결과를 확인할 수 있다.
변수 중요도는 다음과 같다.

xgboost 모델의 변수 중요도 그래프 랜덤포레스트 모델의 결과와 비슷하게 xgboost 모델에서도 방문자수, 예치금, 나이 변수가 중요함을 알 수 있다.
-
RandomizedSearchCV
하이퍼 파라미터 조정을 위해 RandomizedSearchCv를 적용했다. GridSearchCV의 경우 하이퍼 파라미터의 가능한 조합 수를 모두 테스트하기 때문에 매우 오랜 시간이 소모되고, 서치 스페이스가 큰 우리 모델에는 적합하지 않다. 반면에 RandomizedSearchCV는 모든 가능한 조합들을 시도하는 대신, 매 반복시마다 각 하이퍼 파라미터에 대해 랜덤한 값을 선택함으로써 주어진 숫자만큼 무작위 조합에 대해 평가한다. 따라서 데이터 개수가 많고 변수들의 중요도가 확연히 차이가 나며, 트레이닝 시간이 오래 걸리는 우리에겐 RandomizedSearchCV가 더 적합하다고 판단했다.
아래와 같이 하이퍼파라미터를 설정하였고, 그 결과 base xgboost 모델보다 개선되었음을 확인할 수 있다.


RandomizedSearchCV 모델의 성능 -
LightGBM
LightGBM은 2017년에 Microsoft에서 발표한 모델이며, XGBoost를 보완하기 위해 만들어졌다. LightGBM은 XGBoost가 처리하지 못하는 대용량의 데이터를 학습할 수 있으며, 히스토그램 기반 근사치를 사용해 XGBoost 대비 성능이 향상되었다(이은진, 2020). 아래의 그림처럼 LightGBM은 최대 델타 손실(Max delta loss)이 큰 노드에서 분할하여 수직 성장하는 리프 분할 방식(Leaf-wise, best first)을 사용한다.
Recurrent Neural Network(RNN)는 순차 데이터(sequential data)를 모델링 할 수 있는 강력한 모델이다(이창기, 2015).

하이퍼 파라미터 설정은 다음과 같이 하였고,

결과는 다음과 같다.

또한, 변수 중요도는 아래와 같은데,

Lightgbm 모델의 변수 중요도 그래프 Column_4는 예치금, Column_2는 방문자 수, Column_3은 나이, Column_0은 잔여 병실 수로 앞의 두 모델의 변수 중요도와 결과가 조금 다르다.
결과적으로 RandomizedSearchCV 방법을 적용한 XGBoost 모델의 성능이 rmse: 15.241, r2 score: 0.496, new accuracy: 0.758로 가장 높았다. 변동성이 매우 높은 입원 환자 데이터의 특성을 고려하면 꽤 높은 수치가 나온 것으로 생각되고 후속적으로 코로나 데이터를 추가해 딥러닝 모델에도 적용할 계획이다.
※ 전반적으로 중요도가 높게 나왔던 변수인 방문자 수는 종속 변수의 영향을 크게 받는 변수이므로 빼고 진행하는 것이 어떻겠냐는 피드백을 받았다. 신규 환자의 입원 기간을 예측할 때는 방문자 수 변수를 빼는 것이 맞다고 본다. 하지만 기존 환자 입원 기간을 예측할 때는 설명력이 있지 않을까 생각한다. 또한, 방문자 수를 의사의 회진 수로 변경하는 것도 하나의 방법일 것 같다.
-