Наивный Байес — Часть 1

Тема, которую предстоит осветить:

1.Введение

2. Интуиция

3. Математическая формулировка

4. Как наивный Байес обрабатывает «числовые данные»

5. Шаги с негауссовскими данными

6. Наивный байесовский подход к текстовым данным

7. Код на Python

Это действительно работает с «Texual Data»

Такие приложения, как «Анализ настроений» или «Фильтрация спама» на этом «Наивном Байесе», работают очень хорошо.

  • Он работает как “Base Line Model”, мы можем начать с этого и попробовать другой алгоритм, например «XGBoost» или «Глубокое обучение».
  • Мы видели, используя “Naïve Bayes”, мы получаем хорошие ответы, например, 90%, а когда мы применяем «Модель тяжелого глубокого обучения», мы получаем 96,5%, поэтому в этом случае мы можем использовать «Наивный Байес».

Интуиция:

  • Это наиболее распространенный пример, используемый для понимания концепции Наивного Байеса.
  • Это «игрушечный набор данных», который в основном используется для понимания алгоритмов.
  • Это данные о погодных условиях за 15 дней для игры в «Теннис», и, изучив эту закономерность, нам нужно прогнозировать на основе этой ситуации, учитывая «играть в теннис или нет».
  • Это простая двоичная классификация. Используя эти данные, вы научитесь использовать «наивную байесовскую» работу.
  • Пример. {Солнечно, Круто, Нормально, Правда} получены новые данные, и необходимо спрогнозировать «Игра в теннис да или нет»
  • Это основано на “Bayes Theorem”.

P(A|B) = P(B|A) P(A)/ P(B)

  • Превратим «Проблему» в это уравнение. Рассчитаем две вероятности
  • 1-я вероятность — “Yes” , 2-я вероятность — “No”
  • Какая бы вероятность ни была высокой, выберет это предсказание. Как будут рассчитываться эти вероятности?

P(ДА|W) = P(W|ДА) * P(ДА) / P(W)

P(NO|W) = P(W|NO) * P(NO) | P(W)

П(ДА) = 9/14, П(НЕТ) = 5/14

  • P(W|YES) — Эту вероятность нам нужно найти, если P(Sunny ∩ Cool ∩ Normal ∩ True| Yes) = 0 у нас нет какой-либо комбинации по этой опции.
  • P(W|NO) — Эту вероятность нам нужно найти, если P(Sunny ∩ Cool ∩ Normal ∩ True| No) = 0 у нас нет какой-либо комбинации по этой опции.
  • В этом проблема с “bayes theorem” : когда у нас больше комбинаций входных столбцов, мы не получаем эту комбинацию из данных, как в приведенном выше примере. Итак, P(W|YES) , P(W|NO) термины получат “Zero”, а если эти термины получат zero “Bayes Theorem” will also be zero и никакого результата, мы не получим.
  • So “Naïve Bayes” take “Naïve” assumption means take assumption without such condition.
  • Разбейте эту вероятность (P(Sunny ∩ Cool ∩ Normal ∩ True| Yes)) на — P(Sunny|Yes) * P(Cool | Yes) * P(Normal|Yes) * P(True|Yes) то же самое, что и в “NO” case. Теперь мы легко получим это условие в данных.
  • P(Sunny|Yes) * P(Cool | Yes) * P(Normal|Yes) * P(True|Yes) = 2/9 * 3/9 * 6/9 * 3/9 * 9/14 # здесь 9/14 — это «Да Вероятность»
  • Это простейшая интуиция наивного Байеса.

Математическая формулировка:

  • Предположим, у меня есть набор данных с входным столбцом “N” и выходным столбцом “One” . И сделайте “Multiclass classification” as «Выход» (1,2,3,k )
  • Для каждого класса необходимо найти прогноз для заданных новых данных (x1,x2,x3,xn) , чтобы наша модель вычислила “K probabilities” P(Y1|Xt) P(Y2| Xt) P(Yn|Xt)

Применим «Теорему Байеса» ко всем вероятностям.

P(Y1|Xt)  = P(Xt|Y1) P(Y1) /P(Xt)
P(Y2| Xt) = P(Xt|Y2) P(Y2) / P(Xt)
P(Yk|Xt) = P(Xt|Yk) P(Yk)| P(Xt)

# Denominator is same so will remove. And for all class will find "Probabilities" and for which class probabilities is "high" will say given new data belongs to that class.
  P(Yk|Xt) = P(Xt|Yk) * P(Yk)

# will replace Xt with =     P(X1∩  X2 ∩  X3 ∩    ∩ Xn) * P(Yk)  # "∩ " intersection use between X1, X2, Xn so that we can create query point for "Xt"
# will replace "∩ " with "Comma"

= P(X1,X2,X3 -----Xn| Yk) * P(Yk)
# will apply  "Conditional Probability" formula    P(A|B)  = P(A∩B) / P(B)

