2/2 содержит кодовую часть наивного байесовского классификатора.

Давайте подведем итог тому, что мы узнали из Наивного байесовского классификатора 1/2.

Наивный байесовский метод — это метод машинного обучения, который вы можете использовать для прогнозирования вероятности того, что событие произойдет, учитывая свидетельства в ваших данных.

Три типа наивных байесовских моделей

  1. Полиномиальный — хорошо подходит, когда ваши функции (категориальные или непрерывные) описывают дискретные подсчеты частоты (например, подсчет слов).
  2. Бернулли — хорошо подходит для предсказаний по бинарным функциям.
  3. Gaussian — хорошо подходит для предсказаний по нормально распределенным функциям.

Случаи использования наивного байесовского метода

  1. Обнаружение спама
  2. Классификация клиентов
  3. Прогноз кредитного риска
  4. Прогноз риска для здоровья

Предположения

  1. Предикторы не зависят друг от друга.
  2. Априорное предположение: это предположение о том, что прошлые условия все еще остаются в силе. когда мы делаем прогнозы на основе исторических значений, мы получим неверные результаты, если нынешние обстоятельства изменились.
  3. Все модели регрессии также поддерживают априорное предположение.

Вот с набором данных спама. Мы обнаруживаем спам, а не спам-новости.

Хватит говорить, давайте рок-н-ролл 👇🏻

# 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, если вы считаете, что это помогло или не помогло. У меня есть еще несколько статей, которые я пишу и буду публиковать их каждые пару недель. В основном это аккаунты из моего проектного опыта. Если у вас есть какие-либо другие вопросы или что-то еще, о чем вы хотели бы услышать, не стесняйтесь отправить запрос.