Treinar um modelo de detecção de spam de comentários com o TensorFlow Lite Model Maker

1. Antes de começar

Neste codelab, você vai analisar o código criado com o TensorFlow e o TensorFlow Lite Model Maker para criar um modelo com um conjunto de dados baseado em spam de comentários. Os dados originais estão disponíveis no Kaggle. Eles foram reunidos em um único arquivo CSV e limpos com a remoção de texto corrompido, marcação, palavras repetidas e muito mais. Isso facilitará se concentrar no modelo em vez do texto.

O código que você vai analisar é indicado aqui, mas é altamente recomendável que você o acompanhe no Colaboratory.

Pré-requisitos

  • Este codelab foi escrito para desenvolvedores experientes que ainda não conhecem o machine learning.
  • Este codelab faz parte do programa de aprendizagem Introdução à classificação de texto em apps do Flutter. Se você ainda não concluiu as atividades anteriores, pare e faça isso agora:

O que você aprenderá

  • Como instalar o TensorFlow Lite Model Maker com o Colab.
  • Como fazer o download dos dados do servidor do Colab para seu dispositivo.
  • Como usar um carregador de dados.
  • Como criar o modelo.

Pré-requisitos

2. Instalar o TensorFlow Lite Model Maker

  • Abra o Colab. A primeira célula no notebook vai instalar o TensorFLow Lite Model Maker para você:
!pip install -q tflite-model-maker

Quando esse processo for concluído, passe para a próxima célula.

3. Importar o código

A próxima célula tem uma série de importações que o código no notebook precisará usar:

import numpy as np
import os
from tflite_model_maker import configs
from tflite_model_maker import ExportFormat
from tflite_model_maker import model_spec
from tflite_model_maker import text_classifier
from tflite_model_maker.text_classifier import DataLoader

import tensorflow as tf
assert tf.__version__.startswith('2')
tf.get_logger().setLevel('ERROR')

Isso também vai verificar se você executou o TensorFlow 2.x, que é um requisito para usar o Model Maker.

4. Fazer o download dos dados

Em seguida, você fará o download dos dados do servidor do Colab para seu dispositivo e definirá a variável data_file para apontar para o arquivo local:

data_file = tf.keras.utils.get_file(fname='comment-spam.csv',
  origin='https://storage.googleapis.com/laurencemoroney-blog.appspot.com/lmblog_comments.csv',
  extract=False)

O Model Maker pode treinar modelos em arquivos CSV simples como este. É necessário apenas especificar quais colunas contêm o texto e quais contêm os rótulos. Vamos ver como fazer isso neste codelab.

5. Embeddings pré-aprendidas

Geralmente, quando você usa o Model Maker, não cria modelos do zero. É possível usar modelos personalizados de acordo com suas necessidades.

Modelos de linguagem, como este, precisam de embeddings pré-aprendidas. A ideia por trás da embedding é que as palavras sejam convertidas em números para cada palavra no seu corpus. Uma embedding é um vetor usado para determinar o sentimento em uma palavra estabelecendo uma "direção" até ela. Por exemplo, as palavras usadas com frequência em mensagens de spam de comentários têm os vetores apontados para uma direção semelhante, e as palavras não apontadas têm os vetores para a direção oposta.

Ao usar embeddings pré-aprendidas, você começa com um corpus ou coleção de palavras cujo sentimento já foi aprendido em um grande corpo de texto. O resultado é uma solução muito mais rápida do que quando você começa do zero.

O Model Maker oferece várias embeddings pré-aprendidas que podem ser usadas, mas a mais simples e rápida é a opção average_word_vec.

Veja o código para ele:

spec = model_spec.get('average_word_vec')
spec.num_words = 2000
spec.seq_len = 20
spec.wordvec_dim = 7

Parâmetro num_words

Você também especifica o número de palavras que quer que seu modelo use.

Talvez você pense "quanto mais, melhor", mas geralmente há um número certo com base na frequência de uso de cada palavra. Se você utilizar todas as palavras no corpus, o modelo poderá tentar aprender e estabelecer a direção das palavras que são aplicadas apenas uma vez. Em todos os corpus de texto, muitas palavras são usadas apenas uma ou duas vezes. Por isso, a inclusão delas no seu modelo não é vantajosa porque tem um impacto insignificante no sentimento geral.

É possível utilizar o parâmetro num_words para ajustar seu modelo com base no número de palavras que você quer. Um número menor pode gerar um modelo menor e mais rápido, mas pode ser menos preciso porque reconhece menos palavras. Por outro lado, um número maior pode resultar em um modelo maior e mais lento. É importante encontrar o ponto ideal.

Parâmetro wordvec_dim

