Выбор наилучшей модели: кросс-валдиация и разбиение на выборки

Тюнинг, или подбор параметров, является незаменимой частью при подборе модели Machine Learning, поскольку с одними параметрами модель может показывать высокие результаты, а с другими — низкие. Сегодня мы расскажем вам о выборе наилучшей модели в Spark с помощью кросс-валидации и разбиения на тренировочную и тестовую выборки. Читайте в этой статье: как работает кросс-валидация в Spark, какие параметры принимает и как метод разбиения на тренировочную и тестовую выборки помогает найти лучшую модель быстрее.

Выбор лучшей модели

Важной задачей Machine Learning является выбор модели (model selection) — поиск наилучшей модели или параметров в рамках данной задачи. Этот процесс также называется тюнингом (tuning). Тюнинг может выполняться для отдельных алгоритмов машинного обучения, например, линейной регрессии, или для конвейеров (Pipeline), которые включают несколько алгоритмов. Пользователи могут настраивать весь конвейер сразу, а не каждый элемент отдельно (больше о конвейерах тут).

В Spark-модуле MLlib поддерживаются таких инструменты тюнинга как: кросс-валдиация (CrossValidator) и разбиение на тренировочную и проверочную выборки (TrainValidationSplit). Для их работы требуются следующие объекты:

  • Estimator. Это может быть алгоритм или конвейер( Pipeline)
  • Набор ParamMaps. Параметры на выбор, иногда называемые «сеткой параметров» для поиска
  • Evaluator — метрика для измерения того, насколько хорошо подобранная модель работает с тестовыми данными

На более высоком уровне эти инструменты выбора модели работают следующим образом:

  • Они разделяют входные данные на отдельные наборы данных для обучения и тестирования (валидации)
  • Для каждой комбинации параметров модель сначала обучается, а затем оценивается с помощью Evaluator
  • Отбирается самая эффективную модель, т.е. та, у которой высокая точность

В качестве Evaluator (метрики) в Spark может выступать RegressionEvaluator в задачах регрессии, BinaryClassificationEvaluator в задачах бинарной классификации или MulticlassClassificationEvaluator в задачах многоклассовой классификации. Метрика по умолчанию, используемая для выбора наилучшего ParamMap, может быть переопределена методом setMetricName.

Для построения набора параметров можно использовать ParamGridBuilder. По умолчанию наборы параметров из набора оцениваются последовательно, но вычисления можно выполнять параллельно. Это достигается установкой параметра parallelism со значением 2 или более (значение 1 для последовательного обучения). Значение параллелизма следует выбирать осторожно, чтобы максимизировать обучение без превышения ресурсов кластера, а большие значения не всегда могут привести к повышению производительности.

Кросс-валидация

При кросс-валдиации, или перекрестной проверки по K блокам, данные разделяются на K блоков, один из которых используются для валидации, а остальные для обучения. Этот процесс происходит иттеративно так, что каждый из K блоков успевает быть протестированным. В конечном итоге считается среднее по K блокам.

В Spark для кросс-валидации используется класс CrossValidator. Чтобы оценить конкретный набор параметров ParamMap, CrossValidator вычисляет среднее значение из K моделей для каждой комбинации параметров.

Пример кросс-валидация в Spark

В следующем примере демонстрируется использование CrossValidator для выбора модели на основе конвейера. Конвейер состоит из следующей процедура:

  1. сначала датасет разбивается на токены (Tokenizer)
  2. находится частота токенов в документе (HashinTF)
  3. эти частоты передаются в логистическую регрессию (LogisticRegression) для решения задачи бинарной классификации.

Мы также определяем сетку параметров (ParamGridBuilder), в которую передаем возможные значения параметров hashingTF и логистической регрессии. Всего получается 9 возможных пар: (10, 0.1), (10, 0.05), …, (1000, 0.01).

Полученный конвейер машинного обучения, сетка параметров и метрика передаются кросс-валидации (CrossValidator) c K=3. Таким образом, получается 9*3 = 27 итераций обучения и валидации. Поэтому на больших датасетов кросс-валидация в Spark может выполняться достаточно долго.

from pyspark.ml import Pipeline
from pyspark.ml.classification import LogisticRegression
from pyspark.ml.evaluation import BinaryClassificationEvaluator
from pyspark.ml.feature import HashingTF, Tokenizer
from pyspark.ml.tuning import CrossValidator, ParamGridBuilder


