2/2 содержит кодовую часть наивного байесовского классификатора.
Давайте подведем итог тому, что мы узнали из Наивного байесовского классификатора 1/2.
Наивный байесовский метод — это метод машинного обучения, который вы можете использовать для прогнозирования вероятности того, что событие произойдет, учитывая свидетельства в ваших данных.
Три типа наивных байесовских моделей
- Полиномиальный — хорошо подходит, когда ваши функции (категориальные или непрерывные) описывают дискретные подсчеты частоты (например, подсчет слов).
- Бернулли — хорошо подходит для предсказаний по бинарным функциям.
- Gaussian — хорошо подходит для предсказаний по нормально распределенным функциям.
Случаи использования наивного байесовского метода
- Обнаружение спама
- Классификация клиентов
- Прогноз кредитного риска
- Прогноз риска для здоровья
Предположения
- Предикторы не зависят друг от друга.
- Априорное предположение: это предположение о том, что прошлые условия все еще остаются в силе. когда мы делаем прогнозы на основе исторических значений, мы получим неверные результаты, если нынешние обстоятельства изменились.
- Все модели регрессии также поддерживают априорное предположение.
Вот с набором данных спама. Мы обнаруживаем спам, а не спам-новости.
Хватит говорить, давайте рок-н-ролл 👇🏻
# importing required libraries import pandas as pd import numpy as np import os import urllib from urllib.request import urlopen import urllib.request as ur import sklearn from sklearn.naive_bayes import BernoulliNB from sklearn.naive_bayes import GaussianNB from sklearn.naive_bayes import MultinomialNB from sklearn.model_selection import train_test_split from sklearn.feature_extraction.text import TfidfVectorizer from sklearn import metrics from sklearn.metrics import accuracy_score # laod the dataset and print the dataset url = ("https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data") raw_data = ur.urlopen(url) dataset = np.loadtxt(raw_data, delimiter = ",") print(dataset[0])
# let's analyze 48 features. X = dataset[:, 0:48] y = dataset[:, -1] # split the dataset into train and test classes X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = .33, random_state = 420) # modeling with Bernoulli Naive Bayes BernNB = BernoulliNB(binarize = True) BernNB.fit(X_train, y_train) print(BernNB) y_expect = y_test y_pred = BernNB.predict(X_test) print(accuracy_score(y_expect, y_pred))
Точность наивного байесовского метода Бернулли: 0,85. Это определяет, что модель может определить с точностью 85 %, является ли данная новость спамом или нет.
# Modeling with Multi Naive Bayes MultiNB = MultinomialNB() MultiNB.fit(X_train, y_train) print(MultiNB) y_pred = MultiNB.predict(X_test) print(accuracy_score(y_expect, y_pred))
# Modeling with Gaussian Naive Bayes GausNB = GaussianNB() GausNB.fit(X_train, y_train) print(GausNB) y_pred = GausNB.predict(X_test) print(accuracy_score(y_expect, y_pred))
# Modeling with Bernoulli Naive Bayes BernNB = BernoulliNB(binarize=0.1) BernNB.fit(X_train, y_train) print(BernNB) y_expect = y_test y_pred = BernNB.predict(X_test) print(accuracy_score(y_expect, y_pred))
Точность наивного байесовского метода Бернулли: 0,89. с изменениями в бинарном гиперпараметре. Это определяет, что модель может определить с точностью 88 %, является ли данная новость спамом или нет.
Анализ текста с помощью набора данных «Спам против не спама».
# mention the dataset path os.chidr("path to the spam dataset file") # importe the dataset and encode. df = pd.read_csv("spam.csv", encoding = "cp1252") # this file will be the different one. # define the data per index df = df.iloc[: , [0,1]] # print the first 5 records df.head()
# rename ham and spam as Status and message. df.rename(columns = {"v1": "status", "v2": "message"}, inplace = True) df.head() # print the first records.
# print the length of the dataset len(df)
# print the length of the 'spam' class dataset len(df[df.status == "spam"])
# print the length of the 'ham' class len(df[df.status == "ham"])
df.loc[df["status"] == "ham", "status",] =1 #Converting and assigning 1 for a 'ham' df.loc[df["status"] == "spam", "status",] =0 #0 for spam df.head() #desplaying first 5 records
# defining and setting in the countvecorizer in 'cv' cv = CountVectorizer() # split the dataset into train and test x_train, x_test, y_train, y_test = train_test_split(df_x, df_y, test_size = .2, random_state = 420) # print the first 5 records x_train.head()
cv = CountVectorizer() # defining and setting in the countvecorizer in 'cv' # fit the model for the below example x_traincv = cv.fit_transform(["Hi How are you How are you doing", "Hi What's up", "Wow that's awesome"]) # convert the result into array type x_traincv.toarray()
# print the features name cv.get_feature_names()
cv1 = CountVectorizer() # defining and setting in the countvecorizer in 'cv' # fit transform 'x_train' x_traincv = cv1.fit_transform(x_train) # converting into the array type a = x_traincv.toarray() a #print a varible's attributes
print the length of 'a' defined variable len(a)
a[0] #displaying '0' index record
# inverse transform the 'a' index 0 details cv1.inverse_transform(a[0])
#print the '0' index details x_train.iloc[0]
Репозиторий GitHub: https://github.com/KVishwas98/Naive-Bayes-Classifier
Набор данных: https://archive.ics.uci.edu/ml/machine-learning-databases/spambase/spambase.data
Заключение
Если вы обнаружите какие-либо трудности при следовании части кода, укажите их в разделе комментариев.
Спасибо, что прочитали! Дайте мне знать в комментарии или на linkedin, если вы считаете, что это помогло или не помогло. У меня есть еще несколько статей, которые я пишу и буду публиковать их каждые пару недель. В основном это аккаунты из моего проектного опыта. Если у вас есть какие-либо другие вопросы или что-то еще, о чем вы хотели бы услышать, не стесняйтесь отправить запрос.