Продолжим разговор об алгоритмах машинного обучения (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 в Москве.
- https://spark.apache.org/docs/latest/ml-classification-regression.html#naive-bayes
- https://en.wikipedia.org/wiki/Naive_Bayes
- https://nlp.stanford.edu/IR-book/html/htmledition/the-bernoulli-model-1.html
- https://people.csail.mit.edu/jrennie/papers/icml03-nb.pdf
- https://en.wikipedia.org/wiki/Lidstone_smoothing
- https://spark.apache.org/docs/2.4.0/api/python/pyspark.ml.html#pyspark.ml.evaluation.MulticlassClassificationEvaluator