Уроки выучены

Итак, после нескольких запусков реализации Isolation Forest в PySpark ml, представленной здесь, я наткнулся на пару вещей и подумал, что напишу о них, чтобы вы не тратили зря время, которое я тратил на устранение неполадок.

Только плотные векторы

В предыдущей статье я использовал VectorAssembler для сбора векторов признаков. Так получилось, что имеющиеся у меня тестовые данные были созданы только DenseVectors, но когда я попробовал этот пример на другом наборе данных, я понял, что:

  • VectorAssembler может создавать как плотные, так и разреженные векторы в одном и том же фрейме данных (что является умным, и другие алгоритмы искры ML могут использовать его и работать с ним)
  • Isolation Forest (или, по крайней мере, реализация, найденная здесь) не поддерживает вышеуказанное, поэтому ввод должен быть только DenseVectors.

Чтобы продемонстрировать проблему:

Текущий обходной путь - преобразовать все векторы в плотные, к сожалению, используя udf.

Избегайте проблем с общением с OOM и исполнителем

Задайте оккупантилерелативееррор или порог параметр для больших наборов данных

Если вы планируете тренироваться на большом наборе данных, например более 10 миллионов строк, даже если вы установите такие параметры, как maxSamples и maxFeatures для уменьшения размеров, вам необходимо установить параметр approxQuantileRelativeError на что-нибудь разумное, например 0.2. Причина в том, что функция approxQuantile - очень дорогая функция, особенно если мы ожидаем, что approxQuantileRelativeError будет 0. (значение по умолчанию). Благодаря этому резко сократилось время обучения и проблемы с общением с OOM и исполнителем, и до сих пор я не видел никакого снижения точности прогнозов.

Из комментариев реализации:

* The proportion of outliers in the data set (0< contamination < 1).
* It will be used in the prediction. In order to enhance performance,
* Our method to get anomaly score threshold adopts DataFrameStsFunctions.approxQuantile,
* which is designed for performance with some extent accuracy loss.
* Set the param approxQuantileRelativeError (0 < e < 1) to calculate
* an approximate quantile threshold of anomaly scores for large dataset.

В качестве альтернативы можно заранее установить threshold и избегать такого вычисления approxQuantile:

model = iforest.fit(df, {'threshold': 0.5})
print(model.getThreshold())
> 0.49272560194039505

Надеюсь, это поможет и сэкономит вам время :) Дайте мне знать, если у вас есть предложения, исправления или идеи.

Подробнее о том, как использовать Isolation Forest с pyspark, читайте здесь:



Куда дальше?

Понимание прогнозов вашей модели: