Вы когда-нибудь застревали в проекте классификации, не зная, как точно предсказать результаты для ваших данных? Вы искали более простой и интуитивно понятный алгоритм, который поможет вам достичь ваших целей? С помощью Наивного Байеса вы можете упростить свой проект классификации без ущерба для точности. Этот классический алгоритм основан на концепции условной вероятности и успешно используется в самых разных приложениях, от анализа настроений до медицинской диагностики. В этой статье мы рассмотрим тонкости Наивного Байеса и покажем вам, как его можно использовать для легкого создания точных прогнозов. К концу этой статьи у вас будет четкое представление о Наивном Байесе, о том, как он работает, а также о его сильных и слабых сторонах.

Прежде чем приступить к изучению наивного байесовского алгоритма, важно понять основные понятия, такие как условная вероятность, независимые и взаимоисключающие события и теорема Байеса, поскольку эти понятия являются важными строительными блоками наивного байесовского алгоритма и составляют основу его вычислений.

Условная вероятность

независимые и взаимоисключающие события и

Теорема Байеса

Условная вероятность:

Условная вероятность — это вероятность наступления события при условии, что другое событие уже произошло. Например, предположим, что вы бросили правильный шестигранный кубик. Вероятность выпадения 3 равна 1/6. Однако если вы знаете, что выпало нечетное число, то вероятность выпадения 3 теперь равна 1/3.

Независимые и взаимоисключающие события:

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

Математически, когда два события независимы, вероятность того, что оба события произойдут вместе, может быть рассчитана с использованием правила умножения вероятности. Это означает, что два события А и В независимы тогда и только тогда, когда:

Р(А и В) = Р(А) * Р(В)

Это означает, что вероятность выпадения орла при первом подбрасывании равна 1/2, а вероятность выпадения орла при втором подбрасывании также равна 1/2.
P(орел при первом броске и орел при втором броске) = P(орел при первом броске) * P(орел при втором броске) = 1/2 * 1/2 = 1/4

Взаимоисключающие события – это события, в которых возникновение одного события исключает возникновение другого события. Другими словами, вероятность того, что оба события произойдут вместе, равна нулю. Например, бросание одного кубика и получение 6 и нечетного числа являются взаимоисключающими событиями, так как невозможно получить оба результата одновременно.

Математически два события A и B исключают друг друга тогда и только тогда, когда: P(A и B) = 0

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

Теорема Байеса:

С точки зрения непрофессионала, теорема Байеса — это способ выяснить, насколько вероятно, что что-то произойдет, основываясь на том, что вы уже знаете. Это поможет вам обновить ваши предположения на основе новой информации. Он используется для расчета вероятности возникновения события при условии, что произошло другое событие. Мы можем выразить это как:

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

P(A) — априорная вероятность A (априорная вероятность — это вероятность события или класса до принятия во внимание каких-либо новых свидетельств или особенностей данных).

P(B) — априорная вероятность B,

P (B | A) - условная вероятность B при заданном A, и

P(A|B) — это апостериорная вероятность A при данном B. (Апостериорная вероятность — это обновленная вероятность гипотезы или события после учета новой информации или данных.)

Давайте попробуем понять это на примере, который также включает в себя математику. Предположим, вы врач, и у вас есть пациент, у которого только что обнаружили редкое заболевание. Сообщается, что тест имеет точность 95%, что означает, что если у кого-то есть заболевание, есть 95%-й шанс, что тест правильно обнаружит его, а если у кого-то нет заболевания, есть 5%-й шанс, что тест будет обнаружен. говорят у них есть.

Однако вы также знаете, что это заболевание довольно редкое и встречается только у 1 из 1000 человек в общей популяции. Теперь давайте определим вероятность того, что у вашего пациента действительно есть заболевание, учитывая, что у него положительный результат теста.

Мы знаем, что это заболевание довольно редкое и встречается только у 1 из 1000 человек, поэтому у нас уже есть априорная вероятность нашей гипотезы, то есть вероятность наличия заболевания в общей популяции, т. е. P(H) = 0,001.

# Prior probability of having the medical condition
p_condition = 0.01

Предполагая, что если у пациента действительно есть заболевание, существует 95% вероятность того, что тест обнаружит его, то есть P (E | H) = 0,95.

# Prior probability of a positive test result given the condition is present
p_positive_given_condition = 0.95

Кроме того, если у пациента нет заболевания, существует 5% вероятность того, что тест неверно скажет, что у него есть заболевание, т. е. P (E | не H) = 0,05.

# Prior probability of a positive test result given the condition is not present
p_positive_given_not_condition = 0.05

Наконец, мы можем использовать теорему Байеса, чтобы вычислить вероятность нашей гипотезы с учетом доказательств, то есть вероятность того, что у пациента действительно есть болезнь, при условии, что у него положительный результат теста на нее:

