Classificação multi-Label com Deep Learning

Tweet Share

last Updated on August 31, 2020

Multi-label classification involves predicting zero or more class labels.

ao contrário das tarefas de classificação normais em que as etiquetas de classe são mutuamente exclusivas, a classificação multi-label requer algoritmos especializados de aprendizagem de máquinas que suportam a previsão de múltiplas classes não-exclusivas ou “etiquetas”.”

redes neurais de aprendizagem profunda são um exemplo de um algoritmo que suporta nativamente problemas de classificação multi-etiquetas. Modelos de rede Neural para tarefas de classificação multi-etiquetas podem ser facilmente definidos e avaliados usando a biblioteca keras deep learning.

neste tutorial, você vai descobrir como desenvolver modelos de aprendizagem profunda para classificação multi-label.

depois de completar este tutorial, você saberá:

  • classificação multi-label é uma tarefa de modelagem preditiva que envolve a previsão de zero ou mais etiquetas de classe mutuamente não-exclusivas.
  • modelos de rede Neural podem ser configurados para tarefas de classificação multi-etiquetas.
  • como avaliar uma rede neural para classificação multi-rótulo e fazer uma previsão para novos dados.

vamos começar.

classificação multi-Label com aprendizagem profunda

classificação multi-Label com aprendizagem profunda
Foto de Trevor Marron, alguns direitos reservados.

Tutorial Overview

este tutorial é dividido em três partes; eles são:

  • Multi-Etiqueta de Classificação
  • Redes Neurais para Vários Rótulos
  • Rede Neural Multi-Etiqueta de Classificação

Multi-Etiqueta de Classificação

Classificação é uma modelagem preditiva problema que envolve a saída de um rótulo de classe dado de entrada

é diferente de regressão tarefas que envolvem a previsão de um valor numérico.

tipicamente, uma tarefa de classificação envolve prever um único rótulo. Alternadamente, pode envolver a previsão da probabilidade através de duas ou mais etiquetas de classe. Nestes casos, As classes são mutuamente exclusivas, o que significa que a tarefa de classificação assume que a entrada pertence a uma única classe.

algumas tarefas de classificação requerem a previsão de mais de uma classe. Isto significa que os rótulos de classe ou a adesão de classe não são mutuamente exclusivos. Estas tarefas são referidas como classificação múltipla de etiquetas, ou classificação multi-etiquetas para abreviar.

na classificação multi-label, zero ou mais etiquetas são necessárias como saída para cada amostra de entrada, e as saídas são necessárias simultaneamente. A suposição é que as etiquetas de saída são uma função das entradas.

podemos criar um conjunto de dados de classificação sintético multi-etiquetas usando a função make_multilabel_classification() na biblioteca scikit-learn.

nosso conjunto de dados terá 1.000 amostras com 10 características de entrada. O conjunto de dados terá três saídas de etiquetas de classe para cada amostra e cada classe terá um ou dois valores (0 ou 1, por exemplo, presente ou não presente).

o exemplo completo de criação e síntese do conjunto de dados de classificação sintético multi-rótulo está listado abaixo.

1
2
3
4
5
6
7
8
9

# exemplo de um multi-etiqueta de classificação de tarefas
a partir de sklearn.conjuntos de dados de importação make_multilabel_classification
# define conjunto de dados
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
# resumir o conjunto de dados de forma
print(X. forma, y.forma)
# resumir primeiros exemplos
for i in range(10):
print(X, y)

Executando o exemplo cria o dataset e resume a forma de entrada e saída de elementos.

podemos ver que, como esperado, existem 1.000 amostras, cada uma com 10 características de entrada e três características de saída.

as primeiras 10 linhas de Entradas e Saídas são resumidas e podemos ver que todas as entradas para este conjunto de dados são numéricas e que as etiquetas de classe de saída têm 0 ou 1 valores para cada uma das três etiquetas de classe.

1
2
3
4
5
6
7
8
9
10
11
12

(1000, 10) (1000, 3)

