www.machinelearningmastery.ru

Машинное обучение, нейронные сети, искусственный интеллект
Header decor

Home

Как запустить параллельный анализ данных в Python с использованием Dask Dataframes

Дата публикации Aug 25, 2018

Ваш разум на многоядерных процессорах. источник:Pixabay

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

Некоторое время назад я узнал об этом инструменте: способ ускорить анализ данных в Python без необходимости улучшения инфраструктуры или переключения языков. В конечном итоге он будет чувствовать себя ограниченным, если ваш набор данных огромен, но он масштабируется намного лучше, чем обычные панды, и может просто соответствовать вашей проблеме - особенно если вы не выполняете много переиндексаций.

Что такое Dask?

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

Вот выдержка из учебника:

Dask предоставляет коллекции Array, Bag и DataFrame высокого уровня, которые имитируют NumPy, списки и Pandas, но могут работать параллельно с наборами данных, которые не помещаются в основную память. Коллекции Dask высокого уровня являются альтернативами NumPy и Pandas для больших наборов данных.

Это так здорово, как кажется! Я решил попробовать Dask Dataframes для этой статьи и провел несколько тестов на них.

(Чтобы увидеть еще больше приложений для Dask в машинном обучении, посмотрите мойучебник по параллельной кластеризации k-средних)

Чтение документов

Сначала я прочитал официальную документацию, чтобы увидеть, что именно рекомендуется делать в Dask вместо обычных Dataframes. Вот соответствующие части изофициальные документы:

  • Манипулирование большими наборами данных, даже если эти наборы данных не помещаются в памяти
  • Ускорение длинных вычислений с использованием многих ядер
  • Распределенные вычисления на больших наборах данных со стандартными операциями Pandas, такими как групповые вычисления, объединения и вычисления временных рядов

А затем, ниже, перечислены некоторые вещи, которые действительно бывают быстрыми, если вы используете Dask Dataframes:

  • Арифметические операции (умножение или добавление к серии)
  • Общие агрегаты (среднее, минимальное, максимальное, сумма и т. Д.)
  • призваниеприменять (если оно идет по индексу, то есть не после группового элемента («y»), где «y» не является индексом)
  • Вызов value_counts (), drop_duplicates () или corr ()
  • Фильтрация сLOC,ви построчный выбор
Просто немного освежите фильтрацию Dataframes, если вы считаете это полезным.

Как использовать Dask Dataframes

Dask Dataframes имеют тот же API, что и Pandas Dataframes, за исключением агрегирования иподать заявлениеs оцениваются лениво, и должны быть вычислены путем вызовавычислениеметод. Для создания Dask Dataframe вы можете просто вызватьread_csvметод, как вы бы в Pandas или, учитывая Pandas DataframeД.Ф.Вы можете просто позвонить

dd = ddf.from_pandas(df, npartitions=N)

гдеDDFимя, с которым вы импортировали Dask Dataframes, иnpartitionsявляется аргументом, указывающим Dataframe, как вы хотите разделить его.

Согласно StackOverflow, рекомендуется разделять Dataframe примерно на столько разделов, сколько ядер у вашего компьютера, либо в пару раз больше, поскольку каждый раздел будет работать в отдельном потоке, и связь между ними станет слишком дорогой, если их будет слишком много. многие.

Испачкаться: давайте отметим!

Я сделал блокнот Jupyter, чтобы опробовать фреймворк, и сделал егодоступно на Githubв случае, если вы хотите проверить это или даже запустить его для себя.

Тесты бенчмаркинга, которые я провел, доступны в блокноте на Github, но вот основные из них:

ВотDF3обычный Pandas Dataframe с 25 миллионами строк, созданный с использованием скрипта из моегоПанды Учебник(столбцыимя Фамилияа такжеоплата труда, случайно выбранных из списка). Я взял набор данных из 50 строк и конкатенировал его 500000 раз, так как меня не слишком интересовал анализкак таковой, но только за то время, которое потребовалось для его запуска.