training = spark.createDataFrame([
    (0, "a b c d e spark", 1.0),
    (1, "b d", 0.0),
    (2, "spark f g h", 1.0),
    (3, "hadoop mapreduce", 0.0),
    (4, "b spark who", 1.0),
    (5, "g d a y", 0.0),
    (6, "spark fly", 1.0),
    (7, "was mapreduce", 0.0),
    (8, "e spark program", 1.0),
    (9, "a e c l", 0.0),
    (10, "spark compile", 1.0),
    (11, "hadoop software", 0.0)
], ["id", "text", "label"])

# Конвейер:
tokenizer = Tokenizer(inputCol="text", outputCol="words")
hashingTF = HashingTF(inputCol=tokenizer.getOutputCol(), outputCol="features")
lr = LogisticRegression(maxIter=10)
pipeline = Pipeline(stages=[tokenizer, hashingTF, lr])

# Сетка параметров
paramGrid = ParamGridBuilder() \
    .addGrid(hashingTF.numFeatures, [10, 100, 1000]) \
    .addGrid(lr.regParam, [0.1, 0.05, 0.01]) \
    .build()

# Кросс-валидация
crossval = CrossValidator(
    estimator=pipeline,
    estimatorParamMaps=paramGrid,
    evaluator=BinaryClassificationEvaluator(),
    numFolds=3
)
cvModel = crossval.fit(training)

По окончании обучения Spark выбирает модель с наибольшей точностью. На ней уже можно выполнить тестирование модели на данных, которые не видела до этого модель. Пример кода для проведения тестирования модели машинного обучения в Spark:

test = spark.createDataFrame([
    (4, "spark i j k"),
    (5, "l m n"),
    (6, "mapreduce spark"),
    (7, "apache hadoop")
], ["id", "text"])

prediction = cvModel.transform(test)
prediction.show(truncate=False)
+---+---------------+--------------+----------+
|id |text           |probability   |prediction|
+---+---------------+--------------+----------+
|4  |spark i j k    |[0.126,0.874] |1.0       |
|5  |l m n          |[0.995,0.005] |0.0       |
|6  |mapreduce spark|[0.307,0.693] |1.0       |
|7  |apache hadoop  |[0.804,0.196] |0.0       |
+---+---------------+--------------+----------+

Разбиение на тренировочную и тестовую выборки с обучением

В дополнение к кросс-валидации в Spark есть класс TrainValidationSplit для разбиения на обучающую с поддержкой тюнинга и обучения. TrainValidationSplit оценивает каждую комбинацию параметров только один раз, поэтому, возвращаясь к предыдущему примеру, будет всего 9 итераций, а не 27. Следовательно, этот способ явно будет быстрее.

TrainValidationSplit имеет те же самые аргументы, что и CrossValidator, но у него нет параметра numFolds, поскольку выполняется один раз. Вместо numFolds, у него есть аргумент trainRatio, который определяет долю тренировочной выборки. Обучим модель машинного обучения на тех же данных, с той же сеткой параметров. Пример кода для обучения и валидации модели Machine Learning в Spark выглядит следующим образом:

from pyspark.ml.tuning import TrainValidationSplit

tvs = TrainValidationSplit(
    estimator=pipeline,
    estimatorParamMaps=paramGrid,
    evaluator=BinaryClassificationEvaluator(),
    # 80% данных на обучения, 20% на валидацию
    trainRatio=0.8
)

tvs_model = tvs.fit(training)

И также протестируем полученную наилучшую модель на других данных:

prediction = tvs_model.transform(test)
selected = prediction.select("id", "text", "probability", "prediction")
selected.show(truncate=False)
+---+---------------+-------------+----------+
|id |text           |probability  |prediction|
+---+---------------+-------------+----------+
|4  |spark i j k    |[0.258,0.742]|1.0       |
|5  |l m n          |[0.918,0.082||0.0       |
|6  |mapreduce spark|[0.432,0.568]|1.0       |
|7  |apache hadoop  |[0.677,0.323]|0.0       |
+---+---------------+-------------+----------+

 

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

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

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

Источники
  1. https://spark.apache.org/docs/latest/ml-classification-regression.html

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

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