Deteksi Spam Email Menggunakan Machine Learning
Email spam merupakan email yang tidak diundang masuk ke dalam email kita. Jadi kita tidak mengetahui siapa pengirim email tersebut. Dalam project Data Science kali ini akan melakukan pendeteksian email spam menggunakan pemodelan Machine Learning menggunakan Python dan teknik pemodelan Natural Language Processing.
Natural Language Processing (NLP) merupakan cabang dari kecerdasan buatan yang berhubungan dengan interaksi antara komputer dan manusia menggunakan bahasa alami. Menurut Textmetrics, NLP digunakan untuk mengukur sentimen dan menentukan bagian mana dari bahasa manusia yang penting. Beberapa penggunaan NLP sendiri antara lain aplikasi terjemahan bahasa seperti Google Translate, aplikasi personal assistant seperti OK Google, Siri, Cortana, dan Alexa.
Dalam project Machine Learning menggunakan dataset yang disediakan oleh Kaggle yang dapat diakses pada link berikut. Pada program ini membaca spam (1) dan tidak spam (0).
Import Library dan Membaca Dataset
#Import basic library
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
import string
Selanjutnya adalah membaca dataset yang tersedia.
email = pd.read_csv('/content/spam_or_not_spam.csv')
Melihat data yang ada
Setelah membaca data yang ada, lalu lihat 5 data teratas juga 5 data terbawah dari dataset yang dibaca tadi, dilanjutkan melihat jumlah data yang dimiliki.
email.head()
email.tail()
Melihat jumlah data yang dimiliki.
email.shape
(3000, 2)
Sebelum melakukan pengecekan missing value lihat terlebih dahulu .info() dari dataset.
email.info()
Pengecekan Missing Value dan Duplikasi Data
Pengeceka missing value dan duplikasi data ini penting dikarenakan ketika dilakukan pemodelan akan mengganggu hasil dari pemodelan tersebut.
email.isnull().sum()
Ternyata terdapat 1 missing value pada data, akan penghapusan data tersebut dengan fungsi .dropna()
email = email.dropna()
#Pengecekan missing value
email.isnull().sum()
Setelah missing value telah dibereskan maka yang selanjutnya adalah melihat adanya data yang terduplikasi atau tidak.
def cek_duplikat(dataframe):
if dataframe.duplicated().sum() > 0 : print ('Ada duplikasi data sebanyak {} data'.
format(dataframe.duplicated().sum())) else:
print('Tidak ada duplikasi data')cek_duplikat(email)
Ada duplikasi data sebanyak 127 data
Ternyata ada sebanyak 127 data yang terduplikasi, untuk mengatasi ini akan kita drop data tersebut dengan fungsi .drop() lalu kita cek kembali apakah duplikasi data tersebut sudah terhapus atau belum.
email.drop_duplicates(inplace=True)
cek_duplikat(email)
Tidak ada duplikasi data
Kita akan melihat jumlah data setelah dilakukan penjinakan missing value dan duplikasi data.
print('Jumlah data setelah menghilangkan duplikasi:', email.shape)
Jumlah data setelah menghilangkan duplikasi: (2872, 2)
Download stopwords
Stopwords pada NLP digunakan untuk melihat kata-kata (data) yang biasanya tidak berguna.
# download the stopwords package
import nltk
nltk.download('stopwords')
Lalu import library stopwords setelah diintals.
from nltk.corpus import stopwords
Sekarang buat fungsi untuk membersihkan text dan mengembalikan token.
def process_text(text):
#remove punctuation nopunc = [char for char in text if char not in
string.punctuation] nopunc = ''.join(nopunc)
#remove stop words clean_words = [word for word in nopunc.split() if word.lower()
not in stopwords.words('english')]
#Return a list of clean words
return clean_words# to show the tokenization
email['email'].head().apply(process_text)
from sklearn.feature_extraction.text import CountVectorizermessage = CountVectorizer(analyzer = process_text).fit_transform(email['email'])
Splitting Data
Selanjutnya adalah melakukan splitting data, untuk digunakan dalam training dan test pada pemodelan data. Disini akan membagi dataset menjadi (80% training dan 20% test).
from sklearn.model_selection import train_test_splitx_train,x_test,y_train,y_test = train_test_split(message, email['label'],test_size = 0.20, random_state = 42)
Melakukan Pemodelan Machine Learning
Pada pemodelan kali ini menggunakan Naive Bayes Classifier. Naive Bayes Classifier merupakan salah satu pengklasifikasi statistik, dimana pengklasifikasi ini dapat memprediksi probabilitas keanggotaan kelas suatu data tuple yang akan masuk ke dalam kelas tertentu, sesuai dengan perhitungan probabilitas.
# create and train the Naive Bayes Classifier
from sklearn.naive_bayes import MultinomialNB
classifier = MultinomialNB().fit(x_train, y_train)
Prediksi Model
Setelah melakukan training data saatnya melihat prediksi data dan accuracy dari model.
from sklearn.metrics import confusion_matrix, classification_report, accuracy_score#Predict
y_pred = classifier.predict(x_test)
#evaluasi model dengan confusion matrix
cnf_matrix=confusion_matrix(y_test,y_pred)
print('Confusion Matrix\n',cnf_matrix)
plt.figure()heatmap = sns.heatmap(pd.DataFrame(cnf_matrix), annot=True, annot_kws={'size': 14}, fmt='d', cmap='YlGnBu')heatmap.yaxis.set_ticklabels(heatmap.yaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)heatmap.xaxis.set_ticklabels(heatmap.xaxis.get_ticklabels(), rotation=0, ha='right', fontsize=14)plt.title('Confusion Matrix\n', fontsize=18, color='darkblue')plt.ylabel('True label', fontsize=14)plt.xlabel('Predicted label', fontsize=14)plt.show()
Dari 486 data di prediksi bukan spam dan ternyata memang bukan spam (True Positif), lalu sebanyak 3 data diprediksi merupakan spam tetapi kenyataannya bukan spam (False Negatif). Sedangkan sebanyak 4 data di prediksi bukan spam tetapi kenyataannya spam (False Positif), dan sebanyak 82 data baik diprediksi maupun kenyataan merupakan spam (True Negatif).
# Print classification report
print('Classification Report:\n')
print(classification_report(y_test, y_pred))
print("Accuracy:", accuracy_score(y_test, y_pred) *100, "%")
Accuracy: 98.78260869565217 %
Dari pemodelan didapatkan accuracy score model sebesar 98,78%.
Itulah pembuatan deteksi spam email menggunakan Machine Learning dan Python.
Sumber: Dataset : https://www.kaggle.com/ozlerhakan/spam-or-not-spam-dataset