머신러닝 디자인패턴

디자인 패턴 5 리프레이밍

판교데싸 2022. 1. 4. 09:11

3.1 디자인 패턴5 : 리프레이밍 (Reframing)

머신러닝 문제의 출력 표현을 바꾸는 방식으로
회귀 문제로 보이는 문제를 분류 문제로 전환하거나 분류 문제를 회귀 문제로 전환하는 등의 방식


3.1.1 문제

어느 지역의 강우량을 예측하는 머신러닝 모델을 만든다고 가정했을 때 이것은 회귀인가?

일단 과거부터 현재까지의 기후와 날씨 패턴이 주어진 상황에서 이후 15분의 강우량을 예측하는 문제라면
이것은 시계열 문제로 취급하는 것이 적당하다
달리 생각해보면 강우량이라는 라벨은 수치에 해당하므로 회귀 모델로도 만들 수 있기도 한데 날씨 예측이라는 것은 하다보면 상당히 난해하고 어려운 모델이라는 것을 깨닫게 되는데
예를들면 같은 강우량이라도 시간대에따라 0.3cm , 0.5cm 이런식으로 강우량이 달라질 수 있기 때문
그렇다면 이런 예측 정확도를 향상 시키려면 어떤 방법이 있을까?

기본적인 방법으로는

  1. 레이어 추가
  2. featrue 추가
  3. 추가적인 데이터 확보

이런 예시들이 있을 수 있겠지만 사실 정말로 회귀가 이 문제에 적절한 방법이냐에 대해서 생각해 볼 필요가 있는데
이런 의문으로 시작된 것이 리프레이밍


3.1.2 솔루션

중요한건 강우량이 확률적이라는 것인데 회귀 모델은 두가지 강우량 (어떤 때는 0.3 , 어떤 때는 0.5 ) 이 가능하다 할지라도
한가지 수치만으로 강우량을 예측해야한다는 것이 회귀모델의 특징으로
회귀로 강우량을 예측하는 대신 분류문제로 리프레이밍 할 수 있으며
이를 수행할 수 있는 방안은 여러가지인데 이중 한가지 방식은 이산확률분포를 모델링 하는 것
즉 강우량을 하나의 수치로 예측하는 것이 아니라 이후 15분동안의 강우량이 특정 범위 내에 있을 확률을 제공하는 멀티클래스 분류로 예측 강우량을 모델링하는 방법이 있다.

회귀문제의 접근법과 분류문제로 리프레이밍된 접근법 두가지 모두가 향후 15분 동안의 강우량을 예측한다
그러나 분류 문제로 접근하면 분포의 평균값을 선택하는 대신 , 서로 다른 양의 강우량 확률 분포 모델을 사용하고
이러한 방식으로 분포를 모델링 하면 강우량이 일반적인 종 모양 정규분포 곡선이 아닌 0에서 큰 값을 가질 수 있는 트위디 분포를 따르므로 유리하다고 한다
(실제로 이는 특정 지역의 강수율을 512-way 카테고리 분포로 예측하는 구글리서치 논문에서 취한 접근 방식)

  • 트위디 분포

작동원리

예측 대상을 하나의 수치가 아닌 이산 확률 분포로 만들면 버킷화로 인해 정밀도는 약간 떨어지더라도 완전한 확률 밀도 함수라는
유연성을 얻게 되고 분류 모델에서 제공하는 이산화 된 예측은 유연성이 부족한 회귀 모델에 비해 복잡한 대상을 학습하는 데 더 적합하다.

case) 출생률 데이터셋과 신생아 체중 예측과제

신생아 체중은 양의 실수이므로 직관적으로는 회귀인데 주어진 입력 세트의 weight_pounds의

25세 산모에게서 38주에 태어난 남아의 체중이라는 특정 입력치의 분포는 그래프와 같이 7.5를 중심으로하는 정규분포를 따른다

SELECT
 weight_pounds,
 is_male,
 gestation_weeks,
 mother_age,
 plurality,
 mother_race
FROM
 `bigquery-public-data.samples.natality`
WHERE
 weight_pounds IS NOT NULL
 AND is_male = true
 AND gestation_weeks = 38
 AND mother_age = 28
 AND mother_race = 1
 AND plurality = 1
 AND RAND() < 0.01

실제로 이런 문제를 회귀 문제의 프레임으로 바라보면 여기서 얻을수 있는 가장좋은 RMS오차는 분포의 표준편차이고
예측 결과는 7.5+-1.0으로 명시해야한다.
그러나 분포의 너비는 입력의 조합에 따라 달라지므로 너비를 학습하는 것은 그자체로 또 다른 머신러닝 문제로 복잡해질 수 있다.
이럴 경우 주어진 문제를 리프레이밍 하면 이산확률분포를 학습하는 멀티클래스 분류모델로 학습시킬 수 있고
이러한 이산화된 예측은 불확실성을 더 유연하게 포착함과 동시에 회귀 모델에 비해 복잡한 목표를 더 잘 근사한다.


