Me siga no X | Me siga no LinkedIn | Apoie a Newsletter | Solicite uma consultoria
No último texto da newsletter, falamos de maneira mais abrangente sobre a área de aprendizado de máquina, abordando brevemente os principais tipos de aprendizado: o supervisionado, o não-supervisionado e o semi-supervisionado.
No aprendizado supervisionado, mencionamos dois dos seus principais métodos: os métodos baseados em regressão e os métodos baseados classificação. Ainda nesta newsletter, também já escrevemos como empregar um método de regressão; nesse texto, vamos discutir métodos de classificação de dados.
A classificação se refere à tarefa de atribuir categorias ou rótulos a um conjunto de dados com base em suas características. Imagine, por exemplo, que temos a tarefa de ensinar um computador a classificar emails como spam ou não-spam com base em suas características.
Com um conjunto de dados contendo uma variedade de emails etiquetados corretamente, poderíamos construir um modelo de aprendizado de máquina que possa automaticamente distinguir entre mensagens indesejadas e legítimas.
Quando um novo email chega à caixa de entrada, o modelo analisará suas características (como palavras-chave, remetente e formatação) e o classificará como spam ou não-spam com base nas semelhanças com os exemplos previamente rotulados. Isso é exatamente o que a classificação em algoritmos supervisionados faz.
Nesse texto, vamos entender mais como fazer um mecanismo de classificação — construindo um pequeno classificador de emails.
📚 Você é dev e quer aprender um pouco mais sobre a criação de aplicações baseadas em LLM?
Eu criei um curso que aborda aspectos teóricos e práticos do desenvolvimento de aplicações baseadas em LLMs. Alguns dos tópicos cobertos:
🟠 O que são e como criar embeddings
🟡 Como selecionar partes relevantes nos seus documentos
🔵 Como integrar essas partes documentos com uma LLM
Explicando classificação de dados
Imagine que o computador é como um aluno em uma escola que está aprendendo a reconhecer maçãs e bananas.
Primeiro, o aluno-computador estuda os exemplos. Ele observa as maçãs e bananas em detalhes, examinando suas cores, tamanhos, texturas e outras características relevantes. Esse processo é conhecido como etapa de “treinamento”.
À medida que o aluno-computador estuda mais exemplos, ele começa a identificar padrões.
Por exemplo, ele pode perceber que a maioria das maçãs é vermelha e tem uma forma arredondada, enquanto a maioria das bananas é amarela e tem uma forma alongada.
Esses padrões são como pistas que o aluno-computador usa para tomar decisões.
Depois de um bom treinamento, o aluno-computador se torna um especialista em distinguir maçãs de bananas. Agora, quando você mostrar a ele uma fruta que ele nunca viu antes, ele pode usar os padrões que aprendeu para fazer uma suposição educada. Chamamos o chute em novos dados como etapa de “teste”.
Se a fruta for vermelha e arredondada, ele dirá: “Isso parece uma maçã”. Se for amarela e alongada, ele dirá: “Isso parece uma banana”.
Perceba que o aluno-computador não está apenas chutando aleatoriamente.
Ele foi treinado com exemplos suficientes para que suas previsões possam ser precisas na maioria das vezes. No entanto, ainda pode cometer erros ocasionalmente, especialmente se a nova fruta for muito diferente das que ele viu antes.
Separação de etapas da classificação
O processo de classificação pode ser resumido em três etapas: coleta de dados, treinamento e teste.
Coleta de dados
O processo inicia-se com um conjunto de dados para treinamento, no qual cada objeto é representado como um vetor de características. Cada vetor contém valores que descrevem as características relevantes do objeto.
No exemplo acima, utilizamos cor, tamanho e textura como características; mas poderíamos adicionar diversas outras. Essas características são as dimensões do espaço de dados no qual o algoritmo irá operar.
Etapa de treinamento
O processo de treinamento envolve a aplicação de um algoritmo de classificação, como Support Vector Machine (SVM) ou Árvores de Decisão, a esse conjunto de dados.
O algoritmo busca automaticamente encontrar uma fronteira de decisão que separa as diferentes classes de objetos no espaço de características. No exemplo de diferenciar maçãs de bananas com base, o algoritmo examina características como tamanho e cor e traça uma “fronteira” no espaço de características que separa as maçãs das bananas.
Por exemplo, se a fronteira for definida por “vermelho e arredondado”, qualquer objeto com essas características será classificado como uma maçã, enquanto aqueles que não atendem a esses critérios serão considerados bananas.
Isso é feito ajustando os parâmetros do modelo de forma iterativa para minimizar o erro de classificação.
Etapa de teste
Uma vez que o modelo está treinado, este pode ser usado para fazer previsões em novos dados.
Quando um novo objeto é apresentado ao modelo, ele calcula as características desse objeto, posiciona-o no espaço de características e determina de que lado da fronteira de decisão ele está. Com base nesta posição, o modelo atribui uma classe ao objeto; classe esta aprendida durante a etapa treinamento.
É importante, porém, que os dados utilizados para teste não sejam os mesmos utilizados na etapa de treinamento, uma vez que a avaliação com os mesmos dados pode superestimar o desempenho do modelo.
Quando os dados de teste são os mesmos do treinamento, o modelo já os “conhece” e pode simplesmente memorizá-los, em vez de generalizar padrões. Isso não reflete a capacidade do modelo de fazer previsões precisas em dados reais e desconhecidos.
Portanto, a separação adequada de conjuntos de treinamento e teste é fundamental para uma avaliação justa e realista do desempenho do algoritmo de classificação.
Agora, você enfrenta uma decisão importante: quantos desses exemplos você deve usar para treinar e quantos você deve reservar para teste?
Separação de dados entre treinamento e teste
Sabendo que é importante ter uma ampla variedade de exemplos para treinamento, uma vez que queremos que nosso modelo saiba lidar com diferentes variações nos dados.
Isso significa incluir maçãs e bananas de diferentes tamanhos, cores e texturas no conjunto de treinamento, para que o algoritmo possa aprender a reconhecer a variedade intrínseca dessas frutas. Quanto mais abrangente for o conjunto de treinamento, mais preciso tende a ser o modelo de classificação resultante.
De maneira geral, é comum escolher 80% do seu conjunto de dados para treinamento, pois isso significa que o algoritmo aprenderá a partir de um grande número de exemplos, permitindo-lhe capturar nuances nas características das frutas.
Agora, os 20% restantes das maçãs e bananas serão usados para teste. Essas amostras são mantidas à parte. A etapa de teste simula a situação do mundo real, onde o modelo precisa classificar frutas desconhecidas.
Se ele tiver sido bem treinado, deverá ser capaz de fazer essas classificações com alta precisão, com base no que aprendeu com as amostras de treinamento.
Meu primeiro classificador
Após uma breve introdução aos métodos de classificação, vamos continuar criando nosso primeiro classificador: um simples classificador de spams.
Nosso primeiro passo é coletar nossos dados. Para simplificar, vamos criar um vetor com algumas palavras-chave presente em emails. Em um sistema real, deveríamos primeiro identifica-las e extrai-las.
emails = [
"oferta incrível ganhe grátis", # Spam
"prêmio sorteio vencedor", # Spam
"reunião amanhã favor confirmar", # Não spam
"parabéns você ganhou prêmio", # Spam
"confirmação reunião agenda", # Não spam
"promoção imperdível", # Spam
"urgentemente responda agora", # Spam
"parabéns você foi selecionado", # Spam
"lembrete reunião amanhã tarde", # Não spam
"informações importante por favor" # Spam
]
Perceba que há basicamente dois grupos de palavras-chave: um grupo com palavras relacionadas a ofertas (marcados como spam
com comentário) e outro grupo relacionado a reuniões (marcados como não spam
nos comentários).
Esses são os dados utilizados para treinamento. No entanto, embora existam os comentários indicando quando um email é spam ou não, esses comentários não são legíveis para o algoritmo. Vamos criar um segundo vetor com essa informação:
labels = np.array([1, 1, 0, 1, 0, 1, 1, 1, 0, 1])
Cada item desse vetor representa uma categoria de email: 1
para spam e 0
para não spam.
O próximo passo lógico seria treinar nosso modelo com os dados de treinamento. No entanto, o algoritmo também não consegue entender os dados em texto natural. Precisamos ainda converter o texto das palavras-chave dos email para um formato que o algoritmo entenda. Para isso, vamos utilizar a classe CountVectorizer
do pacote sklearn
que cria uma representação numérica de textos em linguagem natural.
vectorizer = CountVectorizer()
X = vectorizer.fit_transform(emails)
Com os dados vetorizados, podemos agora criar nosso modelo. Para isso, vamos instanciar o algoritmo SVM e fornecer os dados de treinamento (junto com os labels) como entrada para o seu método fit
.
clf = svm.SVC(kernel='linear')
clf.fit(X, labels)
Uma vez que o modelo foi treinado, podemos agora passar um email nunca antes visto para o algoritmo, e pedir para que ele chute a sua categoria.
novos_emails = [
"ganhe prêmio agora", # Spam
"reunião amanhã tarde", # Não spam
"parabéns você foi sorteado" # Spam
]
novos_emails_transformed = vectorizer.transform(novos_emails)
previsoes = clf.predict(novos_emails_transformed)
for i, previsao in enumerate(previsoes):
if previsao == 1:
print(f"Exemplo {i + 1}: Spam")
else:
print(f"Exemplo {i + 1}: Não Spam")
Como resultado, o modelo foi capaz de prever com 100% de acurácia que um email era (ou não) spam. No entanto, é importante notar a distancia dos tipos de dados fornecidos (um sobre promoções e outro sobre reuniões), o que fez com o algoritmo pudesse identificar a fronteira com mais facilidade. No mundo real, as linhas entre as categorias são mais tênues, e dificilmente conseguimos obter 100% de acurácia.
Conclusão
Neste texto, exploramos os conceitos fundamentais de classificação de dados em aprendizado de máquina, usando um exemplo prático de diferenciação entre emails de spam e não spam.
Ao criar nosso primeiro classificador de spam, vimos como o algoritmo SVM (Support Vector Machine) pode ser treinado e usado para fazer previsões precisas. No entanto, lembramos que, na prática, a fronteira entre categorias nem sempre é tão nítida quanto em nosso exemplo simplificado.
No mundo real, a classificação pode ser desafiadora, mas compreender os princípios básicos e as etapas envolvidas é um passo crucial na jornada de explorar e aplicar o aprendizado de máquina. À medida que continuamos a aprofundar nosso conhecimento, podemos desenvolver modelos mais sofisticados e lidar com problemas mais complexos de classificação.