de seguida, vamos ver como podemos desenvolver modelos de rede neural multi-etiqueta de classificação de tarefas.

Redes Neurais para etiquetas múltiplas

alguns algoritmos de aprendizagem de máquinas suportam classificação multi-label nativamente.

modelos de rede Neural podem ser configurados para suportar classificação multi-etiquetas e podem funcionar bem, dependendo das especificidades da tarefa de classificação.

classificação multi-label pode ser suportado diretamente por redes neurais simplesmente especificando o número de etiquetas alvo que há no problema como o número de nós na camada de saída. Por exemplo, uma tarefa que tem três etiquetas de saída (classes) irá exigir uma camada de saída de rede neural com três nós na camada de saída.

cada nó na camada de saída deve usar a ativação sigmoid. Isto irá prever uma probabilidade de adesão de classe para o rótulo, um valor entre 0 e 1. Finalmente, o modelo deve ser adequado com a função binária de perda de entropia cruzada.

em resumo, para configurar um modelo de rede neural para classificação multi-label, as especificações são:

  • o número de nós na camada de saída corresponde ao número de etiquetas.
  • activação sigmóide para cada nó na camada de saída.
  • binária função de perda de entropia cruzada.

podemos demonstrar isso usando a biblioteca keras deep learning.

definiremos um modelo de percepção Multicamadas (MLP) para a tarefa de classificação multi-rótulo definida na secção anterior.

Cada amostra tem 10 entradas e três saídas; portanto, a rede requer uma camada de entrada que espera 10 entradas especificadas através do “input_dim” argumento na primeira camada oculta e três nós na camada de saída.

usaremos a popular função de ativação ReLU na camada oculta. A camada oculta tem 20 nós que foram escolhidos após alguma tentativa e erro. Vamos encaixar o modelo usando a perda binária de entropia cruzada e a versão Adam de descida estocástica de gradiente.

a definição da rede para a tarefa de classificação multi-rótulo está listada abaixo.

1
2
3
4
5

# definir o modelo de
modelo = Sequencial()
modelo.add(Dense (20, input_dim=n_inputs, kernel_inicializador=’he_uniform’, activation=’relu’))
model.add(Dense (n_outputs, activation=’sigmoid’))
model.compilar(perda=’binary_crossentropy’, otimizador=’adam’)

Você pode adaptar esse modelo para sua própria multi-etiqueta de classificação de tarefas; portanto, podemos criar uma função para definir e retornar o modelo onde o número de entrada e variáveis de saída é fornecida como argumentos.

1
2
3
4
5
6
7

# obter o modelo
def get_model(n_inputs, n_outputs):
modelo = Sequencial()
modelo.add(Dense (20, input_dim=n_inputs, kernel_inicializador=’he_uniform’, activation=’relu’))
model.add(Dense (n_outputs, activation=’sigmoid’))
model.compilar(perda=’binary_crossentropy’, otimizador=’adam’)
o modelo de retorno

Agora que estamos familiarizados com a forma de definir uma MLP para multi-etiqueta de classificação, vamos explorar como este modelo pode ser avaliada.

rede Neural para classificação multi-rótulo

se o conjunto de dados é pequeno, é boa prática avaliar modelos de rede neural repetidamente no mesmo conjunto de dados e relatar o desempenho médio através das repetições.

isto é devido à natureza estocástica do algoritmo de aprendizagem.

além disso, é boa prática usar k-fold cross-validation em vez de Rain/test splits de um conjunto de dados para obter uma estimativa imparcial do desempenho do modelo ao fazer previsões sobre novos dados. Mais uma vez, só se não houver muitos dados que o processo pode ser concluído em um tempo razoável.

tendo isto em conta, avaliaremos o modelo MLP na tarefa de regressão multi-saída utilizando a validação cruzada repetida em K-fold com 10 dobras e três repetições.

