티스토리 뷰

앞서 Model Drift 개념과 유형에 대해서 알아보았습니다.

이번 글에서는 Model Drift를 감지하는 방법과 Model Drift를 방지하고 해결하는 방법에 대해서 정리해 보겠습니다.

 

Model Drift Detection 방법

첫 번째, input 변수와 target 변수의 변화를 통계적으로 분석하거나 모니터링하는 방법 [Data Drift Detection]

  • Descriptive statistics, Distribution changes(KS Test, PSI 등), Model Based Approach, Adaptive Windowing, Page-Hinkley method

두 번째, 모델 예측 결과를 평가하여 성능 변화를 감지하는 방법 [Concept Drift Detection]

  • 모델 성능이 사전에 정한 임계값 이상으로 저하 (ex. DDM(Drift Detection Method)
  • Feature Importance 변화
  • 모델 불일치-새로운 모델은 이전 모델과 동일한 알고리즘과 하이퍼파라미터를 사용한다고 할 때, 새로 학습한 모델의 예측치와 기존 모델의 예측치가 동일하거나 유사하다면 concept drift가 발생하지 않았다고 할 수 있음

아래는 첫 번째 관점의 Detection 상세 설명입니다.

 

1) Descriptive statistics 

  • 데이터셋의 최솟값, 최댓값, 중앙값, 평균, 상관계수 등 기술적 통계량을 모니터링에 활용

MS Azure Feature Monitoring

 

2) Distribution Changes

  • 데이터 분포의 변화를 통계적으로 검증하는 것으로, input변수나 output변수의 변화를 빠르게 파악 가능(모델 재학습 전에 미리 파악 가능)
  • 검증 방법 종류
    • Population Stability Index(PSI), Kullback-Leibler (KL) divergence, Jensen-Shannon, Kolmogorov-Smirnov(KS) test, Cramér-von Mises, Fisher’s Exact Test, Maximum Mean Discrepancy (MMD), and Least-Squares Density Difference 
    • Kolmogorov-Smirnov test (or KS test) : 두 개 샘플의 누적확률분포를 비교하는 비모수 검정으로 두 분포의 최대 차이를 측정. 두 샘플(학습 데이터와 모델 배포 후 수집되는 데이터)이 동일한 분포에서 생성되었는지를 확인하기 위해 사용되는 것으로 KS test의 귀무가설은 '두 데이터셋의 분포가 동일하다'이고 귀무가설이 기각되면 데이터에 drift 발생했다고 판단
      [파이썬 패키지 scipy.stats.ks_2samp]
    • Population Stability Index (PSI) : 데이터셋이 시간이 지남에 따라 어떻게 이동(변화)했는지 측정. 특정 변수나 Output에 대한 두 개의 서로 다른 샘플들의 차이를 숫자 하나로 표현한 것. (PIS < 0.1 : no significant change, PIS < 0.2 : moderate change, PIS >= 0.2 : siginificant change)
      [파이썬 패키지 https://github.com/mwburke/population-stability-index/blob/master/psi.py]

 

 

3) Model-Based Approach

  • 프로덕션에서 현재 모델을 빌드하는 데 사용된 데이터에 0으로 레이블 지정하고, 테스트 데이터에 대해서는 1로 라벨링을 지정
  • 데이터가 어떤 데이터셋에 속한 것인지 분류하는 이진 분류 모델을 생성하여 적용
  • 모델의 정확도를 drift 판단 기준으로 삼음
    • 정확도(AUC-ROC)가 높게 나올수록 "두 데이터셋의 차이가 크다"라는 의미
    • 만약 정확도가 0.5 정도 수준이라면 두 데이터셋의 분류가 어려운 것으로 유의미한 데이터 변화가 발생하지 않은 것을 의미
  • 장점 : 전체 데이터셋을 대상으로 감지할 수 있음, 개별 변수의 분포에는 변화가 없으나 변수들 간의 관계가 변화한 경우 감지할 수 있음
  • 단점 : 새로운 데이터를 입력할 때마다 학습 및 테스트 과정이 반복되어야 하므로 계산 비용이 많이 들 수 있음
  • 단변량 drift 감지를 할 경우에도 해당 하나의 변수를 설명변수로, 어떤 데이터셋에 속하는지를 나타내는 Target변수로 하여 이진 분류 모델 생성

 

