CNTK - Medindo Desempenho

Este capítulo irá explicar como medir o desempenho do modelo no CNKT.

Estratégia para validar o desempenho do modelo

Depois de construir um modelo de ML, costumávamos treiná-lo usando um conjunto de amostras de dados. Por causa desse treinamento, nosso modelo de ML aprende e deriva algumas regras gerais. O desempenho do modelo de ML é importante quando fornecemos ao modelo novas amostras, ou seja, amostras diferentes das fornecidas no momento do treinamento. O modelo se comporta de maneira diferente nesse caso. Pode ser pior fazer uma boa previsão sobre essas novas amostras.

Mas o modelo também deve funcionar bem para novas amostras, porque no ambiente de produção obteremos uma entrada diferente daquela usada para os dados de amostra para fins de treinamento. É por isso que devemos validar o modelo de ML usando um conjunto de amostras diferente das amostras que usamos para fins de treinamento. Aqui, vamos discutir duas técnicas diferentes para criar um conjunto de dados para validar um NN.

Conjunto de dados de retenção

É um dos métodos mais fáceis de criar um conjunto de dados para validar um NN. Como o nome indica, neste método iremos reter um conjunto de amostras do treinamento (digamos, 20%) e usá-lo para testar o desempenho do nosso modelo de ML. O diagrama a seguir mostra a proporção entre as amostras de treinamento e validação -

O modelo de conjunto de dados de sustentação garante que tenhamos dados suficientes para treinar nosso modelo de ML e, ao mesmo tempo, teremos um número razoável de amostras para obter uma boa medição do desempenho do modelo.

Para incluir no conjunto de treinamento e no conjunto de teste, é uma boa prática escolher amostras aleatórias do conjunto de dados principal. Ele garante uma distribuição uniforme entre o conjunto de treinamento e teste.

A seguir está um exemplo em que estamos produzindo nosso próprio conjunto de dados de validação usando train_test_split função do scikit-learn biblioteca.

Exemplo

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)

Resultado

Predictions: ['versicolor', 'virginica']

Ao usar o CNTK, precisamos randomizar a ordem de nosso conjunto de dados cada vez que treinamos nosso modelo porque -

  • Algoritmos de aprendizado profundo são altamente influenciados pelos geradores de números aleatórios.

  • A ordem em que fornecemos as amostras ao NN durante o treinamento afeta muito seu desempenho.

A principal desvantagem de usar a técnica de conjunto de dados de validação é que ela não é confiável porque às vezes obtemos resultados muito bons, mas às vezes obtemos resultados ruins.

Validação cruzada K-fold

Para tornar nosso modelo de ML mais confiável, existe uma técnica chamada validação cruzada K-fold. Na natureza, a técnica de validação cruzada K-fold é a mesma que a técnica anterior, mas a repete várias vezes - geralmente cerca de 5 a 10 vezes. O diagrama a seguir representa seu conceito -

Trabalho de validação cruzada K-fold

O funcionamento da validação cruzada K-fold pode ser compreendido com a ajuda das seguintes etapas -

Step 1- Como na técnica de conjunto de dados Hand-out, na técnica de validação cruzada K-fold, primeiro precisamos dividir o conjunto de dados em um conjunto de treinamento e teste. Idealmente, a proporção é de 80-20, ou seja, 80% do conjunto de treinamento e 20% do conjunto de teste.

Step 2 - Em seguida, precisamos treinar nosso modelo usando o conjunto de treinamento.

Step 3- Por último, usaremos o conjunto de testes para medir o desempenho do nosso modelo. A única diferença entre a técnica de conjunto de dados Hold-out e a técnica de validação k-cross é que o processo acima é repetido geralmente de 5 a 10 vezes e, no final, a média é calculada sobre todas as métricas de desempenho. Essa média seria a métrica de desempenho final.

Vejamos um exemplo com um pequeno conjunto de dados -

Exemplo

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]))

Resultado

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]

Como vemos, por usar um cenário de treinamento e teste mais realista, a técnica de validação cruzada k-fold nos dá uma medição de desempenho muito mais estável, mas, por outro lado, leva muito tempo para validar modelos de aprendizado profundo.

O CNTK não oferece suporte para validação k-cross, portanto, precisamos escrever nosso próprio script para fazê-lo.

Detectando underfitting e overfitting

Quer usemos o conjunto de dados Hand-out ou a técnica de validação cruzada k-fold, descobriremos que a saída para as métricas será diferente para o conjunto de dados usado para treinamento e o conjunto de dados usado para validação.

Detectando overfitting

O fenômeno chamado overfitting é uma situação em que nosso modelo de ML modela os dados de treinamento excepcionalmente bem, mas falha em ter um bom desempenho nos dados de teste, ou seja, não foi capaz de prever os dados de teste.

Acontece quando um modelo de ML aprende um padrão específico e ruído dos dados de treinamento a tal ponto que afeta negativamente a capacidade do modelo de generalizar dos dados de treinamento para novos, ou seja, dados não vistos. Aqui, o ruído é a informação irrelevante ou aleatoriedade em um conjunto de dados.

A seguir estão as duas maneiras com a ajuda das quais podemos detectar se nosso modelo está ajustado demais ou não -

  • O modelo de overfit terá um bom desempenho nas mesmas amostras que usamos para o treinamento, mas terá um desempenho muito ruim nas novas amostras, ou seja, amostras diferentes do treinamento.

  • O modelo é ajustado demais durante a validação se a métrica no conjunto de teste for inferior à mesma que usamos em nosso conjunto de treinamento.

Detectando underfitting

Outra situação que pode surgir em nosso ML é underfitting. Esta é uma situação em que nosso modelo de ML não modelou bem os dados de treinamento e não consegue prever resultados úteis. Quando começamos a treinar na primeira época, nosso modelo será insuficiente, mas se tornará menos inadequado com o progresso do treinamento.

Uma das maneiras de detectar se nosso modelo é insuficiente ou não é examinar as métricas do conjunto de treinamento e do conjunto de teste. Nosso modelo será insuficiente se a métrica no conjunto de teste for maior do que a métrica no conjunto de treinamento.