Etapa 1: Importação das bibliotecas necessárias
Primeiro, vamos importar todas as bibliotecas necessárias. Precisamos do Pandas para carregar e manipular os dados, do Scikit-Learn para construir o modelo e avaliá-lo, e do Numpy para cálculos numéricos.
import numpy as np
import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.feature_extraction.text import CountVectorizer
from sklearn import svm
from sklearn.metrics import confusion_matrix, classification_report
Etapa 2: Carregando e visualizando os dados
Vamos carregar os dados do arquivo spam.csv que você baixou do Kaggle. Este arquivo contém duas colunas: EmailText e Label. A coluna EmailText contém o texto do e-mail e a coluna Label contém um rótulo indicando se o e-mail é spam (spam) ou não (ham).
data = pd.read_csv('spam_ham_dataset.csv')
print(data.head())
Unnamed: 0 label text \ 0 605 ham Subject: enron methanol ; meter # : 988291\r\n... 1 2349 ham Subject: hpl nom for january 9 , 2001\r\n( see... 2 3624 ham Subject: neon retreat\r\nho ho ho , we ' re ar... 3 4685 spam Subject: photoshop , windows , office . cheap ... 4 2030 ham Subject: re : indian springs\r\nthis deal is t... label_num 0 0 1 0 2 0 3 1 4 0
Etapa 3: Dividindo os dados
Agora, precisamos dividir nossos dados em conjuntos de treinamento e teste. O conjunto de treinamento é usado para treinar o algoritmo de aprendizado de máquina, enquanto o conjunto de teste é usado para avaliar a precisão do modelo.
X = data['text']
y = data['label']
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)
Etapa 4: Convertendo texto em números
Os algoritmos de aprendizado de máquina trabalham com números, não com texto. Portanto, precisamos converter nosso texto em números. Para isso, usaremos a técnica chamada Bag of Words. Essa técnica transforma cada palavra distinta do texto em uma característica e conta o número de vezes que cada palavra aparece. Por exemplo, a frase "o céu é azul" seria transformada em algo como {'o': 1, 'céu': 1, 'é': 1, 'azul': 1}.
cv = CountVectorizer()
features = cv.fit_transform(X_train)
Etapa 5: Construindo o modelo
Agora, podemos usar esses recursos para treinar nosso modelo. Usaremos o classificador SVM (Support Vector Machine) para isso. O SVM é um tipo de algoritmo de aprendizado de máquina que tenta encontrar uma linha (em duas dimensões) ou um hiperplano (em mais de duas dimensões) que melhor divide os dados entre as duas classes. No nosso caso, o SVM tentará encontrar o hiperplano que melhor divide os e-mails entre spam e não-spam.
model = svm.SVC()
model.fit(features, y_train)
SVC()In a Jupyter environment, please rerun this cell to show the HTML representation or trust the notebook.
On GitHub, the HTML representation is unable to render, please try loading this page with nbviewer.org.
SVC()
Etapa 6: Avaliando o modelo
Finalmente, precisamos avaliar nosso modelo. Para isso, vamos transformar nosso conjunto de teste em números (como fizemos com o conjunto de treinamento) e fazer o modelo prever se cada e-mail é spam ou não. Em seguida, podemos comparar essas previsões com os rótulos reais.
A matriz de confusão é uma tabela que nos permite visualizar o desempenho do nosso algoritmo. Cada linha representa as instâncias da classe real e cada coluna representa as instâncias da classe prevista. Isso nos permitirá ver quantos e-mails foram classificados corretamente e incorretamente.
O relatório de classificação nos dará mais informações sobre o desempenho do nosso modelo, como precisão, recall e pontuação F1.
features_test = cv.transform(X_test)
predictions = model.predict(features_test)
print(confusion_matrix(y_test, predictions))
print(classification_report(y_test, predictions))
[[706 33]
[ 9 287]]
precision recall f1-score support
ham 0.99 0.96 0.97 739
spam 0.90 0.97 0.93 296
accuracy 0.96 1035
macro avg 0.94 0.96 0.95 1035
weighted avg 0.96 0.96 0.96 1035