4) Adaptive Windowing(ADWIN)

  • 슬라이딩 윈도우 방식을 적용하는 방법으로, 새로운 데이터를 Adaptive 윈도우에 추가하고 drift를 감지하기 위해 윈도우 내 데이터를 분석
  • 모든 가능한 조합의 서브 윈도우를 만들면서 drift를 감지할 때까지 윈도우 사이즈를 증가시키고, 두 개의 서브 윈도우의 분포가 달라지면 drift를 감지하고 과거 데이터를 삭제하여 다시 윈도우 사이즈를 줄이는 방식으로 처리
  • 장점 : 미리 윈도우 사이즈를 지정할 필요 없고, drift감지를 위한 임계값만 설정하면 됨
  • 단점 : 주로 단변량 데이터의 drift에서 주로 사용되며 연산량이 많고 메모리 사용이 많다는 단점이 있음

 

5) Page-Hinkley method

  • 데이터셋의 평균을 계산하고 새로운 데이터가 발생할 때마다 평균을 계속 업데이트하는 방식
  • 특정 시점의 평균이 threshold보다 커지게 되면 drift 감지

 

Python Library For Model Drift Detection

Model Drift 감지를 위한 오픈소스 라이브러리들입니다.

 

1) Evidently : validation에서 배포까지 ML모델의 평가, 테스트, 모니터링을 도와주는 오픈 소스 라이브러리

 

2) whylogs : 모든 종류의 데이터를 로깅하기 위한 오픈 소스 라이브러리로, 데이터셋의 변화를 탐지하고 데이터가 원하는 방식으로 표시되는지 확인하기 위해 제약 조건을 생성하고 데이터에 대한 주요 요약 통계를 신속하게 시각화하는 데 사용할 수 있음. 데이터에 대한 주요 요약 통계를 신속하게 시각화할 수 있음

 

3) Alibi Detect : 이상치 및 adversarial, drift 감지에 중점을 둔 오픈 소스 라이브러리

 

4) Deepcheck : 데이터 무결성 확인 및 Train데이터와 Test 데이터의 drift 확인, 모델 validation을 확인할 수 있는 오픈 소스 패키지

 

Model Drift Handling 방안

Model Drift를 방지하거나 해결하는 방법에는 세 가지가 있습니다.


첫 번째, 사전 방지 방법으로, 모델 개선 없이 모델 재학습을 하는 방법

두 번째, drift 감지 후 해결 방법으로, 모델 개선 하는 방법

세 번째, 역시 drift 감지 후 해결 방법으로, 데이터를 개선하는 방법


 

[모델 개선 없이 모델 재학습]

1) 온라인 러닝(Online-learning)

  • 실제 대부분의 애플리케이션은 실시간(스트리밍) 데이터로, 모델이 한 번에 하나의 샘플을 처리고 바로 모델을 업데이트할 수 있음
  • 모델이 항상 데이터 분포의 변화를 반영하게 되어 Drift를 피하는데 도움이 됨
  • 단점) 하나의 데이터를 증분식 학습이 가능한 머신러닝이 아닐 경우 적용되기 어려움

2) 주기적인 재학습(Periodically Re-Train)

  • drift 감지를 위한 작업은 하지 않고 주기적으로 최신 데이터로 모델을 재학습
  • 재학습으로 업데이트된 모델의 지속적인 평가 필요 -  현재 데이터의 테스트 데이터셋에 대해 이전 모델보다 더 나은 성능을 보일 때만 배포
  • 단점)모델의 재학습 및 재배포 주기를 결정하는 것이 어려움
    (새로운 데이터의 수집 주기, 비즈니스 상황, 모델 재학습 및 배포 시간을 고려해야 함)

