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.

In [ ]:
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).

In [ ]:
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.

In [ ]:
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}.

In [ ]:
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.

In [ ]:
model = svm.SVC()
model.fit(features, y_train)
Out[ ]:
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.

In [ ]:
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