CNTK - Modelo de Classificação

Este capítulo o ajudará a entender como medir o desempenho do modelo de classificação no CNTK. Vamos começar com a matriz de confusão.

Matriz de confusão

Matriz de confusão - uma tabela com a saída prevista versus a saída esperada é a maneira mais fácil de medir o desempenho de um problema de classificação, onde a saída pode ser de dois ou mais tipos de classes.

Para entender como funciona, vamos criar uma matriz de confusão para um modelo de classificação binária que prevê se uma transação com cartão de crédito foi normal ou uma fraude. É mostrado da seguinte forma -

Fraude real Normal real

Predicted fraud

Verdadeiro positivo

Falso positivo

Predicted normal

Falso negativo

Verdadeiro negativo

Como podemos ver, o exemplo de matriz de confusão acima contém 2 colunas, uma para fraude de classe e outra para normal de classe. Da mesma forma, temos 2 linhas, uma é adicionada para fraude de classe e outra é adicionada para classe normal. A seguir está a explicação dos termos associados à matriz de confusão -

  • True Positives - Quando a classe real e a classe prevista do ponto de dados são 1.

  • True Negatives - Quando a classe real e a classe prevista do ponto de dados são 0.

  • False Positives - Quando a classe real do ponto de dados é 0 e a classe prevista do ponto de dados é 1.

  • False Negatives - Quando a classe real do ponto de dados é 1 e a classe prevista do ponto de dados é 0.

Vamos ver como podemos calcular o número de coisas diferentes da matriz de confusão -

  • Accuracy- É o número de previsões corretas feitas por nosso modelo de classificação de ML. Pode ser calculado com a ajuda da seguinte fórmula -

  • Precision−Ele nos diz quantas amostras foram preditas corretamente de todas as amostras que previmos. Pode ser calculado com a ajuda da seguinte fórmula -

  • Recall or Sensitivity- Recall é o número de positivos retornados por nosso modelo de classificação de ML. Em outras palavras, ele nos informa quantos casos de fraude no conjunto de dados foram realmente detectados pelo modelo. Pode ser calculado com a ajuda da seguinte fórmula -

  • Specificity- Ao invés de lembrar, ele fornece o número de negativos retornados por nosso modelo de classificação de ML. Pode ser calculado com a ajuda da seguinte fórmula -

Medida F

Podemos usar a medida F como uma alternativa da matriz de confusão. A principal razão por trás disso é que não podemos maximizar o recall e a precisão ao mesmo tempo. Há uma relação muito forte entre essas métricas e isso pode ser entendido com a ajuda do exemplo a seguir -

Suponha que queremos usar um modelo DL para classificar as amostras de células como cancerosas ou normais. Aqui, para atingir a precisão máxima, precisamos reduzir o número de previsões para 1. Embora isso possa nos dar cerca de 100 por cento de precisão, mas a recuperação ficará muito baixa.

Por outro lado, se quisermos atingir o máximo de recall, precisamos fazer tantas previsões quanto possível. Embora isso possa nos dar cerca de 100 por cento de recall, mas a precisão se tornará muito baixa.

Na prática, precisamos encontrar uma maneira de equilibrar precisão e recall. A métrica de medida F nos permite fazer isso, pois expressa uma média harmônica entre precisão e recall.

Essa fórmula é chamada de medida F1, onde o termo extra chamado B é definido como 1 para obter uma proporção igual de precisão e recuperação. Para enfatizar a recuperação, podemos definir o fator B para 2. Por outro lado, para enfatizar a precisão, podemos definir o fator B para 0,5.

Usando CNTK para medir o desempenho da classificação

Na seção anterior, criamos um modelo de classificação usando o conjunto de dados de flores Iris. Aqui, estaremos medindo seu desempenho usando a matriz de confusão e a métrica F-measure.

Criando matriz de confusão

Já criamos o modelo, então podemos iniciar o processo de validação, que inclui confusion matrix, na mesma. Primeiro, vamos criar uma matriz de confusão com a ajuda doconfusion_matrix função de scikit-learn. Para isso, precisamos dos rótulos reais para nossas amostras de teste e os rótulos previstos para as mesmas amostras de teste.

Vamos calcular a matriz de confusão usando o seguinte código python -

from sklearn.metrics import confusion_matrix
y_true = np.argmax(y_test, axis=1)
y_pred = np.argmax(z(X_test), axis=1)
matrix = confusion_matrix(y_true=y_true, y_pred=y_pred)
print(matrix)

Resultado

[[10 0 0]
[ 0 1 9]
[ 0 0 10]]

Também podemos usar a função de mapa de calor para visualizar uma matriz de confusão da seguinte forma -

import seaborn as sns
import matplotlib.pyplot as plt
g = sns.heatmap(matrix,
     annot=True,
     xticklabels=label_encoder.classes_.tolist(),
     yticklabels=label_encoder.classes_.tolist(),
     cmap='Blues')
g.set_yticklabels(g.get_yticklabels(), rotation=0)
plt.show()

Devemos também ter um único número de desempenho, que podemos usar para comparar o modelo. Para isso, precisamos calcular o erro de classificação usandoclassification_error função, do pacote de métricas no CNTK como feito durante a criação do modelo de classificação.

Agora, para calcular o erro de classificação, execute o método de teste na função de perda com um conjunto de dados. Depois disso, o CNTK pegará as amostras que fornecemos como entrada para esta função e fará uma previsão com base nos recursos de entrada X_test.

loss.test([X_test, y_test])

Resultado

{'metric': 0.36666666666, 'samples': 30}

Implementando medidas F

Para implementar F-Measures, o CNTK também inclui uma função chamada fmeasures. Podemos usar esta função, enquanto treinamos o NN, substituindo a célulacntk.metrics.classification_error, com uma chamada para cntk.losses.fmeasure ao definir a função de fábrica de critérios da seguinte forma -

import cntk
@cntk.Function
def criterion_factory(output, target):
   loss = cntk.losses.cross_entropy_with_softmax(output, target)
metric = cntk.losses.fmeasure(output, target)
   return loss, metric

Depois de usar a função cntk.losses.fmeasure, obteremos uma saída diferente para o loss.test chamada de método fornecida a seguir -

loss.test([X_test, y_test])

Resultado

{'metric': 0.83101488749, 'samples': 30}