트레이드 오프와 대안

회귀의 출력값을 버킷화 하는 것이나 다중예측 해드를 사용하는 것 즉 리프레이밍 기법을 사용하는 경우에는
데이터의 한계 또는 라벨의 편향에 따른 위험이 존재한다는 것을 인식해야함

1.버킷화된 출력

회귀 -> 분류 리프레밍의 대표적 방식은 출력값을 버킷화 하는 것
예를 들어 신생아 출산 시 중환자 관리가 필요한 시기를 나타내기 위한 모델은 회귀를 멀티클래스로 분류하는 것이다.
사실 하나의 범주를 예측하는 것이 실수의 연속체에서 하나의 값을 예측하는 것보다 쉽긴 하지만
실제 출력 값을 정확히 예측하기보다는 적당한 오차가 생길 수 밖에 없다.
이런경우 의학적인 결정을 버킷화된 값 기반으로 한다면 해당 버킷을 사용한 분류모델이 되어야 하므로 결국 신생아 체중에 대한 정확한 예측이 필요하다면 회귀 모델을 사용하는 것이 바람직하다.

2.라벨 편향

대상의 문제를 리프레이밍 할 때는 항상 라벨의 특징을 고려하는 것이 중요하다
하나의 예로 추천시스템에서 특정한 동영상 미리보기 이미지를 클릭할 가능성을 예측하는 분류작업으로 추천모델을 리프레이밍 했다고하면
사용자가 선택하고 시청할 콘텐츠를 제공하는 것이 목표이므로
합리적인 리프레이밍인것 같지만 이러한 라벨 변경은 사실 우리의 예측 작업을 벗어나게 된다.
사용자 클릭을 최적화하면 실제로 사용자에게 쓸만한 컨텐츠를 권장하지 않고 미끼를 만들어
사용자가 실수로 클릭하게 유도하게 될 수도 있으므로 전체적으로 적당한 라벨을 고려하는것이 중요하다.

3.예측 범위 제한하기

예측 출력 범위를 제한해야 하는 경우에도 문제를 리프레이밍 하는 것이 도움이 된다.
예를 들어 회귀문제에 대한 실제 출력 값이 [3,20]범위에 있다고 가정하면
출력 계층이 선형 활성화 함수인 회귀모델을 학습하면(시그모이드) 범위가 [0,1]인데 모델 예측이 이 범위를 벗어날 가능성이 항상 존재한다
출력 범위를 제한하면 아래 output과 같이 범위내에서 출력 값 생성

import numpy as np
import tensorflow as tf
from tensorflow import keras

MIN_Y =  3
MAX_Y = 20
input_size = 10
inputs = keras.layers.Input(shape=(input_size,))
h1 = keras.layers.Dense(20, 'relu')(inputs)
h2 = keras.layers.Dense(1, 'sigmoid')(h1)  # 0-1 range
output = keras.layers.Lambda(lambda y : (y*(MAX_Y-MIN_Y) + MIN_Y))(h2) # scaled
model = keras.Model(inputs, output)

##### fit the model
model.compile(optimizer='adam', loss='mse')
batch_size = 2048
for i in range(0, 10):
    x = np.random.rand(batch_size, input_size)
    y = 0.5*(x[:,0] + x[:,1]) * (MAX_Y-MIN_Y) + MIN_Y
    model.fit(x, y)

#####  verify
min_y = np.finfo(np.float64).max
max_y = np.finfo(np.float64).min
for i in range(0, 10):
    x = np.random.randn(batch_size, input_size)
    y = model.predict(x)
    min_y = min(y.min(), min_y)
    max_y = max(y.max(), max_y)
print('min={} max={}'.format(min_y, max_y))```

#####  output
64/64 [==============================] - 0s 1ms/step - loss: 11.7731
64/64 [==============================] - 0s 1ms/step - loss: 8.8945
64/64 [==============================] - 0s 1ms/step - loss: 5.5589
64/64 [==============================] - 0s 1ms/step - loss: 2.8898
64/64 [==============================] - 0s 1ms/step - loss: 1.6874
64/64 [==============================] - 0s 1ms/step - loss: 1.1201
64/64 [==============================] - 0s 1ms/step - loss: 0.7809
64/64 [==============================] - 0s 1ms/step - loss: 0.5787
64/64 [==============================] - 0s 1ms/step - loss: 0.3902
64/64 [==============================] - 0s 1ms/step - loss: 0.2878
min=3.0049209594726562 max=19.970529556274414
반응형
반응형