P(H|E) = [P(E|H) * P(H)] / [P(E|H) * P(H) + P(E|не H) * P(не H)]

# Bayes' theorem: P(condition | positive) = P(positive | condition) * P(condition) / P(positive)
# Calculate the probability of a positive test result
p_positive = p_condition * p_positive_given_condition + (1 - p_condition) * p_positive_given_not_condition

# Calculate the probability of having the condition given a positive test result
p_condition_given_positive = p_positive_given_condition * p_condition / p_positive
# Print the results
print("Prior probability of having the condition: {:.2f}".format(p_condition))
print("Prior probability of a positive test result given the condition is present: {:.2f}".format(p_positive_given_condition))
print("Prior probability of a positive test result given the condition is not present: {:.2f}".format(p_positive_given_not_condition))
print("Probability of a positive test result: {:.2f}".format(p_positive))
print("Probability of having the condition given a positive test result: {:.2f}".format(p_condition_given_positive))w

Это дает следующий результат:

Априорная вероятность наличия состояния: 0,01
Априорная вероятность положительного результата теста при наличии состояния: 0,95
Априорная вероятность положительного результата теста при отсутствии состояния: 0,05
Вероятность положительного результата теста: 0,06
Вероятность наличия состояния при положительном результате теста: 0,16

Наивный байесовский алгоритм:

Я надеюсь, что приведенное выше объяснение условной вероятности, независимых и взаимоисключающих событий и теоремы Байеса дало вам прочную основу в теории вероятностей. Теперь давайте углубимся в алгоритм наивного Байеса, который расширяет идеи теоремы Байеса.

Алгоритм наивного Байеса делает сильное предположение о том, что признаки независимы друг от друга, поэтому он называется «наивным». (или мы можем сказать, что он предполагает, что все, на что мы смотрим, не связано друг с другом).

Это предположение часто неверно в реальных сценариях, но оно делает алгоритм простым и эффективным в реализации. На самом деле многие функции зависят друг от друга, и учет их взаимозависимости может повысить точность модели. Однако это может сделать расчеты более сложными и трудоемкими. Алгоритм Наивного Байеса, игнорируя эти зависимости, делает вычисления намного проще и быстрее. Давайте разберем это пошагово следующим образом:

Шаг 1. Алгоритм сначала вычисляет априорную вероятность каждого класса (т. е. вероятность каждого класса, прежде чем принимать во внимание какие-либо доказательства или особенности данных). подсчет количества примеров в каждом классе и деление на общее количество примеров (здесь пример означает точки данных или экземпляры в наборе данных)

Шаг 2.Затем вычисляется условная вероятность каждого признака для каждого класса путем подсчета количества примеров в каждом классе, имеющих заданное значение признака, и деления на общее число примеров в этом классе.

Шаг 3. Наконец, он умножает априорную вероятность и условную вероятность для каждого объекта, чтобы вычислить апостериорную вероятность для каждого класса.

Шаг 4. Затем в качестве прогнозируемого класса для заданной точки данных выбирается класс с наивысшей апостериорной вероятностью.

Давайте попробуем понять это на примере того, как работает Наивный Байес:

Предположим, у нас есть набор данных электронных писем, и мы хотим классифицировать каждое электронное письмо как «спам» или «не спам» в зависимости от его содержания. Мы можем использовать Наивный Байес, чтобы построить модель классификации для этой задачи.

# Define the training data
train_data = [
    'Congratulations! You have won the lottery!', 
    'Get a free iPod today!', 
    'This is a non-spam email.', 
    'Hurry! Claim your exclusive discount now for free!', 
    'Limited time offer - buy one get one free!'
]
train_labels = ['spam', 'spam', 'not spam', 'spam', 'spam']

Для этого нам нужно обучить модель на наборе помеченных примеров (т. е. электронных писем, которые уже были классифицированы как «спам» или «не спам»). Для каждого электронного письма мы извлекаем набор признаков, таких как наличие или отсутствие определенных слов или фраз.

# Define a function to extract features from a given text
def extract_features(text):
    features = []
    # Check for the presence of certain words/phrases
    if re.search(r'\b(free|win|prize|money)\b', text):
        features.append(1)
    else:
        features.append(0)
    if re.search(r'\b(singles|meet|click|offer)\b', text):
        features.append(1)
    else:
        features.append(0)
    return feature

Для простоты предположим, что у нас есть только две характеристики: содержит ли электронное письмо слово «бесплатно» и содержит ли оно слово «лотерея». Мы можем представить каждое электронное письмо как вектор двоичных значений, где 1 указывает на наличие слова, а 0 — на его отсутствие.

Вот несколько примеров электронных писем и соответствующие им векторы функций:

