Многоклассовая классификация: наивный Байес

Продолжим разговор об алгоритмах машинного обучения (Machine Learning) в Apache Spark. Сегодня рассмотрим наивный байесовский классификатор (Naive Bayes) и его реализации в Spark ML. Читайте в этой статье: четыре вида реализации (полиномиальный, дополняющий, бернуллевский, гауссовский) наивного байесовского классификатора в Apach Spark 2 и 3, а также пример обучения Naive Bayes на языке Python.

Наивный байесовский классификатор в Apache Spark

Наивный байесовский классификатор (Naive Bayes) — это алгоритм машинного обучения, предназначенный для многоклассовой классификации данных с независимыми признаками. За один проход вычисляется условная вероятность каждого признака, затем применяется теорема Байеса для нахождения распределения вероятности наблюдений. Если вы не знакомы с данным алгоритмом, то рекомендуем прочитать нашу статью, где подробно объяснен принцип нахождения условных вероятностей категориальных признаков.

Apache Spark 3 поддерживает четыре вида реализации наивного байесовского классификатора [1]:

  • Полиномиальный байесовский классификатор [2]
  • Бернуллевский байесовский классификатор [3]
  • Дополняющий байесовский классификатор (нет в Python API) [4]
  • Гауссовский байесовский классификатор [2]

Первые три обычно применяются в NLP (Natural Language Processing) для классификации текстов, например, для фильтрация спама. Причем для каждого из них есть свои тонкости. Допустим, есть датасет, где каждое наблюдение — это тип текста, а признаки — это слова, из которых он состоит. Значениями этих признаков могут быть частота слова (в полиномиальном и дополняющем классификаторе) или значения 0/1, указывающие есть ли данное слово в тексте или нет (в бернуллевском). Значения признаков для полиномиального или бернуллевского классификатора должны быть положительными.

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

В Apache Spark 2 имееются только две реализации наивного Байеса: полиномиальный и бернуллевский.

Параметры Naive Bayes

Наивный байесовский классификатор находится в модуле ml.classification. Как уже было сказано, Spark ML имеет четыре вида его реализации, задающийся через параметр modelType, который соответственно может равняться:

  • multinomial полиномиальный (по умолчанию)
  • bernoulli бернуллевский
  • complement дополняющий
  • gaussian гауссовский

Также для полиномиального наивного байесовского классификатора можно изменить параметр аддитивного сглаживания smoothing [5]. Этот параметр по умолчанию имеет значение 0.1.

Пример наивного байесовского классификатора в Spark ML

Для примера возьмем данные из репозитория Apache Spark. Сначала загрузим датасет, а затем разобьем его на две выборки: тренировочную и тестовую — в отношении 8:2.

data = spark.read.format("libsvm") \
    .load("sample_libsvm_data.txt")

train, test = data.randomSplit([0.8, 0.2])

Обучим наивный байесовский классификатор с полиномиальной реализацией, скормив тренировочную выборку с помощью вызова метода fit. Код для обучения Naive Bayes в Apache Spark выглядит следующим образом:

from pyspark.ml.classification import NaiveBayes
nb = NaiveBayes(modelType="multinomial")
model = nb.fit(train)

Получить предсказания с тестовой выборки. Для этого вызывается метод transform.Пример кода на Python:

predictions = model.transform(test)
predictions.show(5)
## Результат:
+-----+--------------------+--------------------+-----------+----------+
|label|            features|       rawPrediction|probability|prediction|
+-----+--------------------+--------------------+-----------+----------+
|  0.0|(692,[121,122,123...|[-222349.15008059...|  [1.0,0.0]|       0.0|
|  0.0|(692,[122,123,124...|[-190803.55811067...|  [1.0,0.0]|       0.0|
|  0.0|(692,[124,125,126...|[-237260.41211777...|  [1.0,0.0]|       0.0|
|  0.0|(692,[126,127,128...|[-150305.28900105...|  [1.0,0.0]|       0.0|
|  0.0|(692,[150,151,152...|[-157242.76302463...|  [1.0,0.0]|       0.0|
+-----+--------------------+--------------------+-----------+----------+

Осталось проверить точность наивного байесовского классификатора. Для оценки точности алгоритма машинного обучения (Machine Learning) в рамках многоклассовой классификации используется объект MulticlassClassificationEvaluator [6], у которого есть много метрик, но мы воспользуемся самым простым — accuracy, который отношение количества правильных ответов к общему количеству наблюдений.

from pyspark.ml.evaluation import MulticlassClassificationEvaluator

evaluator = MulticlassClassificationEvaluator(
    labelCol="label", 
    predictionCol="prediction",
    metricName="accuracy"
)

accuracy = evaluator.evaluate(predictions)
print("Test set accuracy =", accuracy)
# Test set accuracy = 0.93

Еще больше подробностей о наивном байесовском классификаторе и других алгоритомв машинного обучения с реальными примерами Data Science вы узнаете на специализированном курсе по машинному обучению «CURS» в лицензированном учебном центре обучения и повышения квалификации разработчиков, менеджеров, архитекторов, инженеров, администраторов, Data Scientist’ов и аналитиков Big Data в Москве.

Записаться на курс

Смотреть раcписание

Источники
  1. https://spark.apache.org/docs/latest/ml-classification-regression.html#naive-bayes
  2. https://en.wikipedia.org/wiki/Naive_Bayes
  3. https://nlp.stanford.edu/IR-book/html/htmledition/the-bernoulli-model-1.html
  4. https://people.csail.mit.edu/jrennie/papers/icml03-nb.pdf
  5. https://en.wikipedia.org/wiki/Lidstone_smoothing
  6. https://spark.apache.org/docs/2.4.0/api/python/pyspark.ml.html#pyspark.ml.evaluation.MulticlassClassificationEvaluator

Добавить комментарий

Поиск по сайту