Наивный Байес — Часть 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/
Сообщение от AI Mind
Спасибо, что являетесь частью нашего сообщества! Перед тем, как ты уйдешь:
- 👏 Аплодируйте истории и подписывайтесь на автора 👉
- 📰 Больше контента смотрите в AI Mind Publication
- 🧠 Улучшайте свои подсказки AI легко и БЕСПЛАТНО
- 🧰 Откройте для себя Интуитивные инструменты искусственного интеллекта