본문 바로가기

머신러닝, 딥러닝

랜덤포레스트 모델의 결측값 대체 방법

다양한 설문조사 데이터를 통한 응답자의 백신 접종 여부를 예측하는 데이터셋의 처리를 배우면서,

 

설문지 응답의 20-30% 정도를 차지하는 결측치를 잘 대체할 수 있는 방법이 있을까 찾아봤다.

 

중앙값 대체(median imputation)

  • 결측값을 해당 변수들의 중위수로 대체
  • 평균 대체법과 동일한 단점(분포 왜곡) 존재
  •  

예측 평균 일치 대체 (Predictive Mean Matching Imputation, PMM)

  • 결측치를 회귀모형에 의해 가장 가까운 관측값에 일치시키는 방법
  • 선형 회귀 분석의 변형된 형태
  • 관측값에 대한 예측값-결측값에 대한 예측값의 차이가 작은 개체들의 자료값으로 결측값을 대체
  • 랜덤 포레스트와 결합할 경우, 가장 민감도 결과가 좋았다.

K-Nearest Neighbors Imputation

  • 결측값을 갖는 개체와 가장 근접한 K개의 다른 관측된 개체를 이용하여 결측값 추정
  • 결측치를 제외한 K개의 개체와의 유클리디안 거리를 이용
  • 고정적인 K개의 평균값으로 결측치를 대치하므로 불필요한 개체들의 정보를 포함해 편의를 발생시킬 수 있다는 단점이 있음

Weighted KNN Imputation

  • 결측값을 포함한 개체로부터 완전한 개체들 간의 유사성 거리를 통한 가중 평균값으로 결측값 대체

베이지안 주성분 분석 대체(Beyesian principal component analysis imputation, BPCA)

  • 베이지안 주성분 분석을 이용한 결측치 추정 방법
  • 관측치와 결측치의 벡터의 잔차의 합을 최소화하고 최소제곱법을 이용해 결측치를 구함
  • 하지만 로귀스틱 회귀분석과 함께 사용 시 균형 정확도와 특이도가 하락했다
민감도 (Sensitivity) : 질병에 실제로 걸린 사람이 검사를 받았을 때 양성 판정을 받는 비율
특이도 (Specificity) : 질병에 실제로 걸리지 않은 사람이 검사를 받았을 때 음성 판정을 받는 비율

출처 : 결측값 대체와 랜덤 포레스트 모형을 이용한 패혈증 자료 분석, 2019

한 논문에 따르면, 결측치가 20%와 30%정도일 경우 모두, 랜덤 포레스트 + Mean을 사용한 Imputation 방식이 가장 정확도가 좋았다고 한다.

 2014년부터 2017년까지 연세대학교 세브란스 병원에 방문한 환자들의 일반 혈액 검사 (Complete Blood cell Count, CBC) 자료를 이용하여 다양한 결측값 대체 방법을 적용한 후 패혈증 진단 예측 모형의 성능을 비교하였다. CBC 자료에는 환자들마다 73개의 혈액 성분 검사 수치 결과가 있는데 결측값이 포함되어 있다. 여기서 6가지 결측값 대체 방법을 이용하여 결측값을 대체하고 결측값을 대체하기 전과 후의 패혈증 진단 예측 성능을 비교하였다. 본 논문에서 사용한 결측값 대체 방법으로는 평균 대체 (mean impuatation), 중앙값 대체 (median imputation), 예측 평균 일치 대체 (predictive mean matching imputation), K-최근접 이웃 대체 (K-nearest neighbors imputation), 가중 K-최근접 이웃 대체 (weighted K-nearest neighbors imputation) 그리고 베이지안 주성분 분석 대체 (Bayesian principal component analysis imputation) 방법을 이용하였다. 그리고 패혈증 진단 예측을 위해 로지스틱 회귀 (Logistic Regression), 서포트 벡터 머신 (Support Vector Machine, SVM), 랜덤 포레스트 (Random Forest)를 이용하여 성능을 비교하였다. 본 연구에서는 변수별 결측 비율에 따라 자료를 구성하여 분석을 진행하였다. 결측값 대체 후 패혈증 진단 예측 모형이 결측값을 대체하기 전 패혈증 진단 예측 모형보다 더 좋은 성능을 보였고, 랜덤 포레스트를 이용한 패혈증 진단 예측 성능이 로지스틱 회귀와 서포트 벡터 머신보다 우수했다. 그리고 변수별 결측값 비율이 높은 자료에서 결측값 대체의 효과는 더 크게 나타났음을 확인하였다.

결측치가 더 많을 때 결측치를 채운 후의 정확도가 높아졌다니 이상해서 곰곰히 생각해봤는데,

과거 자료의 결측치를 채우며 진단 예측 성능을 비교해봤기에 정답이 있는 데이터다.

애초에 결측치를 동일한 값으로 채웠기 때문에 맞추는 비율이 높아져서 그런가 하고 생각해봤는데

정말 Mean값으로만 결측치를 채워도 괜찮은걸까? 하는 의문이 남는다.

향후 더 배우면서 확인해 봐야지...

scikit-learn.org/stable/modules/generated/sklearn.impute.SimpleImputer.html

 

sklearn.impute.SimpleImputer — scikit-learn 0.24.1 documentation

 

scikit-learn.org

사이킷런의 SimpleImputer의 디폴트 전략은 Mean이다.

from sklearn.impute import SimpleImputer
imp_mean = SimpleImputer(missing_values=np.nan, strategy='mean')

그리고 클래스가 2개인 데이터(0,1인 binary형 데이터)에는

mean = median이라고 한다.

결측치를 채울 때 mean으로 하나, median이라고 하나 똑같다.