CNTK-성능 측정
이 장에서는 CNKT에서 모델 성능을 측정하는 방법을 설명합니다.
모델 성능을 검증하는 전략
ML 모델을 구축 한 후 데이터 샘플 세트를 사용하여 학습했습니다. 이 훈련을 통해 우리의 ML 모델은 몇 가지 일반적인 규칙을 배우고 도출합니다. ML 모델의 성능은 새로운 샘플, 즉 훈련 당시 제공된 것과 다른 샘플을 모델에 공급할 때 중요합니다. 이 경우 모델은 다르게 작동합니다. 새로운 샘플에 대해 좋은 예측을하는 것이 더 나쁠 수 있습니다.
그러나 프로덕션 환경에서는 학습 목적으로 샘플 데이터를 사용한 것과 다른 입력을 받기 때문에 모델은 새 샘플에서도 잘 작동해야합니다. 그렇기 때문에 학습 목적으로 사용한 샘플과 다른 샘플 세트를 사용하여 ML 모델을 검증해야합니다. 여기서는 NN 검증을위한 데이터 세트를 생성하는 두 가지 다른 기술에 대해 설명합니다.
홀드 아웃 데이터 세트
NN을 검증하기 위해 데이터 세트를 생성하는 가장 쉬운 방법 중 하나입니다. 이름에서 알 수 있듯이이 방법에서는 학습에서 한 세트의 샘플 (예 : 20 %)을 보류하고이를 사용하여 ML 모델의 성능을 테스트합니다. 다음 다이어그램은 훈련 샘플과 검증 샘플 간의 비율을 보여줍니다.
홀드 아웃 데이터 세트 모델은 ML 모델을 훈련하기에 충분한 데이터를 확보하는 동시에 모델 성능을 잘 측정 할 수있는 합리적인 수의 샘플을 확보 할 수 있도록합니다.
학습 세트와 테스트 세트에 포함하려면 기본 데이터 세트에서 무작위 샘플을 선택하는 것이 좋습니다. 훈련 세트와 테스트 세트 사이에 균일 한 분배를 보장합니다.
다음은 사용하여 자체 홀드 아웃 데이터 세트를 생성하는 예입니다. train_test_split 기능 scikit-learn 도서관.
예
from sklearn.datasets import load_iris
iris = load_iris()
X = iris.data
y = iris.target
from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=1)
# Here above test_size = 0.2 represents that we provided 20% of the data as test data.
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
classifier_knn = KNeighborsClassifier(n_neighbors=3)
classifier_knn.fit(X_train, y_train)
y_pred = classifier_knn.predict(X_test)
# Providing sample data and the model will make prediction out of that data
sample = [[5, 5, 3, 2], [2, 4, 3, 5]]
preds = classifier_knn.predict(sample)
pred_species = [iris.target_names[p] for p in preds] print("Predictions:", pred_species)
산출
Predictions: ['versicolor', 'virginica']
CNTK를 사용하는 동안 모델을 훈련 할 때마다 데이터 세트의 순서를 무작위 화해야합니다.
딥 러닝 알고리즘은 난수 생성기의 영향을 많이받습니다.
훈련 중에 NN에 샘플을 제공하는 순서는 성능에 큰 영향을 미칩니다.
홀드 아웃 데이터 세트 기술을 사용할 때의 주요 단점은 때로는 매우 좋은 결과를 얻지 만 때로는 나쁜 결과를 얻기 때문에 신뢰할 수 없다는 것입니다.
K- 폴드 크로스 검증
ML 모델을 더 안정적으로 만들기 위해 K- 폴드 교차 검증이라는 기술이 있습니다. 본질적으로 K-fold 교차 검증 기법은 이전 기법과 동일하지만이를 여러 번 반복합니다 (보통 5 ~ 10 번 정도). 다음 다이어그램은 그 개념을 나타냅니다.
K- 폴드 교차 검증 작업
K- 폴드 교차 검증의 작동은 다음 단계를 통해 이해할 수 있습니다.
Step 1− Hand-out 데이터 세트 기술과 마찬가지로 K-fold 교차 검증 기술에서 먼저 데이터 세트를 훈련 및 테스트 세트로 분할해야합니다. 이상적으로 비율은 80-20, 즉 훈련 세트의 80 %와 테스트 세트의 20 %입니다.
Step 2 − 다음으로 훈련 세트를 사용하여 모델을 훈련해야합니다.
Step 3− 마지막으로 우리는 모델의 성능을 측정하기 위해 테스트 세트를 사용할 것입니다. 홀드 아웃 데이터 세트 기법과 k-cross 검증 기법의 유일한 차이점은 위의 프로세스가 일반적으로 5 ~ 10 회 반복되고 마지막에 모든 성능 메트릭에 대해 평균이 계산된다는 것입니다. 그 평균이 최종 성능 지표가 될 것입니다.
작은 데이터 세트의 예를 보겠습니다.
예
from numpy import array
from sklearn.model_selection import KFold
data = array([0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0])
kfold = KFold(5, True, 1)
for train, test in kfold.split(data):
print('train: %s, test: %s' % (data[train],(data[test]))
산출
train: [0.1 0.2 0.4 0.5 0.6 0.7 0.8 0.9], test: [0.3 1. ]
train: [0.1 0.2 0.3 0.4 0.6 0.8 0.9 1. ], test: [0.5 0.7]
train: [0.2 0.3 0.5 0.6 0.7 0.8 0.9 1. ], test: [0.1 0.4]
train: [0.1 0.3 0.4 0.5 0.6 0.7 0.9 1. ], test: [0.2 0.8]
train: [0.1 0.2 0.3 0.4 0.5 0.7 0.8 1. ], test: [0.6 0.9]
보다 현실적인 훈련 및 테스트 시나리오를 사용하기 때문에 k-fold 교차 검증 기술은 훨씬 더 안정적인 성능 측정을 제공하지만 단점은 딥 러닝 모델을 검증 할 때 많은 시간이 걸립니다.
CNTK는 k-cross 유효성 검사를 지원하지 않으므로이를 위해 자체 스크립트를 작성해야합니다.
과소 적합 및 과적 합 감지
유인물 데이터 세트를 사용하든 k- 폴드 교차 검증 기술을 사용하든, 우리는 메트릭의 출력이 훈련에 사용 된 데이터 세트와 검증에 사용되는 데이터 세트에 대해 다를 것이라는 것을 발견 할 것입니다.
과적 합 감지
과적 합이라고하는 현상은 ML 모델이 훈련 데이터를 예외적으로 잘 모델링하지만 테스트 데이터에서 잘 수행하지 못하는 상황입니다. 즉, 테스트 데이터를 예측할 수 없습니다.
ML 모델이 학습 데이터에서 특정 패턴과 노이즈를 어느 정도 학습 할 때 발생하며, 학습 데이터에서 새로운 데이터, 즉 보이지 않는 데이터로 일반화하는 모델의 능력에 부정적인 영향을 미칩니다. 여기에서 노이즈는 데이터 세트의 무관 한 정보 또는 임의성입니다.
다음은 모델이 과적 합한지 아닌지 날씨를 감지 할 수있는 두 가지 방법입니다.
과적 합 모델은 우리가 훈련에 사용한 것과 동일한 샘플에서 잘 수행되지만 새 샘플, 즉 훈련과 다른 샘플에서는 매우 좋지 않습니다.
테스트 세트의 메트릭이 동일한 메트릭보다 낮 으면 검증 중에 모델이 과적 합 된 것이므로 훈련 세트에서 사용합니다.
과소 적합 감지
ML에서 발생할 수있는 또 다른 상황은 부적합입니다. 이것은 우리의 ML 모델이 훈련 데이터를 잘 모델링하지 못하고 유용한 출력을 예측하지 못하는 상황입니다. 첫 번째 에포크 훈련을 시작하면 모델이 과소 적합되지만 훈련이 진행됨에 따라 덜 적합 해집니다.
모델이 부족한지 여부를 감지하는 방법 중 하나는 학습 세트 및 테스트 세트에 대한 메트릭을 보는 것입니다. 테스트 세트의 메트릭이 훈련 세트의 메트릭보다 높으면 모델이 과소 적합됩니다.