o modelo MLP irá prever a probabilidade de cada rótulo da classe por padrão. Isto significa que irá prever três probabilidades para cada amostra. Estes podem ser convertidos para etiquetas de classe crisp arredondando os valores para 0 ou 1. Podemos então calcular a precisão de classificação para as etiquetas de classe crisp.

1
2
3
4
5
6
7

# fazer uma previsão no conjunto de testes
yhat = modelo.predict (X_test)
# probabilidades arredondadas para etiquetas de classe
yhat = yhat.round()
# calcular a precisão
acc = accuracy_score(y_test, yhat)

As pontuações são coletados e podem ser resumidas por relatar a média e o desvio padrão em todas as repetições e de validação cruzada dobras.

a função valuation_ model() abaixo toma o conjunto de dados, avalia o modelo e devolve uma lista de pontuações de Avaliação, neste caso, pontuações de precisão.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25

# avaliar um modelo usando repetido k-fold cross-validation
def evaluate_model(X, y):
resultados = list()
n_inputs, n_outputs = X. forma, y.a forma
# define o processo de avaliação
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# enumerar dobras
para train_ix, test_ix em cv.split(X):
# preparar dados
X_train, X_test = X, X
y_train, y_test = y, y
# define modelo
modelo = get_model(n_inputs, n_outputs)
# ajuste do modelo
modelo.ajuste(X_train, y_train, verbose=0, épocas=100)
# fazer uma previsão sobre o conjunto de teste
yhat = modelo.predict (X_test)
# probabilidades arredondadas para etiquetas de classe
yhat = yhat.round()
# calcular a precisão
acc = accuracy_score(y_test, yhat)
# armazena o resultado
print(‘>%.3F ‘ % acc)
resultados.append(acc)
retornar resultados

podemos, em seguida, carregar o conjunto de dados e avaliar o modelo de relatório e o desempenho médio.O exemplo completo é apresentado a seguir.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54

# mlp para multi-etiqueta de classificação
from numpy import média
from numpy import std
a partir de sklearn.os conjuntos de dados importam make_multilabel_classification
da sklearn.model_selecção importação Repetedkfold
de keras.os modelos importam sequenciais
de keras.camadas importam densas
de sklearn.métricas de importação accuracy_score
# obter o conjunto de dados
def get_dataset():
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
return X, y
# obter o modelo
def get_model(n_inputs, n_outputs):
modelo = Sequencial()
modelo.add(Dense (20, input_dim=n_inputs, kernel_inicializador=’he_uniform’, activation=’relu’))
model.add(Dense (n_outputs, activation=’sigmoid’))
model.compilar(perda=’binary_crossentropy’, otimizador=’adam’)
o modelo de retorno
# avaliar um modelo usando repetido k-fold cross-validation
def evaluate_model(X, y):
resultados = list()
n_inputs, n_outputs = X. forma, y.a forma
# define o processo de avaliação
cv = RepeatedKFold(n_splits=10, n_repeats=3, random_state=1)
# enumerar dobras
para train_ix, test_ix em cv.split(X):
# preparar dados
X_train, X_test = X, X
y_train, y_test = y, y
# define modelo
modelo = get_model(n_inputs, n_outputs)
# ajuste do modelo
modelo.ajuste(X_train, y_train, verbose=0, épocas=100)
# fazer uma previsão sobre o conjunto de teste
yhat = modelo.predict (X_test)
# probabilidades arredondadas para etiquetas de classe
yhat = yhat.round()
# calcular a precisão
acc = accuracy_score(y_test, yhat)
# armazena o resultado
print(‘>%.3F ‘ % acc)
resultados.append(acc)
retornar resultados
# carregar o conjunto de dados
X, y = get_dataset()
# avaliar o modelo de
resultados = evaluate_model(X, y)
# resumir o desempenho
print(‘Precisão: %.3f (%.3f)’ % (média(resultados), std(resultados)))

Executando o exemplo de relatórios de classificação de precisão para cada dobra e cada repetição, para dar uma idéia da avaliação do progresso.Nota :os seus resultados podem variar, dada a natureza estocástica do algoritmo ou procedimento de avaliação, ou diferenças na precisão numérica. Considere executar o exemplo algumas vezes e compare o resultado médio.

