terça-feira, 23 de julho de 2024

Como Implementar um Modelo de Classificação de Texto com NLP e Scikit-learn


Fala pessoal, tudo certo?

Hoje vamos "brincar" um pouco com um modelo de classificação de texto :)

Vamos mostrar como implementar um modelo de classificação de texto usando Natural Language Processing (NLP) e Scikit-learn. Vamos dividir o processo em duas partes:

  1. Criar um arquivo CSV com os dados de exemplo.
  2. Escrever o código Python para carregar os dados, treinar o modelo e fazer previsões.

Parte 1: Criar o Arquivo CSV

Primeiro, vamos criar um arquivo CSV chamado data.csv com dados de exemplo. Este arquivo conterá duas colunas: text e target.

text,target

"Eu adoro o serviço prestado, muito bom!",positivo

"Esse produto é horrível e não vale o preço.",negativo

"Excelente qualidade e atendimento rápido.",positivo

"Não gostei, a entrega foi atrasada e o produto veio com defeito.",negativo

"Ótimo custo-benefício, recomendaria para amigos.",positivo

"Não recomendo, tive uma péssima experiência.",negativo

"Produto fantástico, atende todas as expectativas!",positivo

"Serviço ruim e atendimento ao cliente não responde.",negativo

Salve o arquivo.

Parte 2: Código Python para Treinamento e Previsão

Agora, vamos escrever o código para carregar os dados, treinar um modelo de classificação de texto e fazer previsões.

import pandas as pd
from sklearn.model_selection import train_test_split, StratifiedShuffleSplit
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.naive_bayes import MultinomialNB
from sklearn.pipeline import make_pipeline
from sklearn.metrics import classification_report

# Carregar os dados
df = pd.read_csv('data.csv')

# Verificar os dados
print("Primeiras linhas dos dados:")
print(df.head())
print("\nDistribuição das classes:")
print(df['target'].value_counts())

# Separar características e alvo
X = df['text']
y = df['target']

# Dividir os dados em conjuntos de treino e teste com preservação das classes
splitter = StratifiedShuffleSplit(n_splits=1, test_size=0.2, random_state=42)
for train_index, test_index in splitter.split(X, y):
    X_train, X_test = X.iloc[train_index], X.iloc[test_index]
    y_train, y_test = y.iloc[train_index], y.iloc[test_index]

# Criar o pipeline
model = make_pipeline(TfidfVectorizer(), MultinomialNB(alpha=1.0))

# Treinar o modelo
model.fit(X_train, y_train)

# Fazer previsões
y_pred = model.predict(X_test)

# Avaliar o modelo
print("\nRelatório de Classificação:")
print(classification_report(y_test, y_pred, zero_division=1))

Salve este código em um arquivo chamado text_classification.py

O Que Fazer em Seguida?

  1. Certifique-se de que o arquivo data.csv está no mesmo diretório que o script de classificação.
  2. Estando tudo no mesmo diretório e os arquivos salvos sem erros, vamos executá-lo:
python3 text_classification.py

O Que Esperar na Saída

  • Distribuição das Classes: Mostra quantos exemplos existem para cada classe no seu conjunto de dados.
  • Relatório de Classificação: Fornece métricas como precisionrecall, e f1-score para cada classe. Se o modelo estiver funcionando corretamente, você deve ver valores diferentes de zero para essas métricas.
Exemplo da saída esperada:


Explicação do Exemplo:

  • Precision, Recall, e F1-Score para Cada Classe (A e B): Avaliam o desempenho do modelo para cada classe individualmente.
  • Accuracy (Precisão Geral): Proporção geral de previsões corretas em relação ao total de previsões.
  • Macro Average: Média das métricas (precisão, revocação e F1-Score) calculadas para cada classe sem considerar o suporte.
  • Weighted Average: Média das métricas (precisão, revocação e F1-Score) ponderada pelo suporte de cada classe.
Um pouco mais de detalhes de como se chegou nisso.

1. Precision (Precisão)

Definição: A precisão é a proporção de verdadeiros positivos em relação ao total de previsões positivas feitas pelo modelo. Em outras palavras, de todas as vezes que o modelo previu uma determinada classe, quantas vezes ele estava correto?


Interpretação: Uma alta precisão significa que quando o modelo prevê uma classe, é mais provável que a previsão esteja correta. A precisão é importante quando o custo de uma previsão incorreta é alto.

2. Recall (Revocação) ou Sensitivity (Sensibilidade)

Definição: A revocação é a proporção de verdadeiros positivos em relação ao total de instâncias reais dessa classe. Ou seja, de todas as instâncias que realmente pertencem a uma classe, quantas o modelo conseguiu identificar corretamente?


Interpretação: Uma alta revocação indica que o modelo é bom em identificar todas as instâncias de uma determinada classe. A revocação é importante quando perder uma instância positiva é crítico.

3. F1-Score

Definição: O F1-Score é a média harmônica da precisão e da revocação. É uma métrica que combina ambas, fornecendo uma única pontuação que leva em conta tanto a precisão quanto a revocação.

Interpretação: O F1-Score é útil quando você precisa de um equilíbrio entre precisão e revocação e quando há uma distribuição desigual entre as classes.

4. Support (Suporte)

Definição: O suporte é o número de ocorrências de cada classe no conjunto de teste. Representa quantas instâncias de cada classe estão presentes na verdade.

Interpretação: O suporte ajuda a entender o quão bem o modelo está performando em cada classe com base no número real de instâncias dessa classe no conjunto de teste.

É isso.
O tema é bem complexo mesmo, mas achei legal trazer com um exemplo mais prático para vermos de forma simplificada e muito, mas muito macro de como funciona essa parte de análise de dados.

Até a próxima.
Abs
:wq!

Nenhum comentário:

Postar um comentário