CNTK-회귀 모델

여기서는 회귀 모델과 관련하여 성능을 측정하는 방법에 대해 알아 봅니다.

회귀 모델 검증의 기초

회귀 모델이 분류 모델과 다르다는 것을 알고 있듯이 개인의 표본에 대한 옳고 그름에 대한 이진 측정이 없습니다. 회귀 모델에서는 예측이 실제 값에 얼마나 가까운 지 측정하려고합니다. 예측 값이 예상 출력에 가까울수록 모델 성능이 향상됩니다.

여기에서는 다양한 오류율 함수를 사용하여 회귀에 사용되는 NN의 성능을 측정합니다.

오차 한계 계산

앞서 논의했듯이 회귀 모델을 검증하는 동안 예측이 옳은지 틀린지 말할 수 없습니다. 우리는 예측이 가능한 한 실제 값에 가까워지기를 원합니다. 그러나 여기에서는 작은 오차 한계가 허용됩니다.

오차 한계를 계산하는 공식은 다음과 같습니다.

여기,

Predicted value = 모자로 y 표시

Real value = y에 의해 예측 됨

먼저 예측 값과 실제 값 사이의 거리를 계산해야합니다. 그런 다음 전체 오류율을 얻으려면이 제곱 거리를 합하고 평균을 계산해야합니다. 이것은mean squared 오류 기능.

그러나 오차 한계를 표현하는 성능 수치를 원한다면 절대 오차를 표현하는 공식이 필요합니다. 공식mean absolute 오류 기능은 다음과 같습니다-

위의 공식은 예측 값과 실제 값 사이의 절대 거리를 사용합니다.

CNTK를 사용하여 회귀 성능 측정

여기에서는 CNTK와 함께 논의한 다양한 메트릭을 사용하는 방법을 살펴 보겠습니다. 아래 단계를 사용하여 자동차의 갤런 당 마일을 예측하는 회귀 모델을 사용합니다.

구현 단계

Step 1 − 먼저 필요한 구성 요소를 다음에서 가져와야합니다. cntk 다음과 같이 패키지-

from cntk import default_option, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import relu

Step 2 − 다음으로, 다음을 사용하여 기본 활성화 함수를 정의해야합니다. default_options기능. 그런 다음 새 순차 계층 집합을 만들고 각각 64 개의 뉴런이있는 두 개의 Dense 계층을 제공합니다. 그런 다음 추가 Dense 레이어 (출력 레이어 역할을 할)를 Sequential 레이어 세트에 추가하고 다음과 같이 활성화없이 1 개의 뉴런을 제공합니다.

with default_options(activation=relu):
model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)])

Step 3− 네트워크가 생성되면 입력 기능을 생성해야합니다. 훈련에 사용할 기능과 모양이 같은지 확인해야합니다.

features = input_variable(X.shape[1])

Step 4 − 이제 우리는 또 다른 input_variable NN에 대한 예상 값을 저장하는 데 사용됩니다.

target = input_variable(1)
z = model(features)

이제 우리는 모델을 훈련시켜야하고 그렇게하기 위해 다음 구현 단계를 사용하여 데이터 셋을 분할하고 전처리를 수행 할 것입니다.

Step 5− 먼저, sklearn.preprocessing에서 StandardScaler를 가져와 -1과 +1 사이의 값을 가져옵니다. 이것은 NN에서 폭발적인 기울기 문제를 방지하는 데 도움이 될 것입니다.

from sklearn.preprocessing import StandardScalar

Step 6 − 다음으로 sklearn.model_selection에서 train_test_split을 다음과 같이 가져옵니다.

from sklearn.model_selection import train_test_split

Step 7 − 드롭 mpg 열을 사용하여 데이터 세트에서 drop방법. 마지막으로 다음을 사용하여 데이터 세트를 훈련 및 검증 세트로 분할합니다.train_test_split 다음과 같이 기능-

x = df_cars.drop(columns=[‘mpg’]).values.astype(np.float32)
y=df_cars.iloc[: , 0].values.reshape(-1, 1).astype(np.float32)
scaler = StandardScaler()
X = scaler.fit_transform(x)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

Step 8 − 이제 크기가 1 인 또 다른 input_variable을 생성해야합니다. NN에 대한 예상 값을 저장하는 데 사용됩니다.

target = input_variable(1)
z = model(features)

데이터를 분할하고 전처리 했으므로 이제 NN을 훈련해야합니다. 회귀 모델을 만드는 동안 이전 섹션에서했던 것처럼 손실과 손실의 조합을 정의해야합니다.metric 모델을 훈련시키는 기능.

import cntk
def absolute_error(output, target):
   return cntk.ops.reduce_mean(cntk.ops.abs(output – target))
@ cntk.Function
def criterion_factory(output, target):
   loss = squared_error(output, target)
   metric = absolute_error(output, target)
   return loss, metric

이제 훈련 된 모델을 사용하는 방법을 살펴 보겠습니다. 모델의 경우 손실 및 메트릭 조합으로 criterion_factory를 사용합니다.

from cntk.losses import squared_error
from cntk.learners import sgd
from cntk.logging import ProgressPrinter
progress_printer = ProgressPrinter(0)
loss = criterion_factory (z, target)
learner = sgd(z.parameters, 0.001)
training_summary=loss.train((x_train,y_train),parameter_learners=[learner],callbacks=[progress_printer],minibatch_size=16,max_epochs=10)

완전한 구현 예

from cntk import default_option, input_variable
from cntk.layers import Dense, Sequential
from cntk.ops import relu
with default_options(activation=relu):
model = Sequential([Dense(64),Dense(64),Dense(1,activation=None)])
features = input_variable(X.shape[1])
target = input_variable(1)
z = model(features)
from sklearn.preprocessing import StandardScalar
from sklearn.model_selection import train_test_split
x = df_cars.drop(columns=[‘mpg’]).values.astype(np.float32)
y=df_cars.iloc[: , 0].values.reshape(-1, 1).astype(np.float32)
scaler = StandardScaler()
X = scaler.fit_transform(x)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
target = input_variable(1)
z = model(features)
import cntk
def absolute_error(output, target):
   return cntk.ops.reduce_mean(cntk.ops.abs(output – target))
@ cntk.Function
def criterion_factory(output, target):
loss = squared_error(output, target)
metric = absolute_error(output, target)
return loss, metric
from cntk.losses import squared_error
from cntk.learners import sgd
from cntk.logging import ProgressPrinter
progress_printer = ProgressPrinter(0)
loss = criterion_factory (z, target)
learner = sgd(z.parameters, 0.001)
training_summary=loss.train((x_train,y_train),parameter_learners=[learner],callbacks=[progress_printer],minibatch_size=16,max_epochs=10)

산출

-------------------------------------------------------------------
average  since   average   since  examples
loss     last    metric    last
------------------------------------------------------
Learning rate per minibatch: 0.001
690       690     24.9     24.9       16
654       636     24.1     23.7       48
[………]

회귀 모델을 검증하려면 모델이 학습 데이터와 마찬가지로 새 데이터를 처리하는지 확인해야합니다. 이를 위해 우리는test 방법 lossmetric 다음과 같이 테스트 데이터와 결합-

loss.test([X_test, y_test])

출력

{'metric': 1.89679785619, 'samples': 79}