д.ф.н.это просто Dask Dataframe, основанный наDF3,

Первая партия результатов: не слишком оптимистично

Сначала я попробовал провести тест с 3 разделами, поскольку у меня только 4 ядра, и я не хотел перегружать свой компьютер. У меня были довольно плохие результаты с Dask, и мне пришлось слишком долго ждать, чтобы получить их, но я боялся, что это могло быть потому, что я сделал слишком мало разделов:

204.313940048 seconds for get_big_mean
39.7543280125 seconds for get_big_mean_old131.600986004 seconds for get_big_max
43.7621600628 seconds for get_big_max_old120.027213097 seconds for get_big_sum
7.49701309204 seconds for get_big_sum_old0.581165790558 seconds for filter_df
226.700095892 seconds for filter_df_old

Вы можете видеть, что большинство операций стали намного медленнее, когда я использовал Dask. Это дало мне подсказку, что мне, возможно, пришлось использовать больше разделов. Количество, которое потребовалось для создания ленивых оценок, также было незначительным (менее половины секунды в некоторых случаях), поэтому не похоже, что оно со временем амортизировалось бы, если бы я использовал их повторно.

Я также попробовал этот тест сподать заявлениеметод:

И имели довольно похожие результаты:

369.541605949 seconds for apply_random
157.643756866 seconds for apply_random_old

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

Больше разделов: удивительная скорость

После таких обескураживающих результатов я решил, что, возможно, я просто не использовал достаточно разделов. В конце концов, все дело в параллельности, так что, может быть, мне просто нужно больше распараллеливать? Итак, я попробовал те же тесты с 8 разделами, и вот что я получил (я пропустил результаты непараллельного фрейма данных, поскольку они были в основном одинаковыми):

3.08352184296 seconds for get_big_mean
1.3314101696 seconds for get_big_max
1.21639800072 seconds for get_big_sum
0.228978157043 seconds for filter_df112.135010004 seconds for apply_random
50.2007009983 seconds for value_count_test

Это верно! Большинство операций выполняются в десять раз быстрее, чем обычные Dataframe, и дажеподать заявлениестало быстрее! Я также управлялvalue_countтест, который просто вызываетvalue_countметод наоплата трудаСерии. Для контекста, имейте в виду, что мне пришлось убить процесс, когда я запускал этот тест на обычном Dataframe после десяти полных минут ожидания. На этот раз это заняло всего 50 секунд!
В общем, я просто неправильно использовал инструмент, и он чертовски быстр. Гораздо быстрее, чем обычные датафреймы.

Окончательный вынос

Учитывая, что на довольно старом 4-ядерном ПК мы работали с 25 миллионами строк менее чем за минуту, я вижу, насколько это будет огромным в отрасли. Поэтому я советую попробовать эту платформу в следующий раз, когда вам придется обрабатывать набор данных локально или из одного экземпляра AWS. Это довольно быстро.

Я надеюсь, что вы нашли эту статью интересной или полезной! Это заняло гораздо больше времени, чем я ожидал, так как некоторые из тестовпока, Пожалуйста, скажите мне, слышали ли вы когда-нибудь о Даске, прежде чем читать это, и использовали ли вы его когда-либо на работе или в проекте. Также скажите мне, есть ли другие интересные функции, которые я не описал, или некоторые вещи, которые я сделал неправильно! Ваши отзывы и комментарии являются основной причиной, по которой я пишу, поскольку я также учусь на этом.

Дальнейшее чтение для ученых данных:

Следуйте за мной для получения дополнительных уроков, советов и приемов Python! Если вам действительно понравилась эта статья, проверьтемой веб-сайтили следуй за мнойщебет,

Если вы хотите стать Data Scientist, посмотрите мой рекомендуемыйКниги по машинному обучению,

Оригинальная статья

Footer decor

© www.machinelearningmastery.ru | Ссылки на оригиналы и авторов сохранены. | map