[모델 개선]

3) Re-sampling using instance selection

  • Data Drift - Covariate Shift - Sample selection bias 상황에서 적용
  • 샘플링된 데이터가 전체 데이터 모집단의 특성을 나타내도록 기본 분포(패턴)를 그대로 반영하는 적절한 인스턴스(샘플 데이터)를 선택하여 학습데이터로 적용

 

4) 모델들에 가중치를 적용한 앙상블 학습(Ensemble learning with model weighting)

  • 앙상블 학습은 여러 모델들로 결합된 예측값을 생성하는 방식으로, 최종 예측값은 개별 예측값들의 가중 평균으로 구하며, 가중치는 최근 데이터에 대한 개별 모델의 성능을 반영
  • 앙상블 학습의 motivation은 변화 발생 시 데이터가 다중 분포에 의해서 생성된다는 점
  • 각 모델이 개별적으로 데이터 분포를 특성화하고 변수와 target변수 간의 관계를 학습하며, 이러한 여러 모델들의 앙상블을 통해 더 잘 학습될 수 있음

 

5) 변수 제거(Feature dropping)

  • drift가 발생한 feature들을 삭제하는 것은 가장 간단하지만 효과적인 방법 중 하나
  • 단순히 feature들을 제거하면 정보의 손실도 발생할 수 있으므로, drift가 발생한 feature 중 중요하지 않은(ex. Feature Importance 순위 기준) feature만을 제거하는 것이 필요
  • 예시) target변수는 유지하고 한 번에 하나의 input변수만으로 여러 개의 모델을 생성한 후 테스트 데이터로 예측을 수행할 때 특정 임계치보다 성능이 낮은 변수들은 drift가 발생한 것으로 보고 제거하는 방식

 

6) 최신 데이터에 가중치 부여(Weighting Data)

  • 일부 알고리즘은 input 데이터의 중요도에 대해 가중치 부여 가능
  • 데이터가 시간에 따라 변하게 되면 최근 데이터에 더 높은 가중치를 부여하고 과거의 데이터에는 작은 가중치를 부여
  • 새로운 모델 학습 시 과거 학습 데이터를 제거하기 보다는 오래된 데이터일 수록 가중치를 작게하여 학습 데이터를 구성

[데이터 개선]

7) 데이터 전처리 

  • Data Drift - Covariate Shift - Upstream data change 상황에서 적용
  • 데이터의 측정 단위가 달라지거나, 일시적인 이상치가 발생할 경우 또는 데이터가 관측히 안 된 경우에는 데이터 수집 및 전처리 과정에서 개선

 

 

[참고자료]

  1. Machine Learning Model Drift, https://towardsdatascience.com/machine-learning-model-drift-9cc43ad530d6
  2. Concept drift detection basics, https://superwise.ai/blog/concept-drift-detection-basics/
    Drift Detection, https://medium.com/better-ml/drift-detection-6db05bf75dfe
  3. The Importance of Data Drift Detection that Data Scientists Do Not Know, https://www.analyticsvidhya.com/blog/2021/10/mlops-and-the-importance-of-data-drift-detection/
  4. 8 Concept Drift Detectoin Methods, https://www.aporia.com/learn/data-drift/concept-drift-detection-methods/
    Evidently github, https://github.com/evidentlyai/evidently
  5. whylogs github, https://github.com/whylabs/whylogs
    A Gentle inroduction to concept drift in Machine Learning, https://machinelearningmastery.com/gentle-introduction-concept-drift-machine-learning/
  6. Best practices for dealing with concept drift, https://neptune.ai/blog/concept-drift-best-practices
  7. Detect data drift(preview) on datasets, https://learn.microsoft.com/en-us/azure/machine-learning/v1/how-to-monitor-datasets?view=azureml-api-1&tabs=python