Электронное письмо 1: «Поздравляем! Вы выиграли в лотерею!» Вектор признаков: [0, 1]

Электронное письмо 2: «Получите бесплатный iPod сегодня!» Вектор признаков: [1, 0]

Электронное письмо 3: «Это письмо не является спамом». Вектор признаков: [0, 0]

Мы можем использовать эти векторы признаков для обучения наивной байесовской модели. В частности, нам нужно оценить условные вероятности каждой функции с учетом метки класса (т. е. «спам» или «не спам»). Например, мы можем оценить вероятность появления слова «бесплатно» в спам-письме как долю спам-писем, содержащих слово «бесплатно».

# Calculate the prior probabilities of each class
num_examples = len(train_labels)
prior_spam = train_labels.count('spam') / num_examples
prior_not_spam = train_labels.count('not spam') / num_examples
# Calculate the conditional probabilities of each feature given each class
num_features = 2
num_spam = train_labels.count('spam')
num_not_spam = train_labels.count('not spam')
conditional_spam = [0] * num_features
conditional_not_spam = [0] * num_features
for i in range(num_examples):
    features = extract_features(train_data[i])
    if train_labels[i] == 'spam':
        for j in range(num_features):
            conditional_spam[j] += features[j]
    else:
        for j in range(num_features):
            conditional_not_spam[j] += features[j]
for j in range(num_features):
    conditional_spam[j] /= num_spam
    conditional_not_spam[j] /= num_not_spam

Как только мы оценили эти вероятности, мы можем использовать теорему Байеса для вычисления вероятности каждой метки класса с учетом наблюдаемого вектора признаков. Например, если мы наблюдаем электронное письмо с вектором признаков [1, 0], мы можем рассчитать вероятность того, что это спам, как:

P(спам | [1, 0]) = P([1, 0] | спам) * P(спам) / P([1, 0])

где P([1, 0] | спам) — это вероятность наблюдения вектора признаков [1, 0] при условии, что электронное письмо является спамом, P(спам) — это априорная вероятность того, что электронное письмо является спамом (которую мы можем оценить из обучающие данные), а P([1, 0]) — предельная вероятность наблюдения вектора признаков [1, 0].

# Define a function to classify new examples
def classify(text):
    # Extract features from the text
    features = extract_features(text)
    # Calculate the posterior probabilities of each class
    posterior_spam = prior_spam
    posterior_not_spam = prior_not_spam
    for j in range(num_features):
        posterior_spam *= conditional_spam[j] if features[j] else (1 - conditional_spam[j])
        posterior_not_spam *= conditional_not_spam[j] if features[j] else (1 - conditional_not_spam[j])
    # Determine the predicted class label
    if posterior_spam > posterior_not_spam:
        return 'spam'
    else:
        return 'not spam'

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

    # Calculate the posterior probabilities for each class
    probs = {label: prior[label] for label in labels}
    for word in words:
        for label in labels:
            if word in likelihood[label]:
                probs[label] *= likelihood[label][word]
            else:
                probs[label] *= 0.1  # add-1 smoothing for unknown words

    # Choose the class with the highest posterior probability
    predicted_label = max(probs, key=probs.get)
    print(f'Text: {text} \tPredicted label: {predicted_label}')

В заключение, в этой статье мы рассмотрели все важные и основополагающие темы, связанные с наивным байесовским подходом. Мы узнали об основных принципах наивного байесовского метода, его применениях в классификации текста и о том, как его реализовать в Python. Хотя в этой статье представлен всесторонний обзор Наивного Байеса, есть еще много областей, которые можно изучить более подробно.

Если вам интересно посмотреть, как эти концепции работают на практике, вы можете следить за кодом, используемым в этой статье, в созданной мной блокноте Kaggle.

Просто нажмите на эту ссылку:https://www.kaggle.com/code/anuai23/naive-bayes

В следующей статье мы углубимся в некоторые темы, включая Лапласово/аддитивное сглаживание, логарифмические вероятности для численной стабильности, компромисс смещения и дисперсии, важность признаков и интерпретируемость, несбалансированные данные, выбросы, пропущенные значения, обработку числовых признаков с использованием Гаусса. Наивный Байес, мультиклассовая классификация, матрица сходства или расстояния, большая размерность, лучший и худший случаи. Кроме того, я предоставлю пример кода и упражнение, которое применяет Наивный Байес к обзорам Amazon, что даст вам практический опыт работы с этим мощным алгоритмом. Оставайтесь с нами для следующей статьи, где мы продолжим наше исследование Наивного Байеса. Если вы хотите узнать больше о науке о данных и машинном обучении, мы рекомендуем вам изучить другие темы и ресурсы, чтобы продолжить свое обучение.

Приятного чтения! Продолжай учиться!