no final, é reportada a precisão média e o desvio-padrão. Neste caso, o modelo é mostrado para alcançar uma precisão de cerca de 81,2 por cento.

pode utilizar este código como modelo para avaliar modelos MLP nas suas próprias tarefas de classificação multi-rótulos. O número de nós e camadas no modelo pode ser facilmente adaptado e adaptado à complexidade do seu conjunto de dados.

1
2
3
4
5
6
7

>0.780
>0.820
>0.790
>0.810
>0.840
Precisão: 0.812 (0.032)

uma vez escolhida a configuração do modelo, Podemos usá-la para encaixar um modelo final em todos os dados disponíveis e fazer uma previsão para novos dados.

o exemplo abaixo demonstra isso, primeiro encaixando o modelo MLP em todo o conjunto de dados de classificação multi-label, em seguida, chamando a função predict() no modelo salvo, a fim de fazer uma previsão para uma nova linha de dados.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31

# use mlp para previsão de on multi-label classification
from numpy import asarray
from sklearn.os conjuntos de dados importam make_multilabel_classification
de keras.os modelos importam sequenciais
de keras.camadas de importação Densa
# obter o conjunto de dados
def get_dataset():
X, y = make_multilabel_classification(n_samples=1000, n_features=10, n_classes=3, n_labels=2, random_state=1)
return X, y
# obter o modelo
def get_model(n_inputs, n_outputs):
modelo = Sequencial()
modelo.add(Dense (20, input_dim=n_inputs, kernel_inicializador=’he_uniform’, activation=’relu’))
model.add(Dense (n_outputs, activation=’sigmoid’))
model.compilar(perda=’binary_crossentropy’, otimizador=’adam’)
o modelo de retorno
# carregar o conjunto de dados
X, y = get_dataset()
n_inputs, n_outputs = X. forma, y.a forma
# obter o modelo de
modelo = get_model(n_inputs, n_outputs)
# ajuste do modelo, os dados de
modelo.ajuste(X, y, verbose=0, épocas=100)
# faça uma previsão para novos dados
linha =
newX = asarray()
yhat = modelo.prever(newX)
print(‘Previsto: %s’ % yhat)

Executando o exemplo se encaixa o modelo e faz uma previsão para uma nova linha. Como esperado, a previsão contém três variáveis de saída necessárias para a tarefa de classificação multi-rótulo: as probabilidades de cada etiqueta de classe.

1
Previsto:

Leitura adicional

Esta seção fornece mais recursos sobre o tema, se você está olhando para ir mais fundo.

  • Multi-label classification, Wikipedia.
  • sklearn.conjunto.make_multilabel_classification API.
  • página inicial de Keras.
  • sklearn.model_selection.Repeti a minha API.

Summary

In this tutorial, you discovered how to develop deep learning models for multi-label classification.Especificamente, aprendeu:

  • classificação multi-label é uma tarefa de modelagem preditiva que envolve a previsão de zero ou mais etiquetas de classe mutuamente não-exclusivas.
  • modelos de rede Neural podem ser configurados para tarefas de classificação multi-etiquetas.
  • como avaliar uma rede neural para classificação multi-rótulo e fazer uma previsão para novos dados.Tem alguma pergunta?Faça suas perguntas nos comentários abaixo e farei o meu melhor para responder.

    desenvolver projetos de aprendizagem profunda com Python!

    Deep Learning with Python

    What If You Could Develop A Network in Minutes

    …com apenas algumas linhas de Python

    descubra como no meu novo Ebook:
    Deep Learning With Python

    cobre projectos de ponta a ponta sobre temas como:
    percepções Multicamadas, redes convolucionais e redes neurais recorrentes, e muito mais…

    finalmente trazer a aprendizagem profunda para
    seus próprios projetos

    pular os acadêmicos. Apenas Resultados.Veja o que tem dentro

    partilha de Tweet



+