O parâmetro wordved_dim é o número de dimensões que você quer usar para o vetor de cada palavra. A regra de ouro determina que a pesquisa é a quarta raiz do número de palavras. Por exemplo, se você usar 2.000 palavras, 7 é um bom ponto de partida. Se mudar o número de palavras, também poderá mudar essa configuração.

Parâmetro seq_len

Os modelos geralmente são muito rígidos quando se trata de valores de entrada. Para um modelo de linguagem, isso significa que ele pode classificar frases com uma duração estática específica. Isso é determinado pelo parâmetro seq_len ou pela duração da sequência.

Quando você converte palavras em números ou tokens, uma frase se torna uma sequência desses tokens. Nesse caso, seu modelo é treinado para classificar e reconhecer frases com 20 tokens. Se a frase for mais longa que isso, ela ficará truncada. Se for menor, terá padding. Você pode ver um token <PAD> dedicado no corpus usado para isso.

6. Usar um carregador de dados

Anteriormente, você fez o download do arquivo CSV. Agora é hora de usar um carregador de dados para transformá-lo em dados de treinamento que o modelo reconheça:

data = DataLoader.from_csv(
    filename=data_file,
    text_column='commenttext',
    label_column='spam',
    model_spec=spec,
    delimiter=',',
    shuffle=True,
    is_training=True)

train_data, test_data = data.split(0.9)

Se você abrir o arquivo CSV em um editor, verá que cada linha tem apenas dois valores, que são descritos com texto na primeira linha. Normalmente, cada entrada é considerada uma coluna.

Você verá que o descritor da primeira coluna é commenttext e que a primeira entrada em cada linha é o texto do comentário. Da mesma forma, o descritor da segunda coluna é spam e a segunda entrada em cada linha é True ou False, para indicar se o texto é considerado spam de comentários ou não. As outras propriedades definem a variável model_spec criada anteriormente, além de um caractere delimitador, que, nesse caso, é uma vírgula, já que o arquivo é separado por vírgulas. Você usará esses dados para treinar o modelo. Portanto, is_Training é definido como True.

Você precisará reter parte dos dados para testar o modelo. Divida os dados, sendo 90% deles para treinamento, e os outros 10% para teste/avaliação. Ao mesmo tempo, queremos garantir que os dados de teste sejam escolhidos aleatoriamente, e não os "10%" na parte inferior do conjunto de dados. Por isso, use shuffle=True ao carregar os dados para aleatorizá-los.

7. Criar o modelo

A próxima célula é simplesmente criar o modelo com uma única linha de código:

# Build the model
model = text_classifier.create(train_data, model_spec=spec, epochs=50,
                               validation_data=test_data)

Esse código cria um modelo de classificador de texto com o Model Maker, e você especifica os dados de treinamento que quer usar (configurados na quarta etapa), o modelo (configurado na quarta etapa) e um número de períodos, que é 50 nesse caso.

O princípio básico do ML é a forma de correspondência de padrões. Inicialmente, ele carrega as ponderações pré-treinadas das palavras e tenta agrupá-las com uma previsão de quais indicam spam ou não. Na primeira vez, é provável que ele seja dividido uniformemente porque o modelo está apenas começando.

c42755151d511ce.png

Em seguida, ele vai medir os resultados desse período do treinamento e executar o código de otimização para ajustar a previsão. Depois disso, você pode tentar novamente. Isso é um período. Se você especificar "epochs=50", o modelo vai passar por esse "loop" 50 vezes.

7d0ee06a5246b58d.png

Quando você chega ao período 50, o modelo informa um nível de acurácia muito maior. Nesse caso, ele mostra 99%.

Os números de acurácia de validação costumam ser um pouco menores do que a acurácia do treinamento porque são uma indicação de como o modelo classifica os dados que não foram vistos anteriormente. Ele usa os dados de teste de 10% que você determinou anteriormente.

f063ff6e1d2add67.png

8. Exportar o modelo

  1. Execute esta célula para especificar um diretório e exportar o modelo:
model.export(export_dire='/mm_spam_savedmodel', export_format=[ExportFormat.LABEL, ExportFormat.VOCAB, ExportFormat.SAVED_MODEL])
  1. Compacte toda a pasta /mm_spam_savedmodel e o arquivo mm_spam_savedmodel.zip gerado, que será necessário no próximo codelab.
# Rename the SavedModel subfolder to a version number
!mv /mm_spam_savedmodel/saved_model /mm_spam_savedmodel/123
!zip -r mm_spam_savedmodel.zip /mm_spam_savedmodel/

9. Parabéns

Este codelab mostrou o código Python para criar e exportar seu modelo. Agora você tem um SavedModel e os rótulos e o vocabulário. No próximo codelab, você vai aprender a usar esse modelo para começar a classificar comentários de spam.

Saiba mais