Логистика Pyspark У объекта RDD регрессионного соответствия нет атрибута _jdf error - PullRequest
0 голосов
/ 06 июня 2019

Я использую Python для создания логистической регрессии и настроен на mllib для лучшей производительности

Я установил свечи и pyspark.

Мои данные хранятся в массиве numpy, и я легко могу преобразовать их в pandas dataframe.

Я пытался создать искровой фрейм данных для подачи в модель, но создание фрейма данных слишком медленное, и использование обычного Sklearn просто быстрее в целом

Я обнаружил, что используя алгоритм Arrow, используя этот конф

('spark.sql.execution.arrow.enabled', 'true')

может сделать это быстрее, но он все еще слишком медленный, и даже не использует ядра (я проверил свои конфигурации, и у исполнителя и драйвера настроено несколько ядер, но они не используются)

Я пытался использовать RDD вместо фрейма данных с этим кодом

d = [row.tolist() for row in encoded_data] 
d = [LabeledPoint(label, row) for label, row in zip(y_train, d)]
rdd = spark.parallelize(d)
lr.fit(rdd)

Но я продолжаю получать эту ошибку

AttributeError: у объекта 'RDD' нет атрибута '_jdf'

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

Я хотел бы найти лучший способ использования данных из массива - у меня есть два массива - один encoded_data, чем массив функций размера (n * m), и y_train, который является массивом меток (n * 1) , Мне нужно скормить это Логистической регрессии, чтобы улучшить время тренировок.

Данные по какой-то причине плотные, это числовые векторы функций, а не один горячий, поэтому я обратился к Spark, чтобы использовать локальные ядра, которые не используются в обучении Sklearn.

Спасибо.

1 Ответ

2 голосов
/ 06 июня 2019

Источником ошибки является использование несовместимых API.

Spark предоставляет два API ML:

  • Старый pyspark.mllib, который предназначен для работы с RDD с
  • Новый pyspark.ml, который предназначен для работы с DataFrame s

Вы lr объект явно принадлежит к последнему, в то время как parallelize является RDD. См. В чем разница между пакетами Spark ML и MLLIB , как указано в комментариях.

Кроме того, все ваше предположение неверно. Если ваша модель может быть легко обучена на локальных данных, на одном узле, с использованием стандартных библиотек Python, то у Spark ML нет шансов выиграть здесь. Spark - это масштабирование вашего процесса для больших наборов данных, а не уменьшение задержки.

См. Почему Apache-Spark - Python локально медленный по сравнению с пандами?

Кроме того, использование плотных структур (я полагаю, это то, что вы подразумеваете под массивами NumPy) для представления данных с горячим кодированием очень неэффективно и существенно повлияет на производительность в целом (Spark поставляется со своим собственным API-интерфейсом Pipeline API). который, помимо прочего, обеспечивает однократное кодирование , что дает разреженное представление).

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

...