= P(X1,X2,X3---- Xn, Yk) * P(Yk) / P(Yk)
= P(X1,X2,X3, ------, Xn, Yk)
# will say "A" - [X1] , and "B" - [X2,X3……….Xn, Yk ] and apply conditional probability formula.
= P(A|B)  = P(A∩B) / P(B)  - can rewrite this ->   P(A∩B) =  P(A|B)  * P(B)
=  P(X1 |  X2,X3, ---- , Xn, Yk)  P(X2, X3, ---- , Xn,  Yk)
# P(X2, X3, ---- , Xn,  Yk)  now again will rewrite this in form of "A" = X2. and "B" = X3, ---- , Xn,  Yk
= P(X2 | X3,X4, -----, Xn, Yk) P(X3, X4, -------, Xn, Yk)
# again will rewrite X3 = "A" and X4, -------, Xn, Yk as "B"
= P(X1 | X2, X3, ---- , Xn, Yk) P(X2 | X3, X4, ---, Yk) -------  P(Xn-1 | Xn, Yk) * P(Xn | Yk) * P(Yk)

                                          
# now "naïve bayes" will take "naïve" assumption: X1, X2,X3, -- Xn all "Independent Feature" 

# will simplify this based on the formula - P(A| B∩  C) = P(A|B,C) = P(A|C)
Y1 = P(X1 | Yk) P(X2| Y.k) P(X3| Yk) ------ P(Xn-1 | Yk) P(Xn | Yk) P(Yk) 
# For class1 "Y1" we are calculating every input column with Yk "Conditional Probability" and then "Multiply" all and in last find "Yk" probability
# same will do for "Y2", "y3", -----, "Yk" and compare all "Probability Product" . For which "class" "probability product" will "Maximum" that call will be "Selected Class" and this "Maxium probability product" called "MAP" ("MAXIMUM  A POSTERIORI RULE")
                                          

Код:

  • Добавление ссылки на мой блог «Вероятность», которая работает как основа в «Наивном Байесе»


import numpy as np
import pandas as pd

df = pd.read_csv('https://gist.githubusercontent.com/DiogoRibeiro7/c6590d0cf119e87c39e31c21a9c0f3a8/raw/4a8e3da267

df
- Contingency Table-

pd.crosstab(df['Outlook'], df['Play Tennis'])
- Joint Probabilities-
pd.crosstab(df['Outlook'],df['Play Tennis'], normalize = 'all')
- Marginal Probabilities

pd.crosstab(df['Outlook'], df['Play Tennis'], normalize = 'all', margins = True)
- Conditional Probabilities
- Finding probabilities of "Overcast" given "No"

pd.crosstab(df['Outlook'], df['Play Tennis'], normalize = 'columns')
- Stacking in "Series" and "converting in Dictionary"

pd.crosstab(df['Outlook'], df['Play Tennis'], normalize = 'columns').stack().to_dict()
- creating Loop for caluclating Conditional Probability together

D = {}
for i in ['Outlook', 'Temperature', 'Humidity','Wind']:
  D.update(pd.crosstab(df[i], df['Play Tennis'], normalize = 'columns').stack().to_dict())

D

Полная ссылка на код-



Naive-Bayes-application-on-/Naive_Bayes_Example.ipynb в main ·…
В «Наборе данных IMDB
примените наивный Байес. Внесите свой вклад в разработку 21Nimisha/Naive-Bayes-application-on-development, создав…github.com»



Как наивный Байес обрабатывает «числовые данные»:

Входные данные — «Числовые данные», Выходные данные — «Категорические данные».

  • Возраст — 27,61,52,20
  • Женат - Да, Нет, Да, Нет
  • Возраст — «55», узнайте по этому возрасту, женат или нет.

P(Y|55) = P(55|Y) * P(Y)

P(N|55) = P(55|N) * P(N)

  • # Дана возможность age “55” do not have in dataset, затем вероятность P(55|Y) will be “Zero” . Итак, в “Numerical Data” Обычно мы предполагаем, что этот конкретный “age column” следует за “Gaussian Distribution”. Итак, найдем “Mean” and “Variance”.

Формула:

f(x) — функция плотности вероятности.

x — случайная величина. «55»

μ — среднее значение распределения.

σ — стандартное отклонение, которое измеряет разброс или изменчивость распределения.

π — математическая константа пи (приблизительно 3,14159).

e — основание натурального логарифма (приблизительно 2,71828).

  • “55'’ pdf approx ‘0.65” При проверке Gaussian distribution, которую мы применим к P(55|Y) . Так что, хотя 55 was not in data we assume its normally distributed and find its probability.

Что делать, если данные не являются гауссовскими:

1. Преобразование данных -

  • Мы можем попытаться преобразовать данные в «распределение Гаусса», используя “Logarithm”, “Square Root”, “Reciprocal Transformations”

2. Альтернативные дистрибутивы-

  • Или мы можем попробовать другие дистрибутивы, например “Exponential” , “Poisson”, “Multinomial”, “Bernoulli”.

3. Дискретизация-

  • Мы можем “Binning” конвертировать “Numerical Column” в “Categorical Column”

4. Оценка плотности ядра -

  • Если распределение неясно, мы можем выбрать “KDE”.

5. Используйте другие модели.

  • Если ничего не работает, мы можем использовать другой «алгоритм».

Наивный байесовский подход к текстовым данным:

  • “Naïve Bayes” чаще всего используется на “Text Data”
  • «Анализ настроений» — прочитайте контекст текста и спрогнозируйте его «положительное» или «негативное» настроение. Проведем этот анализ с использованием «Наивного Байеса»

Сначала выполняем «Очистку текста»

Векторизация текста — преобразование в число («Мешок слов», «OneHotEncoding», «TFIDF, «Встраивание»)

Применение наивного Байеса

Шаги в коде:

import numpy as np
import pandas as pd

df=pd.read_csv('/kaggle/input/imdb-dataset-of-50k-movie-reviews/IMDB Dataset.csv')

df.head()
# One review
df['review'][0]

1. Очистка текста

Выборка 10 000 строк

Удалить html-теги

Удалить специальные символы

Преобразование всего в нижний регистр

Удаление стоп-слов

Стемминг

df=df.sample(10000)

df.shape

df.info()

df['sentiment'].replace({'positive':1,'negative':0},inplace=True)

df.head()
import re
clean = re.compile('<.*?>') # removing all HTML
re.sub(clean, '', df.iloc[2].review)
# Function to clean html tags
def clean_html(text):
    clean = re.compile('<.*?>')
    return re.sub(clean, '', text)


df['review']=df['review'].apply(clean_html)

# converting into "Lower Case"

# converting everything to lower

def convert_lower(text):
    return text.lower()

df['review']=df['review'].apply(convert_lower)

# function to remove special characters

def remove_special(text):
    x=''
    
    for i in text:
        if i.isalnum():
            x=x+i
        else:
            x=x + ' '
    return x


remove_special(' th%e @ classic use of the word.it is called oz as that is the nickname given to the oswald maximum security state penitentary. it focuses mainly on emerald city, an experimental section of the prison where all the cells have glass fronts and face inwards, so privacy is not high on the agenda. em city is home to many..aryans, muslims, gangstas, latinos, christians, italians, irish and more....so scuffles, death stares, dodgy dealings and shady agreements are never far away.i would say the main appeal of the show is due to the fact that it goes where other shows wouldnt dare. forget pretty pictures painted for mainstream audiences, f')

df['review']=df['review'].apply(remove_special)

# Remove the stop words
import nltk

from nltk.corpus import stopwords

stopwords.words('english')
df
def remove_stopwords(text):
    x=[]
    for i in text.split():
        
        if i not in stopwords.words('english'):
            x.append(i)
    y=x[:]
    x.clear()
    return y

df['review']=df['review'].apply(remove_stopwords)

df

# Perform stemming

from nltk.stem.porter import PorterStemmer
ps=PorterStemmer()


y=[]
def stem_words(text):
    for i in text:
        y.append(ps.stem(i))
    z=y[:]
    y.clear()
    return z


stem_words(['I','loved','loving','it'])

df['review']=df['review'].apply(stem_words)

df

2. Векторизовать текст — преобразовать в число «Мешок слов»

# Join back

def join_back(list_input):
    return " ".join(list_input)

df['review']=df['review'].apply(join_back)

df['review']

X=df.iloc[:,0:1].values
X.shape

from sklearn.feature_extraction.text import CountVectorizer
cv=CountVectorizer(max_features=2500)

X=cv.fit_transform(df['review']).toarray()

X.shape

- (10000, 2500)

y=df.iloc[:,-1].values

y.shape

- (10000,)

3. Применение наивного Байеса:

# X,y
# Training set
# Test Set(Already know the result)

from sklearn.model_selection import train_test_split

X_train, X_test,y_train,y_test=train_test_split(X,y,test_size=0.2)

from sklearn.naive_bayes import GaussianNB,MultinomialNB,BernoulliNB

clf1=GaussianNB()
clf2=MultinomialNB()
clf3=BernoulliNB()

clf1.fit(X_train,y_train)
clf2.fit(X_train,y_train)
clf3.fit(X_train,y_train)


y_pred1=clf1.predict(X_test)
y_pred2=clf2.predict(X_test)
y_pred3=clf3.predict(X_test)

from sklearn.metrics import accuracy_score

print("Gaussian",accuracy_score(y_test,y_pred1))
print("Multinomial",accuracy_score(y_test,y_pred2))
print("Bernaulli",accuracy_score(y_test,y_pred3))

Полная ссылка на код-



Naive-Bayes-application-on-/sentiment-anaанализ-using-naive-bayes.ipynb at main ·…
В «наборе данных IMDB
примените наивный байесовский метод. Внесите свой вклад в разработку 21Nimisha/Naive-Bayes-application-on-development, создав…github.com»



Вы также можете найти меня здесь-

https://www.linkedin.com/feed/

https://github.com/21Nimisha

Сообщение от AI Mind

Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь: