Русский
Русский
English
Статистика
Реклама

Data science

Перевод Шпаргалка по сортировке для Data Science

16.06.2020 20:21:53 | Автор: admin
image

Сортировка данных является основной задачей для ученых и инженеров по обработке данных. Пользователи Python могут выбирать наиболее удобную из ряда библиотек со встроенными, оптимизированными опциями сортировки. Некоторые даже работают параллельно с GPU. На удивление, некоторые методы сортировки не используют указанные типы алгоритмов, а другие работают совсем не так, как ожидалось.

Выбор библиотеки и типа алгоритма сортировки не всегда прост, а нововведения меняются в быстром темпе. На данный момент документация Pandas не соответствует коду (хотя лично мое PR-обновление сортировочных опций было самым последним).

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

UPD 17 июля 2019: В результаты оценки теста скорости теперь входят реализации GPU PyTorch и TensorFlow. TensorFlow также включает в себя результаты CPU как при tensorflow==2.0.0-beta1, так и при tensorflow-gpu==2.0.0-beta1. Интересные наблюдения: графический процессор PyTorch буквально летает, а GPU TensorFlow оказался медленнее CPU TensorFlow.

Контекст


Базовых алгоритмов сортировки существует множество. Одни из них имеют высокую производительность и занимают меньше места, другие хорошо работают с большим числом данных. Для некоторых алгоритмов важно взаимное расположение элементов данных. На диаграмме в начале статьи можно увидеть ситуацию по времени и объему для самых распространенных алгоритмов.

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

image

За многие годы алгоритмы сортировки изменились в большинстве библиотек. Для анализа в этой статье я взял следующие версии ПО.

python 3.6.8
numpy 1.16.4
pandas 0.24.2
tensorflow==2.0.0-beta1 #tensorflow-gpu==2.0.0-beta1 slows sorting
pytorch 1.1


Начнем с основ.

Python (vanilla)


Python содержит два встроенных метода сортировки.

  • my_list.sort() сортирует список на месте, при этом исходный список заменяется на сортированный. sort() возвращает None.
  • sorted(my_list) возвращает отсортированную копию для каждой итерации. sorted() возвращает отсортированную итерацию. sort()не изменяет исходный список.

По идее, sort() должен быть быстрее, так как сортировка происходит на месте. На удивление, особой разницы между ними нет. К тому же, sort() стоит использовать аккуратно, так как он изменяет исходные данные без сохранения.

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

Что касается нашего случая, чтобы изменить порядок сортировки на нисходящий в Vanilla Python, нужно задать reverse=True.

key может быть заявлен ключевым словом для вашего уникального критерия. Например, sort(key=len) отсортирует элементы списка по их длине.

Единственный алгоритм сортировки, используемый в Vanilla Python Timsort. Посредством данного алгоритма сортировка данных производится по их основным критериям. Например, если требуется сортировать короткий список, используется сортировка вставками. Дополнительную информацию о Timsort см. в большой статье Брэндона Скерритта.

Timsort и, соответственно, Vanilla Python, постоянны. То есть, если исходные значение одинаковы, то и обработанные значения будут аналогичны и расположены в том же порядке.
Чтобы напомнить разницу между sort() и sorted(), я лишь замечу, что sorted() это более сложная команда, чем sort(), и что sorted() займет объективно больше времени, ведь при этом сохраняются и исходные данные, и копия. И пусть результаты тестов неоднозначны, мнемоника наше все.

Теперь предлагаю рассмотреть использование Numpy.

Numpy


Numpy это фундаментальная библиотека Python для научных вычислений. Как и у Vanilla Python, вариантов реализации у нее два: либо копирование, либо изменение массива исходных данных:

  • my_array.sort () изменяет массив на месте и возвращает отсортированный массив;
  • np.sort (my_array) возвращает копию отсортированного массива, при этом не изменяя исходные данные.

Аргументы, используемые дополнительно:

  • axis: int, optional ось, по которой производится сортировка. По умолчанию -1 сортировка по последней оси.
  • kind: {quicksort, mergesort, heapsort, stable} алгоритм сортировки. По умолчанию используется quicksort быстрая сортировка. Далее я расскажу об этом подробнее.
  • order: str или list of str когда a является массивом с определенными границами, этот аргумент указывает, в каком порядке эти границы сравниваются. Одно поле может быть задано в виде строки, дальнейшие поля можно не конкретизировать. Они в любом случе будут использоваться в dtype для перебивок.

Откровенно говоря, на данным момент алгоритмы сортировки фактически соответствуют их названиям. Команда kind=quicksort буквально означает, что сортировка начинается с интроспективной сортировки. Подробнее здесь.

В случае, если удовлетворительного результата нет, происходит переключение на алгоритм heapsort. В худшем случае сортировка происходит по быстрому циклу O(n* log (n)).

stable автоматически выбирает наиболее приемлемый вариант сортировки. Данный параметр, наряду с сортировкой слиянием, на данный момент сопоставляется с сортировкой timsort или radix, в зависимости от типа данных. Прямая совместимость API в настоящее время ограничивает возможность выбора реализации, и она жестко привязана к различным типам данных.

Timsort применяется на предварительно подготовленных или близких к финальной сортировке данных. По случайным данным timsort практически идентичен mergesort. На данный момент он используется для конкретной сортировки, в то время как быстрая сортировка по-прежнему реализуется по умолчанию, и если конкретного выбора нет mergesort и stable выполняются для целочисленных типов данных автоматически.
Из документов Numpy (после парочки моих правок)


Один из важнейших выводов: Numpy позволяет управлять параметрами сортировки более свободно, чем Vanilla Python. Второй вывод, не менее важный: ключевое слово kind совершенно не обязательно соответствует используемому типу сортировки. И наконец, финальный итог, если можно так сказать, заключается в том, что mergesort и stable являются определнными сортировками, а quicksort и heapsort нет.

В нашем списке Numpy единственный метод, не имеющий ключевого слова для изменения порядка сортировки. На наше счастье, сделать это можно своеобразным переворотом массива: my_arr[::-1].

Все функции Numpy также доступны в куда более удобном для использования Pandas.

Pandas


Проводить сортировку можно в Pandas DataFrame с df.sort_values (by=my_column). Для удобства здесь имеется несколько ключевых слов.

  • by: str или list of str обязательное имя или список имен для сортировки. Если ось = 0 или конкретному значению, то она может содержать уровни значений/имена столбцов. Если ось приравнивается 1 или столбцу, то она может содержать уровни столбцов и/или метки значений.
  • axis: {0 или индекс, 1 или столбец}, по умолчанию 0 ось для сортировки.
  • ascending: bool или список bool, значение по умолчанию True сортировка по возрастанию или по убыванию. Укажите список для нескольких порядков сортировки. Если это список болтов, должен соответствовать длине аргумента by.
  • inplace: bool, по умолчанию False если назначить True, операция выполняется на месте.
  • kind: {quicksort, mergesort, heapsort или stable}, по умолчанию quicksort выбор алгоритма сортировки. Для получения дополнительной информации можно посмотреть ndarray.np.sort. Для DataFrames этот параметр применяется только при сортировке по одному столбцу или метке.
  • na_position: {first, last}, по умолчанию last first ставит NaNs в начале, last ставит NaNs в конце.


Pandas Series реализуется с таким же синтаксисом. В Series нет необходимости в ключевом слове by, поскольку нет нескольких столбцов с данными.

Поскольку под капотом у Pandas Numpy, у вас под рукой есть те же оптимизированные параметры сортировки. Тем не менее, использование Pandas чуть более трудозатратно.

При сортировке по одному столбцу в Numpy по умолчанию используется quicksort. Как вы помните, quicksort теперь фактически является вводной и переходит в пирамидальную, если процесс сортировки идет медленно. Pandas заявляют, что сортировка по нескольким столбцам использует mergesort Numpy. mergesort в Numpy фактически использует алгоритмы сортировки Timsort или Radix. Это стабильные алгоритмы сортировки, что необходимо при сортировке по нескольким столбцам.

Для Pandas есть несколько ключевых моментов, которые стоит запомнить:

  • Имя функции: sort_values().
  • Необходимо заявить by=column_name или список имен столбцов.
  • ascending ключевое слово для реверса.
  • Для стабильной сортировки используйте mergesort.


При аналитической обработке данных я часто сталкиваюсь с суммированием и сортировкой значений в Pandas DataFrame с помощью Series.value_counts(). Вот фрагмент кода для суммирования и сортировки наиболее частых значений для каждого столбца.

for c in df.columns:    print(f"---- {c} ---")    print(df[c].value_counts().head())


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

Сортировка в Pandas это хороший выбор для предварительной сортировки небольших объемов данных. Если же вы имеете большой объем данных и хотите параллельно работать с GPU, стоит обратить внимание на TensorFlow или PyTorch.

TensorFlow


TensorFlow самая популярная среда для deep learning. Больше о глубоком изучении можно узнать в моей статье по ссылке здесь. Приведенная ниже информация актуальна для GPU TensorFlow 2.0.

tf.sort(my_tensor) возвращает отсортированную копию тензора. Опциональные аргументы:

  • axis: {int} Ось, по которой производится сортировка. По умолчанию равянется -1 и сортирует последнюю ось.
  • direction: {ascending или descending} направление сортировки значений.
  • name: {str} имя для операции.


tf.sort по сути использует top_k(). Для top_k() используется библиотека CUB для CUDA GPU, что упрощает параллельную реализацию. В документации говорится, что CUB предоставляет современные и повторяемые программные компоненты для каждого уровня модели программирования CUDA. TensorFlow использует основную сортировку на GPU через CUB (обсуждение).

Информацию по TensorFlow GPU можно найти здесь. Чтобы активировать возможности графического процессора с TensorFlow 2.0, вам необходимо прописать !pip3 install tensorflow-gpu==2.0.0-beta1. Ниже будет видно, что вы можете следовать по пути tensorflow==2.0.0-beta1, если вы только лишь сортируете данные (что маловероятно).

Для проверки кода на CPU и GPU используйте следующую строку:

tf.debugging.set_log_device_placement(True)

Чтобы указать, что вы хотите использовать GPU, нужно воспользоваться таким блоком:

with tf.device('/GPU:0'):
%time tf.sort(my_tf_tensor)


Для использования CPU: with tf.device('/CPU:0').

tf.sort() это интуитивно понятный метод при работе в TensorFlow. Просто запомните, что direction=descending нужен для изменения порядки сортировки.

PyTorch


torch.sort(my_tensor) возвращает отсортированную копию тензора. Необязательные аргументы:

  • dim: {int} объем сортировки.
  • descending: {bool} управляет порядком сортировки (по возрастанию или по убыванию).
  • out: {tuple} выходное сопровождение (Tensor, LongTensor), которое может использоваться в качестве выходных буферов.


Если вы хотите использовать GPU для сортировки, прикрепите .cuda () к концу вашего тензора.

gpu_tensor=my_pytorch_tensor.cuda()
%time torch.sort(gpu_tensor)


Исследования показали, что PyTorch использует сегментированную параллельную сортировку через Thrust, если сортируется набор данных размером более 1 миллиона строк на 100 000 столбцов.

К сожалению, у меня не хватило памяти, когда я пытался создать произвольные данные размером 1.1 миллиона на 100 тысяч через Numpy в Google Colab. После этого я попробовал GCP с 416 МБ ОЗУ, и мне вновь не хватило памяти.

Сегментированная сортировка и сортировка по местоположению это высокопроизводительные варианты сортировки слиянием, которые работают с неоднородными случайными данными. Сегментированная сортировка позволяет сортировать множество массивов переменной длины параллельно. https://moderngpu.github.io/segsort.html


Thrust это библиотека параллельных алгоритмов, которая обеспечивает совместимость производительности GPU и многояденых CPU. Она предоставляет сортировочную основу, которая автоматически выбирает наиболее эффективный метод реализации. Библиотека CUB, используемая TensorFlow, облегчает нагрузку. PyTorch и TensorFlow используют аналогичные алгоритмы для сортировки GPU независимо от того, какой применяется подход.

Как и TensorFlow, метод сортировки в PyTorch довольно прост для запоминания: torch.sort(). Единственное, что нужно запомнить, это направление отсортированных значений: TensorFlow использует direction, а PyTorch descending. И не забудьте использовать .cuda(), чтобы максимально увеличить скорость при работе с большим объемом данных.

Хотя сортировка с использованием GPU может выступать хорошим вариантом для очень больших наборов данных, также имеет смысл сортировать данные непосредственно в SQL.

SQL


Сортировка в SQL обычно выполняется очень быстро, особенно если сортировка происходит непосредственно в памяти.

SQL это спецификация, которая при этом не обязывает использовать определенный алгоритм. Postgres использует сортировку слиянием дисков, пирамидальную или быструю сортировку в зависимости от обстоятельств. Если у вас достаточно памяти, сортировки можно провести в ней, причем намного быстрее. Увеличить доступную память для сортировок можно с помощью настройки work_mem.

Другие варианты SQL используют разные алгоритмы сортировки. Например, Google BigQuery использует внутреннюю сортировку с некоторыми приемами, вроде тех, что представлены в ответе на Stack Overflow.

Сортировка в SQL выполняется командой ORDER BY. Этот синтаксис отличается от Python, где предпочитают использовать ту или иную форму слова sort. Лично мне запомнилось, что ORDER BY используется в синтаксисе SQL, так как это довольно необычно.

Чтобы отсортировать данные по убыванию, используйте ключевое слово DESC. Таким образом, запрос на возврат данных в алфавитном порядке от последнего к первому будет выглядеть так:

SELECT Names FROM CustomersORDER BY Names DESC;


Сравнение


Для каждой из вышеперечисленных библиотек Python я провел анализ, сортируя 1 000 000 точек данных в одном столбце, массиве или списке. Я использовал ноутбук Google Colab Jupyter с GPU K80 и Intel Xeon CPU с тактовой частотой 2,30 ГГц.

image

Наблюдения


  • PyTorch с GPU максимально быстрый.
  • Как для Numpy, так и для Pandas, сортировка на месте, как правило, быстрее, чем с копированием данных.
  • Быстрая сортировка Pandas по умолчанию довольно быстрая.
  • Большинство функций Pandas сравнительно медленнее, чем их аналоги в Numpy.
  • Процессор TensorFlow довольно быстрый. Установка GPU замедляет работу TensorFlow даже при использовании CPU. Сортировка GPU довольно медленная. Этот вариант не слишком эффективен
  • В Vanilla Python сортировка на месте происходит на удивление медленно почти в 100 раз медленнее, чем сортировка с поддержкой графического процессора PyTorch. Я посторил опыт несколько раз (с разными данными), чтобы перепроверить, что это не аномалия.


Опять же, это всего лишь один небольшой тест. Определенно, это не конечный результат.

Подведем итоги


Как правило, вам не нужны собственные разработки вариантов сортировки. Готовые варианты вполне удовлетворительны, и зачастую используют не один метод сортировки. Вместо этого они сначала оценивают данные, а затем используют проверенный алгоритм сортировки. Некоторые версии даже модифицируют алгоритмы, если сортировка подтормаживает.

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

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

  • Используйте Pandas sort_values() по умолчанию для исследования относительно небольших наборов данных.
  • Для больших наборов данных или когда скорость достаточно высока, попробуйте встроенную сортировку Numpy на месте, параллельную реализацию GPU PyTorch или TensorFlow, или SQL.


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

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод О нет! Моя Data Science ржавеет

04.07.2020 14:10:42 | Автор: admin
Привет, Хабр!

Предлагаем вашему вниманию перевод интереснейшего исследования от компании Crowdstrike. Материал посвящен использованию языка Rust в области Data Science (применительно к malware analysis) и демонстрирует, в чем Rust на таком поле может посоперничать даже с NumPy и SciPy, не говоря уж о чистом Python.


Приятного чтения!

Python один из самых популярных языков программирования для работы с data science, и неслучайно. В индексе пакетов Python (PyPI) найдется огромное множество впечатляющих библиотек для работы с data science, в частности, NumPy, SciPy, Natural Language Toolkit, Pandas и Matplotlib. Благодаря изобилию высококачественных аналитических библиотек в доступе и обширному сообществу разработчиков, Python очевидный выбор для многих исследователей данных.

Многие из этих библиотек реализованы на C и C++ из соображений производительности, но предоставляют интерфейсы внешних функций (FFI) или привязки Python, так, чтобы из функции можно было вызывать из Python. Эти реализации на более низкоуровневых языках призваны смягчить наиболее заметные недостатки Python, связанные, в частности, с длительностью выполнения и потреблением памяти. Если удается ограничить время выполнения и потребление памяти, то сильно упрощается масштабируемость, что критически важно для сокращения расходов. Если мы сможем писать высокопроизводительный код, решающий задачи data science, то интеграция такого кода с Python станет серьезным преимуществом.

При работе на стыке data science и анализа вредоносного ПО требуется не только скоростное выполнение, но и эффективное использование разделяемых ресурсов, опять же, для масштабирования. Проблема масштабирования является одной из ключевых в области больших данных, как, например, эффективная обработка миллионов исполняемых файлов на множестве платформ. Для достижения хорошей производительности на современных процессорах требуется параллелизм, обычно реализуемый при помощи многопоточности; но также необходимо повышать эффективность выполнения кода и расхода памяти. При решении подобных задач бывает сложно сбалансировать ресурсы локальной системы, а правильно реализовать многопоточные системы даже сложнее. Суть C и C++ такова, что потокобезопасность в них не предоставляется. Да, существуют внешние платформо-специфичные библиотеки, но обеспечение потокобезопасности, это, очевидно, долг разработчика.

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

Но есть Rust. Язык Rust во многом позиционируется как идеальное решение всех потенциальных проблем, обрисованных выше: время выполнения и потребление памяти сравнимы с C и C++, а также предоставляется обширная типобезопасность. Также в языке Rust предоставляются дополнительные приятности, в частности, серьезные гарантии безопасности памяти и никаких издержек времени исполнения. Поскольку таких издержек нет, упрощается интеграция кода Rust с кодом других языков, в частности, Python. В этой статье мы сделаем небольшую экскурсию по Rust, чтобы понять, достоин ли он связанного с ним хайпа.

Пример приложения для Data Science


Data science очень широкая предметная область со множеством прикладных аспектов, и обсудить их все в одной статье невозможно. Простая задача для data science вычисление информационной энтропии для байтовых последовательностей. Общая формула для расчета энтропии в битах приводится в Википедии:



Чтобы рассчитать энтропию для случайной переменной X, мы сначала считаем, сколько раз встречается каждое возможное байтовое значение , а потом делим это число на общее количество встречающихся элементов, чтобы вычислить вероятность встретить конкретное значение , соответственно . Затем считаем отрицательное значение от взвешенной суммы вероятностей конкретного значения xi, встречающегося , а также так называемую собственную информацию . Поскольку мы вычисляем энтропию в битах, здесь используется (обратите внимание на основание 2 для бит).

Давайте испробуем Rust и посмотрим, как он справляется с вычислением энтропии по сравнению с чистым Python, а также с некоторыми популярнейшими библиотеками Python, упомянутыми выше. Это упрощенная оценка потенциальной производительности Rust в области data science; данный эксперимент не является критикой Python или отличных библиотек, имеющихся в нем. В этих примерах мы сгенерируем собственную библиотеку C из кода Rust, который сможем импортировать из Python. Все тесты проводились на Ubuntu 18.04.

Чистый Python


Начнем с простой функции на чистом Python (в entropy.py) для расчета энтропии bytearray, воспользуемся при этом только математическим модулем из стандартной библиотеки. Эта функция не оптимизирована, возьмем ее в качестве отправной точки для модификаций и измерения производительности.

import mathdef compute_entropy_pure_python(data):    """Compute entropy on bytearray `data`."""    counts = [0] * 256    entropy = 0.0    length = len(data)    for byte in data:        counts[byte] += 1    for count in counts:        if count != 0:            probability = float(count) / length            entropy -= probability * math.log(probability, 2)    return entropy

Python с NumPy и SciPy


Неудивительно, что в SciPy предоставляется функция для расчета энтропии. Но сначала мы воспользуемся функцией unique() из NumPy для расчета частот байтов. Сравнивать производительность энтропийной функции SciPy с другими реализациями немного нечестно, так как в реализации из SciPy есть дополнительный функционал для расчета относительной энтропии (расстояния Кульбака-Лейблера). Опять же, мы собираемся провести (надеюсь, не слишком медленный) тест-драйв, чтобы посмотреть, какова будет производительность скомпилированных библиотек Rust, импортированных из Python. Будем придерживаться реализации из SciPy, включенной в наш скрипт entropy.py.

import numpy as npfrom scipy.stats import entropy as scipy_entropydef compute_entropy_scipy_numpy(data):    """Вычисляем энтропию bytearray `data` с SciPy и NumPy."""    counts = np.bincount(bytearray(data), minlength=256)    return scipy_entropy(counts, base=2)

Python с Rust


Далее мы несколько подробнее исследуем нашу реализацию на Rust, по сравнению с предыдущими реализациями, ради основательности и закрепления. Начнем с принимаемого по умолчанию библиотечного пакета, сгенерированного при помощи Cargo. В следующих разделах показано, как мы модифицировали пакет Rust.

cargo new --lib rust_entropyCargo.toml

Начинаем с обязательного файла манифеста Cargo.toml, в котором определяем пакет Cargo и указываем имя библиотеки, rust_entropy_lib. Используем общедоступный контейнер cpython (v0.4.1), доступный на сайте crates.io, в реестре пакетов Rust Package Registry. В статье мы используем Rust v1.42.0, новейшую стабильную версию, доступную на момент написания.

[package] name = "rust-entropy"version = "0.1.0"authors = ["Nobody <nobody@nowhere.com>"] edition = "2018"[lib] name = "rust_entropy_lib"crate-type = ["dylib"][dependencies.cpython] version = "0.4.1"features = ["extension-module"]

lib.rs


Реализация библиотеки Rust весьма проста. Как и в случае с нашей реализацией на чистом Python, мы инициализируем массив counts для каждого возможного значения байт и перебираем данные для наполнения counts. Для завершения операции вычисляем и возвращаем отрицательную сумму вероятностей, умноженную на вероятностей.

use cpython::{py_fn, py_module_initializer, PyResult, Python};/// вычисляем энтропию массива байтfn compute_entropy_pure_rust(data: &[u8]) -> f64 {    let mut counts = [0; 256];    let mut entropy = 0_f64;    let length = data.len() as f64;    // collect byte counts    for &byte in data.iter() {        counts[usize::from(byte)] += 1;    }    // вычисление энтропии    for &count in counts.iter() {        if count != 0 {            let probability = f64::from(count) / length;            entropy -= probability * probability.log2();        }    }    entropy}

Все, что нам остается взять из lib.rs это механизм для вызова чистой функции Rust из Python. Мы включаем в lib.rs функцию, приспособленную к работе с CPython (compute_entropy_cpython()) для вызова нашей чистой функции Rust (compute_entropy_pure_rust()). Поступая таким образом, мы только выигрываем, так как будем поддерживать единственную чистую реализацию Rust, а также предоставим обертку, удобную для работы с CPython.

/// Функция Rust для работы с CPython fn compute_entropy_cpython(_: Python, data: &[u8]) -> PyResult<f64> {    let _gil = Python::acquire_gil();    let entropy = compute_entropy_pure_rust(data);    Ok(entropy)}// инициализируем модуль Python и добавляем функцию Rust для работы с CPython py_module_initializer!(    librust_entropy_lib,    initlibrust_entropy_lib,    PyInit_rust_entropy_lib,    |py, m | {        m.add(py, "__doc__", "Entropy module implemented in Rust")?;        m.add(            py,            "compute_entropy_cpython",            py_fn!(py, compute_entropy_cpython(data: &[u8])            )        )?;        Ok(())    });

Вызов кода Rust из Python


Наконец, вызываем реализацию Rust из Python (опять же, из entropy.py). Для этого сначала импортируем нашу собственную динамическую системную библиотеку, скомпилированную из Rust. Затем просто вызываем предоставленную библиотечную функцию, которую ранее указали при инициализации модуля Python с использованием макроса py_module_initializer! в нашем коде Rust. На данном этапе у нас всего один модуль Python (entropy.py), включающий функции для вызова всех реализаций расчета энтропии.

import rust_entropy_libdef compute_entropy_rust_from_python(data):    ""Вычисляем энтропию bytearray `data` при помощи Rust."""    return rust_entropy_lib.compute_entropy_cpython(data)

Мы собираем вышеприведенный библиотечный пакет Rust на Ubuntu 18.04 при помощи Cargo. (Эта ссылка может пригодиться пользователям OS X).

cargo build --release

Закончив со сборкой, мы переименовываем полученную библиотеку и копируем ее в тот каталог, где находятся наши модули Python, так, чтобы ее можно было импортировать из сценариев. Созданная при помощи Cargo библиотека называется librust_entropy_lib.so, но ее потребуется переименовать в rust_entropy_lib.so, чтобы успешно импортировать в рамках этих тестов.

Проверка производительности: результаты


Мы измеряли производительность каждой реализации функции при помощи контрольных точек pytest, рассчитав энтропию более чем для 1 миллиона случайно выбранных байт. Все реализации показаны на одних и тех же данных. Эталонные тесты (также включенные в entropy.py) показаны ниже.

# ### КОНТРОЛЬНЕ ТОЧКИ #### генерируем случайные байты для тестирования w/ NumPyNUM = 1000000VAL = np.random.randint(0, 256, size=(NUM, ), dtype=np.uint8)def test_pure_python(benchmark):    """тестируем чистый Python."""    benchmark(compute_entropy_pure_python, VAL)def test_python_scipy_numpy(benchmark):    """тестируем чистый Python со SciPy."""    benchmark(compute_entropy_scipy_numpy, VAL)def test_rust(benchmark):    """тестируем реализацию Rust, вызываемую из Python."""    benchmark(compute_entropy_rust_from_python, VAL)

Наконец, делаем отдельные простые драйверные скрипты для каждого метода, нужного для расчета энтропии. Далее идет репрезентативный драйверный скрипт для тестирования реализации на чистом Python. В файле testdata.bin 1 000 000 случайных байт, используемых для тестирования всех методов. Каждый из методов повторяет вычисления по 100 раз, чтобы упростить захват данных об использовании памяти.

import entropywith open('testdata.bin', 'rb') as f:    DATA = f.read()for _ in range(100):    entropy.compute_entropy_pure_python(DATA)

Реализации как для SciPy/NumPy, так и для Rust показали хорошую производительность, легко обставив неоптимизированную реализацию на чистом Python более чем в 100 раз. Версия на Rust показала себя лишь немного лучше, чем версия на SciPy/NumPy, но результаты подтвердили наши ожидания: чистый Python гораздо медленнее скомпилированных языков, а расширения, написанные на Rust, могут весьма успешно конкурировать с аналогами на C (побеждая их даже в таком микротестировании).

Также существуют и другие методы повышения производительности. Мы могли бы использовать модули ctypes или cffi. Могли бы добавить подсказки типов и воспользоваться Cython для генерации библиотеки, которую могли бы импортировать из Python. При всех этих вариантах требуется учитывать компромиссы, специфичные для каждого конкретного решения.



Мы также измерили расход памяти для каждой реализации функции при помощи приложения GNU time (не путайте со встроенной командой оболочки time). В частности, мы измерили максимальный размер резидентной части памяти (resident set size).

Тогда как в реализациях на чистом Python и Rust максимальные размеры этой части весьма схожи, реализация SciPy/NumPy потребляет ощутимо больше памяти по данному контрольному показателю. Предположительно это связано с дополнительными возможностями, загружаемыми в память при импорте. Как бы то ни было, вызов кода Rust из Python, по-видимому, не привносит серьезных накладных расходов памяти.



Итоги


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

Rust показал не только отличное время выполнения; следует отметить, что и накладные расходы памяти в этих тестах также оказались минимальными. Такие характеристики времени выполнения и использования памяти представляются идеальными для целей масштабирования. Производительность реализаций SciPy и NumPy C FFI определенно сопоставима, но с Rust мы получаем дополнительные плюсы, которых не дают нам C и C++. Гарантии по безопасности памяти и потокобезопасности это очень привлекательное преимущество.

Тогда как C обеспечивает сопоставимое с Rust время выполнения, C как таковой не предоставляет потокобезопасности. Существуют внешние библиотеки, обеспечивающие такой функционал для C, но за правильность их использования полностью отвечает разработчик. Rust следит за проблемами потокобезопасности, например, за возникновением гонок, во время компиляции благодаря реализованной в нем модели владения а стандартная библиотека предоставляет комплект механизмов конкурентности, среди которых каналы, блокировки и умные указатели с подсчетом ссылок.

Мы не призываем портировать SciPy или NumPy на Rust, так как эти библиотеки Python уже хорошо оптимизированы и поддерживаются классными сообществами разработчиков. С другой стороны, мы настоятельно рекомендуем портировать с чистого Python на Rust такой код, который не предоставляется в высокопроизводительных библиотеках. В контексте приложений для data science, используемых для анализа безопасности, Rust представляется конкурентоспособной альтернативой для Python, учитывая его скорость и гарантии безопасности.
Подробнее..

Перевод Интерактивная визуализация данных при помощи Plotly строим красивые графики с Express и Cufflinks

25.06.2020 22:10:00 | Автор: admin
image


Если Вы все еще используете Matplotlib для создания графиков в Python, самое время взглянуть на мир с высоты альтернативной библиотеки интерактивной визуализации.

Plotly позволяет создавать красивые, интерактивные, экспортируемые графики с помощью всего нескольких строк кода. Однако без карты подъем в гору Plotly может быть медленным и мучительным.

Вот камни преткновения, которые могут появиться на пути авантюристов, решивших покорить эту гору:

  • непонятная начальная настройка для работы оффлайн без аккаунта;
  • неимоверное количество строк кода;
  • устаревшая документация;
  • множество различных инструментов Plotly, в которых можно заблудиться (Dash, Express, Chart Studio и Cufflinks).

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

Plotly


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

Plotly.py основывается на JavaScript-библиотеке D3.js. Также в Plotly есть API-обертки для R, Julia и многих других языков программирования. Стоит отметить, что документация представлена не на всех языках.

image

Примеры библиотек от Plotly

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

cufflinks                0.15jupyterlab             0.35.5plotly                   3.8.1     plotly-express       0.1.7


Убедитесь, что используется cufflinks 0.15 (0.13 не очень дружит с последними обновлениями Plotly).
ПРАВКА (май 2020): самая свежая версия Plotly 4.7.1. Большая часть представленных ниже инструкций все так же применима к последней версии программы. Обратите внимание, что экспресс-модуль импортируется как часть пакета Plotly.

plotly.py


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

Установите простой модуль plotly.py с conda или воспользуйтесь pip install plotly.

Импортируйте модуль и сконфигурируйте его для использования в оффлайн-режиме:

import plotly.offline as pypy.init_notebook_mode(connected=False)


Теперь программа не будет требовать у Вас создать аккаунт. Так мы и преодолели первую преграду на пути к вершине горы Plotly.

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

image

Ниже представлено объемное описание кода, адаптированного из документации, необходимой для создания такого витиеватого графика.

import pandas as pdimport numpy as npimport plotly.offline as pyimport plotly.graph_objs as goimport jsonpy.init_notebook_mode(connected=False)izip = zipdf = pd.read_csv('https://raw.githubusercontent.com/plotly/datasets/master/globe_contours.csv')df.head()contours = []scl = ['rgb(213,62,79)','rgb(244,109,67)','rgb(253,174,97)',\       'rgb(254,224,139)','rgb(255,255,191)','rgb(230,245,152)',\       'rgb(171,221,164)','rgb(102,194,165)','rgb(50,136,189)']def pairwise(iterable):    a = iter(iterable)    return izip(a, a)i=0for lat, lon in pairwise(df.columns):    contours.append( dict(        type = 'scattergeo',        lon = df[lon],        lat = df[lat],        mode = 'lines',        line = dict(            width = 2,            color = scl[i]        )    ) )    i = 0 if i+1 >= len(df.columns)/4 else i+1    layout = dict(        margin = dict( t = 0, l = 0, r = 0, b = 0 ),        showlegend = False,                 geo = dict(            showland = True,            showlakes = True,            showcountries = True,            showocean = True,            countrywidth = 0.5,            landcolor = 'rgb(230, 145, 56)',            lakecolor = 'rgb(0, 255, 255)',            oceancolor = 'rgb(0, 255, 255)',            projection = dict(                 type = 'orthographic',                rotation = dict(lon = 0, lat = 0, roll = 0 )                        ),            lonaxis = dict(                 showgrid = True,                gridcolor = 'rgb(102, 102, 102)',                gridwidth = 0.5            ),            lataxis = dict(                 showgrid = True,                gridcolor = 'rgb(102, 102, 102)',                gridwidth = 0.5            )        )    )sliders = []lon_range = np.arange(-180, 180, 10)lat_range = np.arange(-90, 90, 10)sliders.append(     dict(        active = len(lon_range)/2,        currentvalue = {"prefix": "Longitude: "},        pad = {"t": 0},        steps = [{                'method':'relayout',                 'label':str(i),                'args':['geo.projection.rotation.lon', i]} for i in lon_range]    )      )sliders.append(     dict(        active = len(lat_range)/2,        currentvalue = {"prefix": "Latitude: "},        pad = {"t": 100},        steps = [{                'method':'relayout',                 'label':str(i),                'args':['geo.projection.rotation.lat', i]} for i in lat_range]    )      )projections = [ "equirectangular", "mercator", "orthographic", "natural earth","kavrayskiy7",                "miller", "robinson", "eckert4", "azimuthal equal area","azimuthal equidistant",                "conic equal area", "conic conformal", "conic equidistant", "gnomonic", "stereographic",                "mollweide", "hammer", "transverse mercator", "albers usa", "winkel tripel" ]buttons = [ dict( args=['geo.projection.type', p], label=p, method='relayout' ) for p in projections ]annot = list([ dict( x=0.1, y=0.8, text='Projection', yanchor='bottom',                     xref='paper', xanchor='right', showarrow=False )])# Update Layout Objectlayout[ 'updatemenus' ] = list([ dict( x=0.1, y=0.8, buttons=buttons, yanchor='top' )])layout[ 'annotations' ] = annotlayout[ 'sliders' ] = slidersfig = dict( data=contours, layout=layout )py.iplot( fig)

Не уверена, как этот пример сюда запихнуть, не размазав его по нескольким страницам.

Главное, почему стоит избегать работы с ванильным модулем plotly.py, громоздкость данных. Процесс вбивания кода выходит очень длительным и часто приводит к ошибкам. К счастью, из данной ситуации есть два выхода.

Если нам все же не удалось свернуть с тропинки ploty.py, то придется порыться в конструкторе. Официальная документация выглядит красиво, но часто все равно приходится часами копаться на других сайтах в поисках подходящего способа пофиксить код. У Plotly есть свой форум с неплохими советами, но многие образцы кодов не обновлены и не работают в версии 3.0. Поэтому ищите сразу образцы, совместимые с последней версией, или придется переводить их вручную.

Следующие два продукта от Plotly, на которые мы обратим внимание, предлагают высокоуровневые обертки, упрощающие программный интерфейс plotly.py. Они помогут сэкономить время, если вы работаете с библиотекой Pandas. Давайте рассмотрим их поподробнее.

Express


Модуль Plotly Express был выпущен в марте 2019 года и находится в процессе активной разработки. Компания работает над созданием условий поддержки новых графиков и собирается выпустить Plotly 4.0 летом 2019 года.

Express позволяет уменьшить код, необходимый для создания датафреймов Pandas в 10 раз. Загружать свою таблицу нужно в виде опрятных данных, где каждый столбец соответствует одной переменной, а каждая строка одному наблюдению.

Установите Express с помощью pip install plotly_express.

Чтобы использовать эту библиотеку в записной книжке Jupyter, введите следующий код в командную строку:

jupyter labextension install @jupyterlab/plotly-extension

Данный код позволит создать гистограмму из таблицы с традиционным Express импортом:

import plotly_express as px         px.bar(my_df, x='my_x_column', y='my_y_column')


Вуаля! Вы получили гистограмму по данным таблицы (вставьте свои значения там, где у меня в коде дано my_.

Вы можете настроить множество значений. Например, добавьте заголовок, изменив свое определение следующим образом:

px.bar(my_df, x='my_x_column', y='my_y_column', title='My Chart Title")


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

_my_fig = px.bar(my_df, x='my_x_column', y='my_y_column', title='My Chart Title')_my_fig.data[0].update(    text=my_df['my_y_column'],      textposition='inside',    textfont=dict(size=10))_my_fig.iplot()


Внимание: я нашел документацию Express! Она не отобразилась у меня на первой странице поиска в гугле, поэтому я не сразу смог ее прикрепить. Теперь она есть. Всегда пожалуйста!
Express позволяет быстро создавать разного вида диаграммы, но доступны могут быть не те, что Вам требуются. Например, нормальную гистограмму с накоплением вы сейчас врядли сможете собрать. А если очень надо, то придется подниматься в гору по другой тропинке в этот раз с Cufflinks.

Cufflinks


Cufflinks очень похож на Express тем, что является оберткой интерфейса Plotly, позволяющей упростить работу с Pandas. Cufflinks сторонняя программа с открытым исходным кодом, которая существует уже более четырех лет.

Установите ее с помощью pip install cufflinks.

Импортируйте модуль и настройте файл для автономного использования.

import cufflinks as cfcf.set_config_file(offline=True)


С Cufflinks для создания многих видов диаграмм нужна лишь одна строчка кода. К примеру, сделать гистограмму с накоплением с этой библиотекой проще простого.

image

Пример гистограммы с накоплением, созданной с помощью Cufflinks.

А вот и сам код:

df = pd.DataFrame(np.random.rand(6, 3), columns=['A', 'B', 'C'])df.iplot(kind='bar', barmode='stack', title='Stacked Bar Chart with Random Data')


Обратите внимание, что для создания диаграмм с помощью Cufflinks Вам нужно использовать .iplot().

Как и Express, Cufflinks возвращает исходные данные, чтобы Вы могли вносить мелкие поправки. Но в отличие от Cufflinks, Вам нужно уточнить переменную asFigure=True, чтобы вернуть информацию. После этого можно обновить график точно так же, как в Express. Вот как это будет выглядеть, если Вы захотите изменить название и диапазон осей.

my_fig = df.iplot(kind='bar', barmode='stack', title='Stacked Bar Chart with Random Data', asFigure=True)_fig.layout.yaxis = dict(title='Members', range=[0, 600])

Вот документация Cufflinks.

К сожалению, Cufflinks тоже имеет свои лимиты. Например, с помощью этой библиотеки нельзя создать график рассеяния с географическими координатами.

Сравнение трех вариантов


Далее Вы можете наблюдать сравнение кода со схожей структурой для графиков, созданных с помощью plotly.py, Express и Cufflinks.

plotly.py


image

Пример диаграммы рассеяния, выполненной с plotly.py

fig = {    'data': [        {            'x': df2007.gdpPercap,             'y': df2007.lifeExp,             'text': df2007.country,             'mode': 'markers',             'name': '2007'},    ],    'layout': {        'title': "Example Scatter Plot with Vanilla plotly.py"    }}py.iplot(fig)


Express


image

Пример диаграммы рассеяния, выполненной с Plotly Express

px.scatter(    df2007,     x="gdpPercap",     y="lifeExp",     title='Example Scatter Plot with Plotly Express')


Выглядит просто и лаконично! Форматирование по умолчанию немного отличается, а названия осей генерируются автоматически. Теперь предлагаю взглянуть на тот же график в Cufflinks.

Cufflinks


image

Пример диаграммы рассеяния, выполненной с Cufflinks

df2007.iplot(    kind='scatter',     mode='markers',     x='gdpPercap',     y='lifeExp',     title='Example Scatter Plot with Cufflinks')


Код похож на Express, но у графика немного другие значения по умолчанию. Определенно, с Express и Cufflinks Вам не придется часами выстукивать коды, что особенно важно при создании более сложных графиков.

Давайте посмотрим, как можно вернуть и обратиться к основной информации.

Обновление графиков Cufflinks и Express


Давайте перейдем к макету графика, созданного с Cufflinks, и добавим названия осей.

image

Пример диаграммы рассеяния, выполненной с Cufflinks Доступ к исходному графику

fig = df2007.iplot(    kind='scatter',     mode='markers',     x='gdpPercap',     y='lifeExp',     asFigure=True,    title='Example Scatter Plot with Cufflinks - Access Underlying Figure')fig.layout.xaxis.title = "GDP per Capita"fig.layout.yaxis.title = "Life Expectancy"fig.iplot()


Вот как сделать то же самое с Express. Не забывайте, что в данной библиотеке не нужно уточнять asFigure=True.

image

Пример диаграммы рассеяния, выполненной с Plotly Express Доступ к исходному графику

fig = px.scatter(    df2007,     x="gdpPercap",     y="lifeExp",     title='Example Scatter Plot with Plotly Express - Access Underlying Figure')fig.layout.xaxis.title = "GDP per Capita"fig.layout.yaxis.title = "Life Expectancy"fig.iplot()


Вы можете обратиться к исходным данным, чтобы добавить текстовые метки следующего вида:

fig.data[0].update(text=df2007['gdpPercap'],textposition=inside,textfont=dict(size=10))


Что выбрать: Plotly.py, Express или Cufflinks


Выбирать всегда сложно. Один раз я думал, что работал над частью проекта в Express, а потом понял, что это был Cufflinks!

Мне очень нравится выражение из Zen of Python: Должен существовать один и, желательно, только один очевидный способ сделать это. Как только появляются варианты появляются и необходимость долгого поиска информации, и усталость от необходимости выбирать, и ошибки.

К сожалению, ни один высокоуровневый API на данный момент не дает возможность создавать графики любого типа. Однако лично я точно постараюсь максимально избегать использования ванильного python.py и предпочту Cufflinks или Express.

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

Форматирование по умолчанию у двух библиотек может сильно отличаться. Например, создав датафрейм со случайными данными для столбцов X, Y и Z и используем следующий код, в Cufflinks мы получим следующую диаграмму:

df.iplot(kind=scatter, mode=markers, x=X, y=Y, title=Random Data, categories=Z)


image

Диаграмма рассеяния по умолчанию с Cufflinks

А вот что мы получим с Express-кодом:

px.scatter(df, x=X, y=Y, color=Z, title=Random Data)


image

Другие пресеты с Express

Заметная разница!

Сохранение файлов


Закончив работы с диаграммой, Вы можете навести на нее мышку и щелкнуть по значку камеры, чтобы экспортировать ее в формате .png, или нажать Экспортировать в plot.ly, чтобы сохранить интерактивное изображение на сервер Plotly. Помимо этого, Вы можете скачать файлы в интерактивном HTML-формате следующим образом:

py.offline.plot(my_fig, filename=my_example_file.html)


Если нужны другие форматы изображения, Вы можете воспользоваться пакетом orca и скачивать файлы в форматах .png, .jpg и .pdf. Данный пакет на данный момент недоступен на pypi.org, поэтому установить его с помощью pip не получится. Вы можете управлять пакетом с помощью conda или установить ОС-специфичную версию orca со страницы GitHub. После этого Вам не нужно будет импортировать библиотеку orca. Узнать больше о программе orca можно здесь.

Вот код для создания png-файла после установки orca:

import plotly as plotlyplotly.io.write_image(fig, file='my_figure_file.png', format='png')


Как видите, вытянуть свои графики из Plotly можно несколькими разными способами.
Предлагаю кратко пробежаться по еще двум компонентам экосистемы Plotly, чтобы Вы поняли что есть что.

Dash


С Plotly Dash Вы можете создавать дашборды для своей команды или для других людей. Есть версия с открытым кодом доступа, у которой к 1 мая 2019 года насчитывалось практически 9000 звезд GitHub. Plotly также предлагает целый ряд дополнений. Может, в будущем я напишу статью и об этом. Подписывайтесь, чтобы не пропустить.

Chart Studio


Plotly Chart Studio позволяет легко создавать и редактировать графики в браузере. Plotly рекламирует данную программу как самый умный редактор для создания D3.js- и WebGL-диаграмм. Не надо ничего кодировать вручную. Есть бесплатная версия, но если хотите сохранить свои графики, то придется отдать 99$ за год использования.

А теперь, когда мы уже добрались до вершины Plotly, давайте быстро пробежимся по другим горам визуализации данных в диапазоне Python.

Бонус: другие варианты библиотек визуализации данных от Python


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

image

Хотите делать графики по старинке обратитесь к ванильной библиотеке Matplotlib API.

image

Pandas Matplotlib позволяет создавать неплохие простенькие графики. Может создавать стандартные Matplotlib объекты.

image

Seaborn отличная высокоуровневая обертка, основанная на Matplotlib, которая позволяет создавать различные графики визуализации статистических данных. К сожалению, из-за довольно старой базы Matplotlib, использовать ее не очень удобно.

image

Bokeh конкурент Plotly. Программа с открытым исходным кодом, интерактивная, работает с Python.

image

Holoviews высокоуровневая обертка, работающая с Matplotlib, Bokeh, а теперь и с Plotly. Знаю ребят, которые пользуются именно ей.

image

Специалистам, работающим с языком R, нравится использовать Shiny от RStudio. Оно позволяет пользователям R создавать интерактивные визуализации для веб-приложений.

image

Tableau и Microsoft PowerBI две популярные опции с системой перетаскивания данных визуализации, которые работают с Python. Tableau очень даже хорошая библиотека, но за нее придется заплатить, если не хотите, чтобы Ваша работа была в открытом доступе.

image

На мой взгляд, PowerBI обладает менее интуитивно понятным интерфейсом, но программа все равно очень мощная и популярная.

Большинство ПО для создания интерактивных графиков используют библиотеку D3.js. Она очень популярна.

Выводы и полезные ресурсы


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

Возможно, когда-нибудь появится универсальная библиотека, позволяющая создавать все, что захотите, используя высокоуровневые API-опции Plotly. А пока, если хотите сэкономить время и сделать крутые графики, предлагаю обращаться к Pandas с Cufflinks или Express.



Совет: когда используете в графиках цвет, не забывайте про людей с дальтонизмом. Воспользуйтесь палитрой, удобной для дальтоников. Я использую палитру от ggplot.

image

Образец цветов

color_list = ["#E69F00", "#56B4E9", "#009E73", "#F0E442", "#D55E00", "#0072B2",  "#CC79A7"]


image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод В чем разница между Data Analytics и статистикой

18.06.2020 12:21:50 | Автор: admin
Разбираемся в ценности двух совершенно разных профессий.

image

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

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

Человеческие поисковые системы


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

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

image

Даже дети без труда могут найти факты в интернете. Мы наблюдаем демократизацию дата сайнс. Хотите знать, холоднее ли сегодня в Нью-Йорке, чем в Рейкьявике? Вы можете почти мгновенно удовлетворить свое любопытство. Это так просто, что мы даже больше не называем этот процесс аналитикой, хотя по сути это она и есть. А теперь представьте, что вам нужно было бы получить эту информацию сто лет назад. (Вот именно.)

Когда вы пользуетесь поисковой системой, вы занимаетесь базовой аналитикой


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

Искатели вдохновения


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

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

У тебя есть интернет, найди там что-нибудь полезное.


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

image

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

Бросаясь в пучину неизвестного


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

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

Начинающие думают, что цель поисковой аналитики отвечать на вопросы, но на самом деле их нужно задавать.


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

Если вы совершите прыжок веры в вопросе данных, подобно Икару, ничем хорошим это не закончится. (Совет для аналитиков: если хотите избегать сферу статистики, просто боритесь с желанием делать выводы. Готово! Вы восхитительны.)

Аналитика помогает вам сформулировать гипотезы. Это улучшает качество ваших вопросов.


Статистика помогает вам проверить гипотезы. Это улучшает качество ваших ответов.


Многие думают, что цель поисковой аналитики отвечать на вопросы. Это распространенная ошибка. На самом деле их нужно задавать. Исследование данных аналитиками позволяет вам задавать правильные вопросы. Паттерны, которые обнаружат аналитики, не стоит воспринимать серьезно, до тех пор пока они не будут доказаны статистически на основе новых данных. Аналитика помогает вам сформулировать гипотезы, статистика помогает вам проверить их.

Аналитик добывает информацию в конкретном наборе данных.

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


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

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

Вам нужно и то и другое


Выбирать между хорошими вопросами и хорошими ответами больно и старомодно. Если вы можете себе это позволить, работайте и с аналитиками, и со статистиками. Тогда ваша жизнь станет проще. К сожалению, платить нужно не только персоналу. Чтобы вклад ваших экспертов по работе с данными был ощутим, нужно обилие данных и культура их разделения. Если у вас будет (хотя бы) 2 набора данных, вы сможете найти вдохновляющие идеи и сформировать теории, основанные не только на одном лишь воображении. Затем смело переходите к проверке.

Неправильное понимание различий приводит к множеству ненужных нападок со стороны статистиков и множеству некорректных мнений, которые аналитики продают как готовый продукт.


Люди, обладающие большим количеством данных, не привыкли разделять данные. Сто лет назад такой принцип не был жизнеспособным в условиях голода. Никто не хотел разделять данные, потому что их было слишком сложно собрать. В ходе истории граница между аналитиками и статистиками постепенно стиралась, породив их вражду. Мы застряли в этой ситуации, потому что забыли переосмыслить ее. Устаревшие предрассудки приводят к множеству ненужных нападок со стороны статистиков и множеству некорректных мнений, которые аналитики продают как готовый продукт. Если у вас много данных и вы хотите извлечь из них пользу, у вас есть возможность получить и вдохновляющие идеи, и точные результаты. Зачем лишать себя этого? Разделяйте данные!

Если вы можете себе это позволить, работайте и с аналитиками, и со статистиками. Тогда ваша жизнь станет проще.


Рано или поздно вы поймете, что разделение данных позволяет аналитикам и статистикам множить свои силы и улучшать результаты. Тогда для вас станет загадкой почему это не практикуют все вокруг.

Перевод: Диана Шеремьёва

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Data Science на пальцах. Статистика это наука менять свой взгляд на вещи в условиях неопределенности

22.06.2020 12:13:23 | Автор: admin
Сотрудница Google объясняет статистику на пальцах для гуманитариев, которые хотят стать Data Scientists.

image

Что такое статистика? Какой-то устаревший способ погрязнуть в данных. Ага. На 100% технически правильное определение. Теперь давайте посмотрим, что есть статистика как дисциплина.

Статистика это наука о том, как менять свои представления.

Принимать решения, основываясь на фактах (параметрах), и так достаточно сложно, но проклятие! иногда у нас даже фактов нужных нет. Вместо этого то, что мы знаем (выборка), отличается от того, что мы хотели бы знать (совокупность). Вот что значит попасть в неопределенность.

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

Байесианцы меняют свое мнение насчет представлений.

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

Приверженцы частотной статистики меняют свое мнение насчет действий.

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

Гипотезы это описания того, как может выглядеть мир.

Нулевая гипотеза описывает все миры, где выбор в пользу действия по умолчанию будет иметь удачным исход; альтернативная гипотеза описывает все остальные миры. Если я смогу вас убедить используя данные! что вы живете в мире не нулевых гипотез, то вам лучше передумать и предпринять альтернативные действия.

Например: Мы можем пойти на занятие вместе (действие по умолчанию), если вам обычно требуется меньше 15 минут, чтобы подготовиться (нулевая гипотеза), но если доказательства (данные) предполагают, что вам нужно больше времени (альтернативная гипотеза), вы можете пойти один, потому что я пошел (альтернативное действие).

Быстрая проверка: Мои доказательства превращают нулевую гипотезу в нелепость?

Вся проверка гипотез сводится к вопросу: делают ли мои доказательства нулевую гипотезу нелепой? Отказ от нулевой гипотезы означает, что мы что-то узнали и должны изменить свое мнение. Не опровержение значит, что мы не узнали ничего интересного. Это как оказаться в лесу, не встретить там людей и сделать вывод, что на планете нет больше людей. Это всего лишь значит, что мы не узнали ничего интересного о существовании людей. Вам грустно, что мы ничего не узнали? Так быть не должно, потому что у вас есть прекрасный страховой полис: вы точно знаете, какие действия предпринять. Если вы ничему не научились, у вас нет причин менять свои представления продолжайте следовать действиям по умолчанию.

Итак, как мы поймем, что узнали нечто интересное нечто не соответствующее миру, в котором мы хотим продолжать выполнять наши действия по умолчанию? Чтобы получить ответ, мы можем взглянуть на p-значение или на достоверный интервал.

Р-значение в периодической таблице элемент неожиданности.

P-значение говорит: Если я живу в мире, в котором должен принимать такое-то действие по умолчанию, насколько тогда не удивительны мои доказательства? Чем ниже p-значение, тем больше данные кричат: Ого, это же удивительно! Может, вам стоит изменить ваше мнение!

Чтобы пройти тест, сравните p-значение с порогом, называемым уровнем значимости. Это рычаг, с помощью которого вы можете регулировать количество риска. Максимальная вероятность по глупости покинуть уютное, нагретое местечко в виде действия по умолчанию. Если установите уровень значимости равным 0, значит вы не хотите совершать ошибку и неоправданно отказываться от действия по умолчанию. Крутим рычаг вниз! Не анализируйте данные, просто выполняйте действия по умолчанию. (Но это также может значит, что вы в конечном итоге тупо НЕ откажетесь от плохого действия по умолчанию.)

image

Как использовать p-значения, чтобы узнать результат проверки гипотезы. (Никто не заподозрит, что мой xkcd-подделка)

Достоверный интервал это просто способ узнать результаты проверки гипотезы. Чтобы его использовать, проверьте, совпадает ли он с вашей нулевой гипотезой. Если да, совпадает, то узнавать нечего. Если нет примите другое решение.

Меняйте мнение только в том случае, если достоверный интервал не совпадает с вашей нулевой гипотезой.

Хотя техническое значение термина достоверный интервал немного странновато (я расскажу вам подробно о нем в следующем посте, он определенно не так прост как доверительный интервал, с которым мы познакомились ранее), он также обладает двумя полезными свойствами, которые аналитики любят использовать при описании своих данных: (1) всегда есть лучшее предположение и (2) с появлением данных интервал становится уже. Берегитесь, ни интервал, ни p-значение не были созданы не для того, чтобы говорить о них было приятно, поэтому не ожидайте содержательных определений. Это просто способ обобщить результаты тестов. (Если вы ходили на занятия и не могли запомнить определения, то вот оно почему. От имени статистики: это не вы, это все я).

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

Математика это построение игрушечной модели вселенной нулевых гипотез. Так вы получаете p-значение.

Математика это все о создании и изучении игрушечных вселенных (как это круто, да, товарищи, одержимые манией величия?! Очень круто!) чтобы проверить, насколько вероятно возникновение наборов данных, подобных вашим. Если едва ли ваша игрушечная модель вселенной нулевой гипотезы даст данные подобные тем, которые вы получили из реального мира, то тогда ваше p-значение будет низким, и в итоге вы отвергнете нулевую гипотезу надо вам передумать!

К чему все эти безумные формулы, вероятности и распределения? Благодаря им мы излагаем правила, регулирующие вселенную нулевой гипотезы. Мы можем выяснить, является ли эта вселенная местом, которое выдает данные, похожие на те, что вы получили в реальной жизни. Если нет, то вы кричите: Смешно! Голову с плеч! А если да, то просто пожимаете плечами и ничего нового не получаете. Подробнее об этом я расскажу в следующем посте. А пока, просто поразмыслите о математике, как об инструменте создания маленьких игрушечных миров, чтобы мы могли посмотреть, выглядит ли наш набор данных в них разумным. P-значение и достоверный интервал это способы обобщить всю эту информацию для, поэтому вам не нужно жмуриться от многословного описания вселенной. Здесь кроется развязка: используйте их, чтобы проверить, стоит ли следовать действиям по умолчанию. И работа сделана!

А мы сделали домашнее задание? Вот в чем меры мощности.

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

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

Используйте анализ мощности, чтобы проверить, достаточно ли данных вы предусмотрели, прежде чем начинать.

Анализ мощности это способ проверить, какую мощность вы ожидаете получить для данного объема данных. Вы используете его, чтобы спланировать свои исследования, прежде чем начать. (Все довольно просто; в следующем посте я покажу вам, что на самом деле нужно всего несколько циклов.)

Неопределенность означает, что вы можете прийти к неправильному выводу, даже если у вас лучшая математика в мире.

Чего нет в статистике? Волшебной магии, которая может неопределенность превратить в определенность. Нет такой магии, которая могла бы сделать это; вы все еще можете допустить ошибку. К слову об ошибках, вот две ошибки, которые вы можете допустить в частотной статистике. (Байесианцы не ошибаются. Шучу! Ну, вроде того.)

Ошибка I типа отказаться по глупости от действия по умолчанию. Эй, вы же говорили, что вам было удобно следовать действию по умолчанию, и теперь, после всех своих расчетов, отказались от него. Ой! Ошибка II типа по глупости не отказаться от действий по умолчанию. (Мы, статистики, крайне изобретательны в придумывании названий. Угадайте, какая ошибка хуже. Тип I? Ага. Очень креативно.)

Ошибка I типа поменять мнения, когда не следовало бы.

Ошибка II типа не поменять мнения, когда следовало бы.

Ошибка I типа похожа на осуждение невиновного, а ошибка II типа на неспособность осудить виновного. Это равновесно вероятные ошибки (что упрощает суд над виновным, также упрощает его и над невиновным), если только у вас не будет больше доказательств (данных!), тогда уже вероятность допустить ошибку становится ниже, и дела идут на поправку. Вот почему статистики хотят, чтобы у вас было много, РЕАЛЬНО МНОГО данных! Всё идет хорошо, когда вы располагаете большим количеством данных.

Чем больше данных, тем ниже вероятность прийти к неверному выводу.

Что такое множественная проверка гипотез? Вы должны проводить тестирование другим, скорректированным образом, если собираетесь задавать несколько вопросов одного и того же набора данных. Если вы продолжите снова и снова подвергать невиновных подозреваемых суду (прощупывая почву своих данных), в конце концов, из-за случайного совпадения кто-нибудь да окажется виновным. Термин статистическая значимость не означает, что в рамках вселенной произошло что-то важное. Это всего лишь значит, что мы поменяли мнение. Возможно, на неправильное. Будь проклята эта неопределенность!

Не тратьте время, старательно отвечая на неправильные вопросы. Пользуйтесь статистикой с умом (и только при необходимости).

Что такое ошибка III типа? Это своего рода статистическая шутка: она относится к правильному отклонению неправильной нулевой гипотезы. Другими словами, использование правильной математики для ответа на неправильный вопрос.

Лекарство от задавания неправильных вопросов и неправильных ответов на них можно найти, заглянув в Decision Intelligence. Это новая дисциплина, которая занимается наукой о данных и применяет ее для решения бизнес-задач и поиска правильных решений. С помощью decision intelligence вы повысите свой иммунитет к ошибкам III типа и бесполезной аналитике.

Итак, подытожим: статистика это наука о том, как менять свои представления. Существует две школы мысли. Наиболее популярная частотная статистика проверяет, следует ли отказаться от действия по умолчанию. Байесовская статистика занимается априорным мнением и его модернизацией с помощью новых данных. Если у вас в голове чистый лист, прежде чем начать, взгляните на данные и просто прислушайтесь к своей интуиции.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Философия преподавания Data Science и Deep Learning от fast.ai

23.06.2020 14:06:23 | Автор: admin
image

Рейчел Томас, соосновательница fast.ai, профессор USF Data Institute

Пол Локхард кандидат наук в области математики Колумбийского университета, бывший профессор университета Брауна и учитель математики средних классов в своем важном эссе Плач математика описывает ужасный мир, где детям нельзя слушать и исполнять музыку, пока они не проведут десятки лет осваивая нотную грамоту и теорию музыки, транспонируя ноты в другую тональность на своих занятиях. На уроках рисования ученики изучают цвета и кисточки, но смогут начать рисовать только в колледже. Звучит абсурдно, не так ли? Именно так и преподается математика мы требуем от студентов тратить годы на зубрежку, изучение сухих, не связанных между собой основ, которые, как мы утверждаем, окупятся в будущем, когда большинство уже бросят сам предмет.

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

Так что многие студенты бросают математику из-за того, как скучно её преподают с утомительными, повторяющимися упражнениями и учебным планом, который откладывает так много веселья (например, теорию графов, расчёты и перестановки, теорию групп) на потом, когда уже все обучающиеся за исключением математических специализаций бросают предмет. И хранители врат глубокого обучения делают нечто похожее всякий раз, когда просят вывести множественное цепное правило или дать теоретические обоснования расстояние Кульбака Лейблера прежде чем научат вас использовать нейронную сеть для ваших собственных проектов.

Мы будем использовать лучшие доступные исследования по методам преподавания, пробуя решить проблемы с техническим обучением, включая:

  • Обучение игре целиком начиная с демонстрации того, как использовать полную, работающую, очень полезную, современную сеть глубокого обучения для решения реальных проблем, используя простые выразительные инструменты. А затем постепенно закапываться все глубже и глубже в понимание того, как создаются эти инструменты, и как создаются инструменты, которые создают эти инструменты и так далее
  • Всегда обучать с помощью примеров: убедитесь, что есть контекст и цель, которые вы можете понять интуитивно; это лучше, чем начинать с алгебраической манипуляции символами.
  • Упрощать как можно больше: мы потратили месяцы на создание инструментов и методик обучения, которые в разы упрощают темы, которые раньше казались сложными.
  • Устранять барьеры: до настоящего времени глубокое обучение было очень эксклюзивным.
  • Сейчас же мы делаем его более доступным, чтобы каждый мог принимать участие.
  • и многие другие. Некоторые из наших методик я более подробно разобрал ниже.

В конце концов, речь идет о качественном образовании. Это то, что волнует нас больше всего. Ниже наши мысли о качественном образовании:

Качественное образование начинается с игры целиком


Точно так же, как дети имеют представление о бейсболе даже до первых тренировок, нам хочется, чтобы и вы имели представление о глубоком обучении в целом задолго до того, как вы начнете изучение математики и цепного правила. Мы будем уходить от общей картины глубокого обучения к деталям (то есть двигаться в противоположном направлении по сравнению с большинством образовательных учреждений, которые пытаются научить всем элементам по-отдельности, а уже потом складывают их в общую картинку). Хорошим примером будет выступление Джереми на тему рекуррентных нейронных сетей он начинает с трехлинейной РНС, используя высокоэффективную библиотеку, затем убирает библиотеку, стоит свою собственную архитектуру, используя GPU-фреймворк, а затем убирает и его и в мельчайших деталях строит все с нуля, используя базовый python.

В книге, которая нас вдохновляет, Дэвид Перкинс профессор Гарвардского университета с докторской степенью из МТИ (Массачусетского технологического института) в области искусственного интеллекта называет болезнью elementitis подход, при котором человек не приступает к сложной работе пока сперва не выучит все элементы по-отдельности. Это во многом похоже на тренировку с мячом, не имея представления о бейсболе. Элементы могут казаться скучными или бессмысленными, когда не знаешь, как они вписываются в большую картину. И довольно сложно оставаться мотивированным, когда ты даже не можешь решать волнующие тебя проблемы или понимать, как технические детали вписываются в целое. Возможно, именно поэтому исследования показали спад внутренней мотивации школьников, начиная с 3-его по 8-ой классы (единственный изученный диапазон лет).

Качественное образование дает вам возможность работать над интересующими вас вопросами


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

Качественное образование требует не чересчур много усилий


Вы уже посмотрели, как Джереми внедряет современные методы оптимизации глубокого обучения в Excel? Ещё нет? Тогда посмотрите (начало на 4:50 минуте в видео) и возвращайтесь. Это считается сложной темой, но после нескольких недель упорной работы Джереми смог упросить её до такой степени, что она стала максимально понятной. Если вы действительно разбираетесь в чем-то, вы также можете дать и доступное объяснение, а может и внедрить это в Excel! Запутанный жаргон и бестолковые технические определения возникают из-за лени или же когда говорящий не уверен в сути того, что говорит и просто прячется за своими периферийными знаниями.

Качественное образование инклюзивно


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

Качественное образование мотивирует изучение базовых технических концепций


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

Перкинс пишет: Играть в баскетбол интереснее, чем тренироваться с мячом, играть музыкальные произведения интереснее, чем разучивать гаммы, заниматься каким-нибудь историческим или математическим исследованием на начальном уровне интереснее, чем запоминать даты или решать задачи. Строить рабочую модель для интересующей вас проблемы в разы интереснее, чем писать доказательство (для большинства людей!).

Качественное образование поощряет ошибки


В самом популярном выступлении TED эксперт по образованию Сэр Кен Робинсон утверждает, что наши школьные системы разрушают врожденные творческие способности детей, общественно порицая ошибки. Робинсон говорит: Тот, кто не готов ошибаться, не способен творить, не может мыслить оригинально.

Преподавание глубокого обучения с использованием кодовой методики в интерактивном Jupyter notebook это отличная стартовая точка для того, чтобы пробовать новые вещи, ошибаться и с легкостью вносить изменения.

Качественное образование использует уже существующие ресурсы


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

Качественное образование поощряет креативность


image

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

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

Качественное образование учит задавать вопросы, а не только отвечать на них


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

Качественное образование основано на фактических данных


Мы любим данные и научный метод, и заинтересованы в подходах, опирающихся на исследования.

Обучение интервальными повторениями как раз один из таких подходов, подкрепленный доказательствами, при котором обучающиеся периодически возвращаются к теме перед тем, как забыть её. Джереми и сам пользовался этим методом и добился впечатляющих результатов в китайском языке. Игровой метод обучения прекрасно сочетается с методом интервальных повторений мы возвращаемся к темам, каждый раз углубляясь во все более и более низкоуровневые детали, но всегда возвращаемся к большой картинке.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Почему меня разочаровали результаты Kaggle ARC Challenge

23.06.2020 14:06:23 | Автор: admin
Кто-то с ужасом, а кто-то с нетерпением ждет ИИ как в произведениях фантастов. С личностью, эмоциями, энциклопедическими знаниями и главное с интеллектом, то есть способностями к логическим выводам, оперированию абстрактными понятиями, выделению закономерностей в окружающем мире и превращению их в правила. Как мы знаем, именно такой ИИ теоретики называют сильным или ещё AGI. Пока это далеко не мейнстримное направление в машинном обучении, но руководители многих больших компаний уже считают, что сложность их бизнеса превысила когнитивные способности менеджеров и без настоящего ИИ двигаться вперёд станет невозможно. Идут дискуссии, что же это такое, каким он должен быть, как сделать тест чтобы уж точно понять, что перед нами AGI, а не очередной blackbox, который лучше человека решает локальную задачу например, распознавание лица на фотографии.

Три недели назад на каггле прошло первое в истории платформы соревнование по сильному ИИ Abstraction and Reasoning Challenge. Чтобы проверить способность моделей к обобщению и решению абстрактных задач, все участники суммарно решили только чуть менее половины задач. Решение-победитель справляется приблизительно с 20% из них и то девятичасовым перебором вручную захардкоженных правил (ограничение в девять часов установили организаторы).

В посте я хочу напомнить о сложностях работы с AGI, рассказать о самых интересных идеях участников, топовых решениях и поделиться мнением, что не так с текущими попытками создать AGI.

Вызов


В ноябре 2019 года создатель Keras Франсуа Шолле написал статью Об оценке интеллекта. На хабре краткий пересказ уже выложила Rybolos. Ключевой практический элемент статьи датасет для проверки способности алгоритмов к абстрактному мышлению в человеческом смысле. Просто поглядеть на него можно здесь.

Примеры задач из датасета; наверху вход, внизу ответ





Для человека эти задачи легко решаемы и напоминают блок из теста на IQ они сводятся к набору трансформаций над картинками от 30x30 до 1x1: продолжить узор, восстановить удаленный кусок, обрезать, закрасить замкнутые области, найти лишний объект и т.д.

Соревнование


Не заставило себя долго ждать и само соревнование на Kaggle на основе этого датасета, призы в котором были не самые большие в зависимости от скора $5K-8K за первое место. Для сравнения в проходившем параллельно соревновании DFDC победивший Селим Сефербеков получил полмиллиона долларов.

Тем не менее, соревнование привлекло несколько грандмастеров Kaggle: rohanrao (H20), kazanova (H20, кстати третье место в глобальном рейтинге Kaggle), boliu0 (NVIDIA), titericz (NVIDIA), tarunpaparaju, много очень сильных ребят из ODS, в том числе Влада Голубева и Илью Ларченко, которые взяли третье место. Всего до LeaderBoard дошли 914 команд.

Участникам предлагалось обучить модель на 400 задачах, в каждой из которых есть train (три-пять картинок), ответ и тест (одна-две картинки и соответственно один-два ответа). Этот датасет вручную разметил Davide Bonin на комбинации из 192 элементарных трансформаций.

Такой же по объему датасет (400 задач) предлагался для валидации (eval), впрочем, на нем можно было и обучаться особенно с учетом того, что задачи на нем отличались от обучающего. То есть сочетание трансформаций на тесте могли не встречаться на трейне, например вместо операции crop crop + resize. В лидерборде было 100 задач, при этом на каждое задание можно было выдавать три варианта ответа, достаточно чтобы хотя бы один был верным.

Интересные идеи


CNN c TensorFlow Lattice


Не попали в лидерборд.TensorFlow Lattice позволяет накладывать достаточно жесткие ограничения на фичи при обучении сеток: монотонность, взаимную важность, выпуклость, взаимное доверие, унимодальность. Это существенно увеличивает способности сеток к экстраполяции и сглаживает разделяющие поверхности. Для привлечения внимания картинка про сравнение разделяющих поверхностей разных моделей на одной задаче из блога TensorFlow Core.



В решении предлагалось взять сверточную сеть, так как CNN широко применяется для решения задач на картинках вроде выделения объектов. Идея была любопытная, но решение сработало на тесте ровно никак:



Вариационные автоэнкодеры


Заняли 131 место из 914 в лидерборде. Похожая идея наложить ограничения, но не на пространство признаков как в TF Lattice, а на пространство скрытых переменных, то есть использовать вариационные автоэнкодеры. О них на хабре есть отличная статья.

Это решение было доработано и дошло до LeaderBoard.На картинке в первой строке входное изображение, во второй правильный ответ, в третьей результат работы модели.



Генетический алгоритм



Занял 631 место из 914 в лидерборде. В этом кейсе в качестве генов реализовано одиннадцать трансформаций DSL генетического алгоритма. В ходе селекции по стратегии элитизма отбираются наиболее сильные гены:


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

Авторы рассматривают задачу как многокритериальную оптимизацию насколько близкой получилась ширина и высота выходных картинок, совпадение цветов и положение клеток.
Несмотря на то, что такой подход что-то выбил на LB (631/914), реализация генетического алгоритма для большего числа элементарных трансформаций будет работать существенно дольше. Это, скорее всего, и стало препятствием к развитию этого решения.

Графовый подход


Занял 165 место из 914 на лидерборде. Одна из наиболее человекообразных идей
выделить на исходных изображениях объекты и далее работать с их трансформациями. Для выделения объектов применялся алгоритм k-clique-communities algorithm графовой библиотеки networkx, и справился он на отлично:







К сожалению, ноутбук с трансформациями автор не оставил, есть только выделение объектов, однако автор вошел в топ-19 на лидерборде.

Языковая модель


Заняла 592 место из 914 на лидерборде. На начало 2019 года BERT state-of-the-art языковая модель. За последние месяцы было множество её усовершенствований: RoBERTa, DistilBERT, ALBERT и другие. Здесь идея решения основывается на двух фактах:
  • Способности BERT работать с последовательностями.
  • Механизме attention, который можно научить вычленять связи даже между достаточно удаленными элементами последовательности в противовес идее о влиянии на элемент только нескольких соседних.

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





А вот результат работы обученной модели (справа):

Жаль, что на других задачах результаты не были такими хорошими.

Работающие решения


Эх, а как хотелось верить в способность моделей вытаскивать простые логические правила. Да и еще в интрепретируемом виде. В итоге поиск решения участниками свелся к написанию правил (трансформаций) для решения конкретных кейсов, поиску по форуму и объединению в свой ноутбук таких решений.

Например, задание про изменение цветов при сохранении размера изображения: ноутбук Zoltan, занявшего в итоге шестое место, вошел в решение Влада Голубева и Ильи Ларченко, которые заняли третье место. Решение по сути представляет объединение нескольких, в том числе публичных. Так, идеи Ильи описаны в его репозитории, он декомпозировал задачи на абстракции (цвета, блоки, маски), в терминах которых для которых реализовал трансформации, решающие 32 задания. К этому добавляются решения Влада как с похожим подходом на правилах и трансформациях, так и модель xgboost.

Пример работы решения


Обучающие примеры; слева входная картинка, справа правильный ответ.



А вот результат работы решения:

Достаточно похожим выглядит решение , взявшее второе место:
  1. Определить на входе тип задания (из шести по классификации автора) и параметры входных изображений.
  2. Иногда упростить задание например, поменять один цвет или повернуть объекты.
  3. Перебирать в цикле различные трансформации (реализовано 51) и их комбинации чтобы выбрать три максимально близкие к ответу картинки.
  4. Выполнить преобразования, обратные тем, что были на шаге 2, к трем кандидатам.
  5. Иногда имеет смысл сделать аугментацию например, из исходных примеров сделать задачи монохромными или только с одной формой.

Чемпион и 10 000 строк кода


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



Что в итоге?


На фоне вала статей и выступлений на конференциях A* об успехах в задачах создания сложных моделей по нескольким примерам результаты соревнования оказались совершенно неожиданными и обескураживающими.

В ноябре 2019 мне посчастливилось посетить ICCV2019 в высокотехнологичном Сеуле, где каждый второй доклад был посвящен задаче ZSL. Были ожидания, что в соревновании ARC достаточно применить одну из раскрученных в научном сообществе техник. Может, я был невнимателен, но, к своему разочарованию, не увидел среди решений участников такого подхода.

Так как уже в процессе соревнований участники делятся идеями и наработками, участие в челлендже казалось отличным способом узнать, какие подходы сейчас на переднем крае в области создания сложных моделей с минимальной обучающей выборкой или без таковой: zero-shot learning (ZSL), one-shot learning, few-shot learning, prototype learning и domain shift. Конечно, перечисленные проблемы подразумевают изменение доменной области, а не самой задачи классификация остается классификацией. Но это самое проработанное направление в части обобщения моделей.

Сами мы решили попробовать GAN-архитектуру поверх feature extractor, которая у нас так и не зашла. Однако, примерно за три-четыре недели до конца соревнования стало понятно, что выигрывают решения на правилах. Обсудив внутри, мы пришли к выводу что, потратив кучу времени на написание, мы вряд ли повысим свои компетенции в современных методах, поэтому направили энергию на другие задачи.

В тысячный раз подтвердился тезис о прикладном характере машинного обучения это набор инструментов, который надо уметь применять четко понимая задачу. В то же время бессмысленно применять даже самые крутые инструменты к непонятной задаче. Можно провести аналогию со станком, ЧПУ и 3D-принтером: несмотря на то, что область применения на каждом этапе растет, пока даже близко нет волшебной палочки, способной создать абсолютно любой предмет.

Чтобы обучить машину, мало придумать ей абстрактный язык (DSL или набор трансформаций), придумать функцию потерь и показать пару примеров. Челлендж прошёл, но осталось разочарование: то, что маркетологи до сих пор продают как AI, на поверку оказывается набором инженерных хитростей. Флёр волшебства окончательно растаял.
Подробнее..

Рубрика Читаем статьи за вас. Май 2020. Часть 2

25.06.2020 14:15:14 | Автор: admin


Привет, Хабр! Продолжаем публиковать рецензии на научные статьи от членов сообщества Open Data Science из канала #article_essense. Хотите получать их раньше всех вступайте в сообщество!


Статьи на сегодня:


  1. ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks (China, 2020)
  2. TAPAS: Weakly Supervised Table Parsing via Pre-training (Google, 2020)
  3. DeepFaceLab: A simple, flexible and extensible faceswapping framework (2020)
  4. End-to-End Object Detection with Transformers (Facebook AI, 2020)
  5. Language Models are Few-Shot Learners (OpenAI, 2020)
  6. TabNet: Attentive Interpretable Tabular Learning (Google Cloud AI, 2020)


1. ECA-Net: Efficient Channel Attention for Deep Convolutional Neural Networks


Авторы статьи: Qilong Wang, Banggu Wu, Pengfei Zhu, Peihua Li, Wangmeng Zuo, Qinghua Hu (China, 2020)
Оригинал статьи :: GitHub project
Автор обзора: Эмиль Закиров (в слэке bonlime)


Очередной вариант self-attention для computer vision. Авторы внимательно посмотрели на известный squeeze-and-excitation (SE), который сейчас используют во многих SOTA сеточках и его аналоги, попробов понять почему же именно оно работает. Потом предложили свой супер легкий attention block, который практически не увеличивает количество параметров, быстрее чем SE и при этом лучше работает.




Все последние attention блоки обладают одним из двух свойств, они либо используют уменьшение количества каналов, либо включают какое-то взаимодействие между каналами. SE, к примеру, делает и то и то.




Хочется понять насколько эти две составляющие влияют на итоговое качество. Для этого авторы предлагают несколько слегка модифицированных вариантов SE block:


  • SE-Var1 просто делаем GlobalAvgPool + sigmoid. Даже такой просто attention даёт прирост к качеству.
  • SE-Var2 GlobalAvgPool + каждый канал умножается на какой-то параметр + sigmoid. В отличие от дефолтного SE нет DR и нет cross-channel interaction, а качество выше! Вывод авторов избегание DR важнее чем какие-то cross-channel interactions.
  • SE-Var3 как SE, но без уменьшения количества каналов в середине. Работает лучше, но добавляет очень много параметров и сильно замедляет обучение.
  • SE-GC попытки делать attention через групповые свертки. Работает лучше чем SE, но group convs медленно обучаются.
  • ECA вариант авторов. GlobalAvgPool + Conv1d (kernel size=3). Операция Conv1d дешевая, при этом удалось избежать dimensionality reduction и добавить какое-то cross-channel interaction.



Attention block авторов в деталях.
Размер ядра после GlobalAvgPool можно пытаться определять с помощью каких-то эвристик. У авторов она такая чем больше каналов, тем больше ядро. Для 128 каналов ядро будет 3, а для 1024 7. Но как видно из последних двух строчек на таблице выше это не особо влияет на качество.




Проведено сравнение использования разных размеров ядра для 1d свертки vs adaptive. т.к. разница на уровне погрешности, можно остановиться на самом простом случае ядре размера 3. В коде авторов так и сделано, везде захардкожено 3.


Проведено сравнение для задачи детекции. На фоне практически незаметного увеличения количества параметров дает прирост метрик на 1-2%, что выглядит очень убедительно.


Пара практических заметок.
Хотя Conv1d на порядки быстрее, чем две FC в SE блоке, ускорение на практике получается только ~5% потому что самая дорогая операция это GlobalAvgPool, а не последующие свертки.


Проведено сравнение весов для каналов, выученных SE блоком и ECA блоком для 4х разных классов. Прогоняют все картинки этого класса из валидации и записывают среднее для разных каналов. SE выучивает очень похожие attention для разных классов, в том время как у ECA они "have better discriminative ability".


Заметка от автора обзора
Зачем верить авторам на слово, если можно проверить. У меня на Imagenet за 90 эпох обычный SE даёт Acc@1 78.988 Acc@5 94.440, а ECA даёт Acc@1 79.281 Acc@5 94.664. Там была небольшая разница в конфигах обучения SE учился на 4хV100, а ECA на 3хV100, и у них был разный lr. Т.е. не могу пока точно утверждать что ECA > SE, но как минимум не хуже точно, при том что быстрее и практически не добавляет параметров.


2. TAPAS: Weakly Supervised Table Parsing via Pre-training


Авторы статьи: Jonathan Herzig, Pawe Krzysztof Nowak, Thomas Mller, Francesco Piccinno, Julian Martin Eisenschlos (Google, 2020)
Оригинал статьи :: GitHub project :: Colab
Автор обзора: Александр Бельских (в слэке belskikh)


Новая модель от гугла, основанная на BERT, которая парсит таблички в режиме question answering наравне или лучше, чем существующие аналоги, но способна выпонять больше задач + хорошо файнтюнится, что означает, что можно использовать гугловый претрейн для своих задач.




Авторы спарсили большой датасет для претрейна из WikiTable и Infobox, собрав оттуда таблички с различными данными. Модельку завели на основе BERT, добавив туда различных эмбеддингов, специфичных для табличных данных. На вход модель получает последовательность токенов вопроса и табличных данных, а на выходе у неё два классификационных слоя один для выбора ячеек сети (если ответ является просто какой-то ячейкой сети) и один для операции агрегации выбранных ячеек (COUNT, SUM, AVG). Все эмбеддинги токенов комбинируются с наборов специфичных для табличных данных:


  • Position ID индекс токена в табличке (таблица представлена во flatten виде).
  • Segment ID 0 для сегмента с вопросом и 1 для сегмента с табличными данными.
  • Column / Row ID.
  • Rank ID если данные как-то можно упорядочить (дата, число, время) то указывается ранг, как относительный порядок.
  • Previous Answer в некоторых сетапах модель работает в conversational режиме, поэтому добавляют отдельный эмбеддинг, является ли токен аутпутом модели с предыдущей стадии.

Во время инференса выбираются из классификационного слоя ячейки с вероятностью больше 0.5 и над ними проводится предсказанная операция агрегации (NONE, COUNT, SUM, AVG). Претрейн проводится на собранном из WikiTable и Infobox датасете, используется masked language model pre-training objective, как в BERT. Затем модель обучили на датасетах WIKISQL, WIKITQ, SQA, получив выше или на уровне с СОТА-аналогами.


Претрейн проходил на 32 Cloud TPUv3 в течение трёх дней, а файнтюнинг на нужный датасет там же от 10 до 20 часов. Модель примерно такого же размера, как и BERT-large.


Полученная модель позволяет отвечать на вопросы по таблицам, но при этом архитектурно значительно проще существующих аналогов. Более того, она показала хорошие результаты на файнтюнинге под новые схожие данные, что, возможно, станет новым прорывом в работе с табличными данными. Модель на данный момент ограничена тем, что не может процессить слишком большие таблички и не может сформулировать ответ по некоторому сабсету ячеек таблицы. Например, запрос number of actors with an average rating higher than 4 не может быть обработан правильно.




3. DeepFaceLab: A simple, flexible and extensible faceswapping framework


Авторы статьи: Ivan Perov, Daiheng Gao, Nikolay Chervoniy, Kunlin Liu, Sugasa Marangonda, Chris Um, Mr. Dpfks, Carl Shift Facenheim, Luis RP, Jian Jiang, Sheng Zhang, Pingyu Wu, Bo Zhou, Weiming Zhang (2020)
Оригинал статьи :: GitHub project
Автор обзора: Евгений Кашин (в слэке digitman, на habr digitman)


Автор самой популярной репы на гитхабе (14к+ звездочек) по дипфейкам решил закинуть свое творение к академикам и написал статью с кучей "фрилансеров" в авторах. Сам подход достаточно простой и давно известный, но у них настроенные пайплайны, легкая кастомизация, большое комьюнити. Ну и конечно результаты по моему у них на данный момент самые "приятные".


Естественно это подается под соусом "дипфейки это плохо, но лучшая защита это нападение". Что интересно в авторах есть Ctrl Shift Face очень популярные видосы на ютубе с дипфейками, а также Mr. dpfks, который, наверное, делает MrDeepFakes сайт порнхаб с селебами на дипфейках.


Код на TF, но автор написал свой велосипед для TF Leras(Lighter Keras), который вроде проще (куда еще) и быстрее. В любом случае, большинство кто использует сидят на винде и все что им надо создать две папки с картинками двух людей.


Пайплайн из трех частей extraction, training, conversion. Подход ограничен конвертацией "one-to-one" под каждую пару людей нужно все переучивать.


Extraction состоит из:


  • детекции лица и кейпоинтов (S3FD, но можно заменить на RetinaFace);
  • выравнивание лица сглаживают по времени кейпоинты и применяют трансформацию (Umeyama), чтобы привести лицо к нормальному положению;
  • сегментация лица(TernausNet).



Сегментация лица часто не очень точная, поэтому они сделали свою тулзу XSeg которая помогает интерактивно подправить плохие маски и дозакинуть их заново в обучение, такой active learning. Говорят достаточно доразметить 50 фоток руками.


Training. На вход две папки в каждой выровненные лица и маски для отдельного человека. У них два пайплайна, первый DF, по сути простой автоэнкодер. Энкодер и ботлнек (Inter), которые зашарены для двух людей, а также два декодера с разными весами для каждого человека.




Второй LIAE. Энкодер также зашарен, а ботлнека два разных. InterAB генерит эмбединг и для source и для target, а InterB только для target. На вход зашаренному декодеру подается конкат двух эмбедингов. Для source просто конкатится InterAB эмбединг сам с собой, для target InterAB с InterB. Вроде InterAB должен вытаскивать общую для двух доменов инфу, а InterB детали target домена.




Во время "автоэнкодерного" обучения давали разный вес лосам за реконструкцию разных частей лица, например у глаз был самый большой вес. Лоссы: DSSIM + MSE. На гпу обучение пару часов.


Conversion. По сути берется лицо из source и просто прогоняется или через Decoder dst в случае DF или через InterAB и InterB в случае LIAE. Сгенеренное лицо реалайнится по кейпоинтам таргет лица. Результат матчится по цветовой схеме с таргетом одним из 5 алгоритмов на выбор. Блендинг границ лица по сегментационной маске делают через Poisson blending optimization. После этого еще прогоняют результат через суперрез для четкости.




По метрикам конечно сота.




Также есть Ablation Study в котором они тестили немного разные архитектуры, добавление ган лосса и TrueFace. Примеры работы подхода представлены ниже.




4. End-to-End Object Detection with Transformers


Авторы статьи: Nicolas Carion, Francisco Massa, Gabriel Synnaeve, Nicolas Usunier, Alexander Kirillov, Sergey Zagoruyko (Facebook AI, 2020)
Оригинал статьи :: GitHub project
Автор обзора: Андрей Лукьяненко (в слэке artgor, на habr artgor)


Классный новый подход к object detection от facebook! Они предлагают работать с этой с задачей, как с прямым предсказанием сета и использовать трансформер. Базовая модель даёт 42 AP на COCO! Но тренируется 3 дня на 16 V100.


Основная суть DETR заключается в том, то он сразу предсказывает все объекты и тренируется с лоссом, который делает двустороннее соответствие (performs bipartite) между предсказанными боксами и разметкой. Получается, что нам не нужны ни якоря, ни non-maximal supression. Есть один минус: авторы признают, что DETR отлично работает на больших объектах, то хуже на мелких. И для тренировки нужно, цитирую "extra-long training schedule", а также дополнительные лоссы. С другой стороны, подход можно использовать и для других задач, например, сегментации.




DETR Model
Для прямого предсказания сетов нужны две составные части: лосс, который делает уникальный матчинг между предсказанными и размеченными боксами, и архитектура, которая за один проход предсказывает сеты объектов и моделирует их взаимосвязи.


Object detection set prediction loss
Модель предсказывает N объектов за один раз. Обычно число значительно выше, чем количество реальных объектов. Лосс делает двусторонний матчинг и оптимизирует лоссы для боксов.


В формуле y ground truth, y-hat предсказания. Поскольку "y" меньше размером, то делают паддинг со значениями "no object". По факту ищем пермутации объектов с минимальным костом.


$$display$$\DeclareMathOperator*{\argmin}{arg\,min} \newcommand{\lmatch}[1]{{\cal L}_{\rm match}(#1)} \hat{\sigma} = \argmin_{\sigma\in\Sigma_N} \sum_{i}^{N} \lmatch{y_i, \hat{y}_{\sigma(i)}}$$display$$


Lmatch pair-wise matching cost between ground truth and prediction. Считают с помощью Hungarian algorithm. Он учитывает классы и схожесть между боксами.


Теперь считаем Венгерский лосс для всех пар, которые получились на предыдущем шаге. Для "no object" делим лог-вероятность на 10, чтобы компенсировать дисбаланс классов.


$$display$$\newcommand{\hloss}[1]{{\cal L}_{\rm Hungarian}(#1)} \newcommand{\bloss}[1]{{\cal L}_{\rm box}(#1)} \newcommand{\indic}[1]{1_{\{#1\}}} \hloss{y, \hat{y}} = \sum_{i=1}^N \left[-\log \hat{p}_{\hat{\sigma}(i)}(c_{i}) + \indic{c_i\neq 0} \bloss{b_{i}, \hat{b}_{\hat{\sigma}}(i)}\right]\,,$$display$$


Bounding box loss
Просто использовать L1 не вариант, ибо будут разные масштабы значений для мелких и больших боксов. Поэтому добавляют IoU. Лямбды гиперпараметры. И лосс делят на количество объектов в батче.


$\lambda_{\rm iou}{\cal L}_{\rm iou}(b_{i}, \hat{b}_{\sigma(i)}) + \lambda_{\rm L1} || b_{i} - \hat{b}_{\sigma(i)} ||_1$


DETR Architecture: CNN + transformer + FNN.
Backbone: можно использовать любую. На выходе авторы хотят иметь feature maps с 2048 каналами, высота и ширина картонок в 32 раза меньше оригинальных.




Трансформер.
Энкодер и декодер инвариантны к перестановкам.


Энкодер. Вначале используем 1x1 convolution, чтобы уменьшить количество каналов до d. Поскольку энкодеру надо на вход подавать последовательности, мы преобразуем данные и получаем размерность dxHW. В энкодере используется multi-head attention + FNN. К каждому attention добавляются positional embeddings.


Декодер. Декодирует объекты параллельно в каждом слое. На вход дополнительно подают N эмбеддингов это тренируемые positional encodings, которые добавляются на каждом слое. Им дали название object queries.


На выходе эмбеддинги независимо друг от друга декодируются в координаты боксов и классы с помощью FNN. Благодаря attention модель может учитывать взаимосвязи между объектами.


FNN. Голова просто трехслойный перцептрон. Предсказывает координаты центра боксов и их размеры, линейный слой предсказывает классы с помощью softmax.




Auxiliary decoding losses
В каждом слое декодера добавляют prediction FFNs, параметры которых шарятся, и Hungarian loss. И дополнительно используют layer-norm для нормализации входов в prediction FNN с каждого слоя декодера.


Эксперименты на COCO
Параметры обучения: AdamW, начальный LR трансформера 10^-4, backbone's 10^-5, weight decay 10^-4. Попробовали ResNet-50 and ResNet-101 в качестве backbones модели назвали DETR and DETR-101.


Попробовали ещё улучшить архитектуру: улучшить разрешение с помощью добавления dilation на последней стадии backbone и убирания stride на этой же стадии. Модели назвали DETR-DC5 and DETR-DC5-R101. Требует в 2 раза больше вычислений, но улучшает результаты для мелких объектов.


Scale augmentation поресайзили картинки так, чтобы минимальная сторона была от 480 до 800, а максимальная не больше 1333. Random crop augmentation (+1 AP). И постпроцессинг если модель предсказывает пустые классы, взять следующий класс по вероятности. +2 AP. Обучение: 300 эпох 3 дня на 16 V100. Тренировка на 500 эпох дает + 1.5 AP.




Сравнение с Faster R-CNN
Попробовали улучшить Faster R-CNN:


  • добавить IoU в лосс;
  • random crop augmentations;
  • дольше тренировка.

В таблице выше обычный Faster R-CNN тренировался в 3 раза дольше обычного. Значок "+"означает тренировку в 9 раз дольше (109 эпох). DETR тащит почти все AP кроме AP75 и APs


Ablation
Энкодер по своей сути global scene reasoning и это помогает разъединять объекты. Увеличение количества слоев энкодера и декодера помогает.


FNN внутри трансформера можно интерпретировать как 1 1 convolutional, то есть получается нечто похожее на attention augmented convolutional. Без этого AP падает на 2.3.




DETR for panoptic segmentation
Просто добавляет голову с маской после декодера (бинарно на каждый класс). Но боксы все равно надо предсказывать для лосса.


И классы предсказываются с помощью argmax по каждому пикселю. Так защищаемся от потенциального перекрытия масок разных классов.





И последнее картинка про качество, для тех, кто очень обрадовался. Чем больше объектов, тем хуже работает модель.




5. Language Models are Few-Shot Learners


Авторы статьи: Tom B. Brown et.al. (OpenAI, 2020)
Оригинал статьи :: GitHub with examples and statistics
Автор обзора: Вадим Петров (в слэке graviton, на habr belgraviton)


До сих пор, использование предобученных трансформеров в прикладных задачах (например, questions answering) требовало дообучения. Большая группа ученых из OpenAI продемонстрировала, что при увеличении размера языковой модели GPT-3 (до 175B весов), достигается хорошая точность на специфических задачах без дообучения, сравнимая с моделями, которые файнтюнились на них (см. график ниже). Для задачи генерации новостей достигнуто качество, сложно отличимое от новостей, написанных людьми.


Авторы изучали модель применительно к разным задачам на основе подходов zero-shot, one-shot и few-shot. Случай дообучения под задачи они оставили на будущее. Для случая few-shot на графике снизу видно значительное увеличение точности при росте числа параметров модели.




Авторы пытались решить следующие задачи:


  1. Специфичные задачи в NLP требуют сбора датасетов под них. Это иногда довольно затратно.
  2. Решение проблемы с генерализацией под новые задачи, где данных может быть слишком мало для больших моделей трансформеров.
  3. Люди требуют очень мало информации для решения смежных NLP задач. Хорошие NLP модели должны также демонстрировать аналогичное поведение.

Архитектура
Использована архитектура GPT-2 с модифицированной инициализацией, преднормализацией и обратимой токенизацией. Отличием является использование плотных и локально разреженных "attention patterns" в слоях трансформера. Обучено 8 моделей от 125M до 175B параметров.




Замечу, что архитектура GPT-2 тоже лишь незначительно отличается от GPT-1, которая представлена ниже.




Тренировка
Были использованы 5 датасетов: Common Crawl, WebText2, Books1, Books2 и Wikipedia. Всего около 300 млрд токенов.


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


Использован Adam, с ограничением градиента в 1.0, cosine learning rate decay и warmup. Обучение GPT-3 заняло 3640 PetaFlops-days на кластере из V100 GPUs, предоставленном Microsoft.


Результаты


Тестирование проводилось на большом наборе датасетов. В большей части из них удалось с помощью few shot подхода получить результаты схожие с fine tune SOTA подходами. Примером, такого случая является перевод, результаты для которого представлены в таблице ниже. При этом, для нескольких задач удалось достичь даже значительного улучшения SOTA. Об этом ниже.




На задаче предсказания последнего слова в параграфе SOTA улучшена на 8 %, а в тесте с ответами на вопросы о физических процессах модель превзошла предыдущую SOTA (fine-tuned RoBERTa) на 1% даже в zero-shot режиме!





Арифметические операции


Для задачи выполнения арифметических операций сгенерировали датасет, на котором продемонстрировали способность модели (few-shot) решать данную задачу с точностью больше 90% для 2-х и 3-х значных чисел. Датасет обещают выложить.


Генерация новостей
Анализировался режим few-shot. Модели для генерации новости показывалось 3 новости по выбранной теме и заголовок с подзаголовком для новой статьи. Качество статей проверялось 80 людьми. Точность идентификации источника новостей заметно снижается при увеличении модели и достигает для GPT-3 только 52%, что очень близко к уровню случайного выбора (50%) несмотря на то, что люди тратили больше времени на оценку результатов больших моделей.




Имеющиеся проблемы


  • В то же время разработчики нашли ряд задач, в которых модель была неуспешна (оценка связи двух выражений -ANLI dataset, сжатие текста RACE, QuAC).


  • Из-за ошибки в пайплайне очистки тренировочного датасета от тестовых примеров, остались перекрытия. Авторы провели анализ влияния перекрытий на результаты.


  • Также имеются проблемы с генерацией текстов: иногда имеются повторения и несогласованность для длинных текстов, нелогичные заключения.



6. TabNet: Attentive Interpretable Tabular Learning


Авторы статьи: Sercan O. Arik, Tomas Pfister (Google Cloud AI, 2020)
Оригинал статьи :: GitHub project
Автор обзора: Александр Бельских (в слэке belskikh)


Работа от Google, в которой представлена архитектура нейросети для табличных данных, превосходящая доминирующие до этого подходы на ансамблях деревьев, сохраняя свойства интерпретируемости и легковесности. Дополнительно обладает возможностью предобучения в режиме self-supervising, что открывает большие возможности для дообучения и обучения на маленьких датасетах.


В отличии от tree-based подходов, на вход TabNet поступают сырые табличные данные, а обучается она через обычный градиентный спуск, выучивая хорошие репрезентации данных.


В архитектуре использован sequential attention механизм, который определяет, какие признаки будут использованы во время текущего decision step, что позволяет получить интерпретируемость предсказания.


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




Дискретные признаки классически приводятся к виду таблицы выучиваемых эмбеддингов. Сами признаки прогоняются через специальный модуль feature transformer (ничего общего с архитектурой Transformer не имеет).


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




Модель показала себя наравне или лучше чем текущие SOTA модельки для табличных данных.





Ссылка на начало.

Подробнее..

Перевод Как создать свой первый open source проект на Python (17 шагов)

22.06.2020 18:15:30 | Автор: admin
Каждый разработчик ПО должен знать как создать библиотеку с нуля. В процессе работы Вы можете многому научиться. Только не забудьте запастись временем и терпением.

Может показаться, что создать библиотеку с открытым исходным кодом сложно, но Вам не нужно быть потрепанным жизнью ветераном своего дела, чтобы разобраться в коде. Также как Вам не нужна мудреная идея продукта. Но точно понадобятся настойчивость и время. Надеюсь, что данное руководство поможет Вам создать первый проект с минимальной затратой и первого, и второго.

В этой статье мы пошагово разберем процесс создания базовой библиотеки на Python. Не забудьте заменить в приведенном ниже коде my_package, my_file и т.п. нужными вам именами.

Шаг 1: Составьте план


Мы планируем создать простую библиотеку для использования в Python. Данная библиотека позволит пользователю легко конвертировать блокнот Jupyter в HTML-файл или Python-скрипт.
Первая итерация нашей библиотеки позволит вызвать функцию, которая выведет определенное сообщение.

Теперь, когда мы уже знаем, что хотим делать, нужно придумать название для библиотеки.

Шаг 2: Дайте имя библиотеке


Придумывать имена сложно. Они должны быть короткими, уникальными и запоминающимися. Также они должны быть написаны строчными буквами, без прочерков и прочих знаков препинания. Подчеркивание не рекомендуется. В процессе создания библиотеки убедитесь, что придуманное Вами имя доступно на GitHub, Google и PyPi.

Если Вы надеетесь и верите, что однажды Ваша библиотека получит 10000 звезд GitHub, то стоит проверить, доступно ли данное имя в социальных сетях. В данном примере я назову свою библиотеку notebookc, потому что это имя доступное, короткое и более-менее описывает суть моей задумки.

Шаг 3. Настройте среду


Убедитесь, что у вас установлены и настроены Python 3.7, GitHub и Homebrew. Если вам нужно что-то из этого, вот подробности:

Python


Скачайте Python 3.7 здесь и установите его.

GitHub


Если у вас нет учетной записи GitHub, перейдите по этой ссылке и оформите бесплатную подписку. Посмотрите, как установить и настроить Git здесь. Вам потребуется утилита командной строки. Перейдите по ссылкам, скачайте и установите все, что Вам понадобится, придумайте юзернейм и укажите электронную почту.

Homebrew


Homebrew менеджер библиотек для Mac. Инструкции по установке найдете здесь.

Venv


Начиная с Python 3.6 рекомендуется использовать venv для создания виртуальной среды для разработки библиотек. Существует множество способов управления виртуальными средами с помощью Python и все они со временем изменяются. Можете ознакомиться с обсуждением здесь, но, как говорится, доверяй, но проверяй.

Начиная с версии Python 3.3 venv входит в систему по умолчанию. Обратите внимание, что venv устанавливает pip и setuptools начиная с Python 3.4.

Создайте виртуальную среду Python 3.7 с помощью следующей команды:

python3.7 -m venv my_env

Замените my_env вашим именем. Активируйте среду таким образом:

source my_env/bin/activate

Теперь вы должны наблюдать (my_env) (или имя, которое вы выбрали для вашей виртуальной среды) в крайнем левом углу терминала.

Когда закончите работу, деактивируйте виртуальную среду с помощью deactivate.

Теперь давайте настроим GitHub.

Шаг 4: Создайте организацию в GitHub


GitHub лидер на рынке реестров контроля версий. Еще две популярные опции GitLab и Bitbucket. В данном гиде мы будем использовать именно GitHub.

Вам придется часто обращаться к Git и GitHub, поэтому если Вы не знакомы с системой, то можете обратиться к моей статье.

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

image

Шаг 5: Настройте GitHub Repo


Создайте новый репозиторий. Я назвал свой notebookc.

image

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

Рекомендую выбрать лицензию в списке Выбрать лицензию. Она определяет, что могут делать пользователи Вашего репозитория. Одни лицензии позволяют больше других. Если Вы ничего не выбираете, то автоматически начинают действовать стандартные законы об авторских правах. Узнайте больше о лицензиях здесь.

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

image

Шаг 6: Клонируйте и добавьте директории


Выберите, куда Вы хотите клонировать Ваш репозиторий или выполните следующую функцию:

git clone https://github.com/notebooktoall/notebookc.git

Подставьте свою организацию и репозиторий.

Перейдите в папку проекта с помощью десктопного графического интерфейса или редактора кода. Или используйте командную строку с cd my-project и после просмотрите файлы с ls A.

Ваши исходные папки и файлы должны выглядеть так:

.git
.gitignore
LICENSE
README.rst


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

Создайте файл с именем __init__.py в основной вложенной папке. Этот файл пока останется пустым. Он необходим для импорта файлов.

Создайте еще один файл с таким же именем, как у основной вложенной папки, и добавьте .py. Мой файл называется notebookc.py. Вы можете назвать этот Python-файл как захотите. Пользователи библиотеки при импорте модуля будут ссылаться на имя этого файла.

Содержимое моей директории notebookc выглядит следующим образом:

.git
.gitignore
LICENSE
README.rst
notebookc/__init__.py
notebookc/notebookc.py


Шаг 7: Скачайте и установите requirements_dev.txt


На верхнем уровне директории проекта создайте файл requirements_dev.txt. Часто этот файл называют requirements.txt. Назвав его requirements_dev.txt, Вы показываете, что эти библиотеки могут устанавливаться только разработчиками проекта.

В файле укажите, что должны быть установлены pip и wheel.

pip==19.0.3
wheel==0.33.1


Обратите внимание, что мы указываем точные версии библиотек с двойными знаками равенства и полными номерами версии.

Закрепите версии вашей библиотеку в requirements_dev.txt

Соавтор, который разветвляет репозиторий проекта и устанавливает закрепленные библиотеки require_dev.txt с помощью pip, будет иметь те же версии библиотеки, что и Вы. Вы знаете, что эта версия будет работать у них. Кроме того, Read The Docs будет использовать этот файл для установки библиотек при сборке документации.

В вашей активированной виртуальной среде установите библиотеку в файл needs_dev.txt с помощью следующей команды:

pip install -r requirements_dev.txt

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

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

Шаг 8: Поработайте с кодом


В целях демонстрации давайте создадим базовую функцию. Свою собственную крутую функцию сможете создать позже.

Вбейте следующее в Ваш основной файл (для меня это notebookc/notebookc/notebookc.py):

def convert(my_name):    """    Print a line about converting a notebook.    Args:        my_name (str): person's name    Returns:        None    """    print(f"I'll convert a notebook for you some day, {my_name}.")


Вот наша функция во всей красе.

Строки документа начинаются и заканчиваются тремя последовательными двойными кавычками. Они будут использованы в следующей статье для автоматического создания документации.
Сохраните изменения. Если хотите освежить память о работе с Git, то можете заглянуть в эту статью.

Шаг 9: Создайте setup.py


Файл setup.py это скрипт сборки для вашей библиотеки. Функция setup из Setuptools создаст библиотеку для загрузки в PyPI. Setuptools содержит информацию о вашей библиотеке, номере версии и о том, какие другие библиотеки требуются для пользователей.

Вот мой пример файла setup.py:

from setuptools import setup, find_packageswith open("README.md", "r") as readme_file:    readme = readme_file.read()requirements = ["ipython>=6", "nbformat>=4", "nbconvert>=5", "requests>=2"]setup(    name="notebookc",    version="0.0.1",    author="Jeff Hale",    author_email="jeffmshale@gmail.com",    description="A package to convert your Jupyter Notebook",    long_description=readme,    long_description_content_type="text/markdown",    url="http://personeltest.ru/aways/github.com/your_package/homepage/",    packages=find_packages(),    install_requires=requirements,    classifiers=[        "Programming Language :: Python :: 3.7",        "License :: OSI Approved :: GNU General Public License v3 (GPLv3)",    ],)


Обратите внимание, что long_description установлен на содержимое файла README.md. Список требований (requirements), указанный в setuptools.setup.install_requires, включает в себя все необходимые зависимости для работы вашей библиотеки.

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

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

Соавтор, который разветвляет репозиторий проекта и устанавливает закрепленные библиотеки с помощью pip, будет иметь те же версии, что и Вы. Это значит, что они должны работать.
Измените информацию setuptools так, чтобы она соответствовала информации вашей библиотеки. Существует множество других необязательных аргументов и классификаторов ключевых слов см. перечень здесь. Более подробные руководства по setup.py можно найти здесь и здесь.

Сохраните свой код в локальном репозитории Git. Пора переходить к созданию библиотеки!

Шаг 10: Соберите первую версию


Twine это набор утилит для безопасной публикации библиотек Python на PyPI. Добавьте библиотеку Twine в следующую пустую строку файла require_dev.txt таким образом:

twine==1.13.0


Затем закрепите Twine в Вашей виртуальной среде, переустановив библиотеки needs_dev.txt.

pip install -r requirements_dev.txt


Затем выполните следующую команду, чтобы создать файлы библиотеки:

python setup.py sdist bdist_wheel


Необходимо создать несколько скрытых папок: dist, build и в моем случае notebookc.egg-info. Давайте посмотрим на файлы в папке dist. Файл .whl это файл Wheel встроенный дистрибутив. Файл .tar.gz является исходным архивом.

На компьютере пользователя pip будет по мере возможности устанавливать библиотеки как wheels/колеса. Они устанавливаются быстрее. Когда pip не может этого сделать, он возвращается к исходному архиву.
Давайте подготовимся к загрузке нашего колеса и исходного архива.

Шаг 11: Создайте учётную запись TestPyPI


PyPI каталог библиотек Python (Python Package Index). Это официальный менеджер библиотек Python. Если файлы не установлены локально, pip получает их оттуда.

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

Шаг 12: Опубликуйте библиотеку в PyPI


Используйте Twine для безопасной публикации вашей библиотеки в TestPyPI. Введите следующую команду никаких изменений не требуется.

twine upload --repository-url https://test.pypi.org/legacy/ dist/*


Вам будет предложено ввести имя пользователя и пароль. Не забывайте, что TestPyPI и PyPI имеют разные пароли!

При необходимости исправьте все ошибки, создайте новый номер версии в файле setup.py и удалите старые артефакты сборки: папки build, dist и egg. Перестройте задачу с помощью python setup.py sdist bdist_wheel и повторно загрузите с помощью Twine. Наличие номеров версий в TestPyPI, которые ничего не значат, особой роли не играют Вы единственный, кто будет использовать эти версии библиотек.

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

Шаг 13: Проверьте и используйте установленную библиотеку


Создайте еще одну вкладку в командном интерпретаторе и запустите другую виртуальную среду.

python3.7 -m venv my_env


Активируйте ее.

source my_env/bin/activate


Если Вы уже загрузили свою библиотеку на официальный сайт PyPI, то сможете выполнить команду pip install your-package. Мы можем извлечь библиотеку из TestPyPI и установить его с помощью измененной команды.

Вот официальные инструкции по установке вашей библиотеки из TestPyPI:

Вы можете заставить pip загружать библиотеки из TestPyPI вместо PyPI, указав это в index-url.

pip install --index-url https://test.pypi.org/simple/ my_package


Если хотите, чтобы pip также извлекал и другие библиотеки из PyPI, Вы можете добавить extra-index-url для указания на PyPI. Это полезно, когда тестируемая библиотека имеет зависимости:

pip install --index-url https://test.pypi.org/simple/ --extra-index-url https://pypi.org/simple my_package



Если у вашей библиотеки есть зависимости, используйте вторую команду и подставьте имя вашей библиотеки.

Вы должны увидеть последнюю версию библиотеки, установленного в Вашей виртуальной среде.

Чтобы убедиться, что Вы можете использовать свою библиотеку, запустите сеанс IPython в терминале следующим образом:

python


Импортируйте свою функцию и вызовите ее со строковым аргументом. Вот как выглядит мой код:

from notebookc.notebookc import convert


convert(Jeff)


После я получаю следующий вывод:

Ill convert a notebook for you some day, Jeff.

(Когда-нибудь я конвертирую для тебя блокнот, Джефф)

Я в Вас верю.

Шаг 14: Залейте код на PyPI


Залейте Ваш код на настоящий сайт PyPI, чтобы люди могли скачать его с помощью pip install my_package.

Загрузить код можно так:

twine upload dist/*


Обратите внимание, что Вам нужно обновить номер версии в setup.py, если Вы хотите залить новую версию в PyPI.

Отлично, теперь давайте загрузим нашу работу на GitHub.

Шаг 15: Залейте библиотеку на GitHub


Убедитесь, что Ваш код сохранен.

Моя папка проекта notebookc выглядит так:

.git.gitignoreLICENSEREADME.mdrequirements_dev.txtsetup.pynotebookc/__init__.pynotebookc/notebookc.py


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

Переместите вашу локальную ветку на GitHub с помощью git push origin my_branch.

Шаг 16: Создайте и объедините PR


В браузере перейдите к GitHub. У Вас должна появиться опция сделать pull-запрос. Нажимайте на зеленые кнопки, чтобы создать, объединить PR и чтобы убрать удаленную ветку.
Вернувшись в терминал, удалите локальную ветку с git branch -d my_feature_branch.

Шаг 17: Обновите рабочую версию на GitHub


Создайте новую версию библиотеки на GitHub, кликнув на релизы на главной странице репозитория. Введите необходимую информацию о релизе и сохраните.

На сегодня достаточно!

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

Итог: 17 шагов к рабочей библиотеке



  1. Составьте план.
  2. Дайте имя библиотеке.
  3. Настройте среду.
  4. Создайте организацию в GitHub.
  5. Настройте GitHub Repo.
  6. Клонируйте и добавьте директории.
  7. Скачайте и установите requirements_dev.txt.
  8. Поработайте с кодом.
  9. Создайте setup.py.
  10. Соберите первую версию.
  11. Создайте учётную запись TestPyPI.
  12. Опубликуйте библиотеку в PyPI.
  13. Проверьте и используйте установленную библиотеку.
  14. Залейте код на PyPI.
  15. Залейте библиотеку на GitHub.
  16. Создайте и объедините PR.
  17. Обновите рабочую версию на GitHub.


image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

R Markdown. Как сделать отчет в условиях неопределенности?

23.06.2020 18:09:52 | Автор: admin

Маленький рецепт, который будет полезен при создании динамических отчетов.


Достаточно часто встречается ситуация, когда размер и содержание отчетной формы будет зависеть от состава переданных на вход данных. Речь идет именно о story-telling отчете, а не о простом выводе таблицы. В этом случае, в зависимости от содержания входных данных, могут появляться или исчезать отдельные пункты, графики, таблицы, текст.


Что будет делать классический Excel-Word аналитик? Под каждый новый запрос делать кастомный отчет и сохранять его в отдельный файл. Но можно заглянуть немного под капот и заставить компьютер делать все самостоятельно.


R Markdown позволяет все это выполнить в элегантной форме. Некоторые технические детали ниже.


Основная идея


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


R Markdown выполняется в несколько проходов. При этом из Rmd сначала формируется .md, а потом из него формируется выходное представление, наиболее часто используеся html.


Намечаются 2 варианта.


  1. Можно динамически вставить в .Rmd нужные блоки (собранные или шаблонизированные).
  2. Можно динамически вставить в .md нужные markdown вставки.

Реализация


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


  1. Динамически вставляем гиперссылки, получаемые из внешнего источника.
  2. Динамически формируем разделы документов на основании данных.

Исходный код и Результирующий отчет


Ссылки


Вот ещё полезная информация на эту тему:



P.S. Для сомневающихся этот пример является неплохой аргументацией, почему имеет смысл посмотреть в сторону R.


Предыдущая публикация Медианы выборок. Доверительные интервалы и сравнение.

Подробнее..
Категории: Python , Data science , Data mining , R

Перевод Смотрим на Chapel, D, Julia на задаче вычисления ядра матрицы

24.06.2020 14:16:49 | Автор: admin

Введение


Кажется, стоит вам отвернуться, и появляется новый язык программирования, нацеленный на решение некоторого специфического набора задач. Увеличение количества языков программирования и данных глубоко взаимосвязано, и растущий спрос на вычисления в области Data Science является связанным феноменом. В области научных вычислений языки программирования Chapel, D и Julia являются весьма релевантными. Они возникли в связи с различными потребностями и ориентированы на различные группы проблем: Chapel фокусируется на параллелизме данных на отдельных многоядерных машинах и больших кластерах; D изначально разрабатывался как более продуктивная и безопасная альтернатива C++; Julia разрабатывалась для технических и научных вычислений и была нацелена на освоение преимуществ обоих миров высокой производительности и безопасности статических языков программирования и гибкости динамических языков программирования. Тем не менее, все они подчеркивают производительность как отличительную особенность. В этой статье мы рассмотрим, как различается их производительность при вычислении ядра матрицы, и представим подходы к оптимизации производительности и другие особенности языков, связанные с удобством использования.

Вычисление ядра матрицы формирует основу методов в приложениях машинного обучения. Задача достаточно плохо масштабируется -O(m n^2), где n количество векторов, а m количество элементов в каждом векторе. В наших упражнениях m будет постоянным и мы будем смотреть на время выполнения в каждой реализации по мере увеличения n. Здесь m = 784 и n = 1k, 5k, 10k, 20k, 30k, каждое вычисление выполняется три раза и берется среднее значение. Мы запрещаем любое использование BLAS и допускаем использование только пакетов или модулей из стандартной библиотеки каждого языка, хотя в случае D эталон еще сравнивается с вычислениями, использующими Mir, библиотеку для работы с многомерными массивами, чтобы убедиться, что моя реализация матрицы отражает истинную производительность D. Подробности вычисления ядра матрицы и основных функций приведены здесь.

При подготовке кода для этой статьи сообщества Chapel, D и Julia были очень полезны и терпеливы в отношении всех моих обращений, чему я признателен.

С точки зрения предвзятости, в начале работы, я был гораздо лучше знаком с D и Julia, чем с Chapel. Тем не менее, для получения наилучшей производительности от каждого языка требовалось взаимодействие с сообществами каждого языка, и я делал всё возможное, чтобы осознавать мои предубеждения и исправлять их там, где это было необходимо.

Бенчмарки языков программирования на задаче вычисления ядра матрицы


Приведенная выше диаграмма (сгенерированная с помощью ggplot2 на R с помощью скрипта) показывает время выполнения для количества элементов n для Chapel, D, и Julia, для девяти вычислений ядра. D лучше всего работает в пяти из девяти случаев, Julia лучше в двух из девяти, а в двух задачах (Dot и Gaussian) картинка смешанная. Chapel был самым медленным для всех рассмотренных задач.
Стоит отметить, что математические функции, используемые в D, были взяты из math API языка C, доступного в D через core.stdc.math, так как математические функции в стандартной библиотеке std.math языка D бывают достаточно медленными. Использованные математические функции приведены здесь. Для сравнения рассмотрим скрипт mathdemo.d, сравнивающий C-функцию логарифма с D-функцией из std.math:
$ ldc2 -O --boundscheck=off --ffast-math --mcpu=native --boundscheck=off mathdemo.d && ./mathdemoTime taken for c log: 0.324789 seconds.Time taken for d log: 2.30737 seconds.

Объект Matrix, используемый в бенчмарке D, был реализован специально из-за запрета на использование модулей вне стандартных языковых библиотек. Чтобы удостовериться, что эта реализация конкурентоспособна, т.е. не представляет собой плохую реализацию на D, я ее сравниваю с библиотекой Mir's ndslice, тоже написанной на D. На диаграмме ниже показано время вычисления матрицы минус время реализации ndslice; отрицательное значение означает, что ndslice работает медленнее, что указывает на то, что используемая здесь реализация не представляет собой негативную оценку производительности D.


Условия тестирования


Код был выполнен на компьютере с операционной системой Ubuntu 20.04, 32 ГБ памяти и процессором Intel Core i9-8950HK @ 2.90GHz с 6-ю ядрами и 12-ю потоками.
$ julia --versionjulia version 1.4.1$ dmd --versionDMD64 D Compiler v2.090.1$ ldc2 --versionLDC - the LLVM D compiler (1.18.0):  based on DMD v2.088.1 and LLVM 9.0.0$ chpl --versionchpl version 1.22.0

Компиляция


Chapel:
chpl script.chpl kernelmatrix.chpl --fast && ./script

D:
ldc2 script.d kernelmatrix.d arrays.d -O5 --boundscheck=off --ffast-math -mcpu=native && ./script

Julia (компиляция не требуется, но может быть запущена из командной строки):
julia script.jl


Реализации


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

Chapel


Chapel использует цикл forall для распараллеливания по потокам. Также используется C-указатели на каждый элемент, а не стандартное обращение к массивам, и применяется guided итерация по индексам:
proc calculateKernelMatrix(K, data: [?D] ?T){  var n = D.dim(0).last;  var p = D.dim(1).last;  var E: domain(2) = {D.dim(0), D.dim(0)};  var mat: [E] T;  var rowPointers: [1..n] c_ptr(T) =    forall i in 1..n do c_ptrTo(data[i, 1]);  forall j in guided(1..n by -1) {    for i in j..n {      mat[i, j] = K.kernel(rowPointers[i], rowPointers[j], p);      mat[j, i] = mat[i, j];    }  }  return mat;}
Код на Chapel был самым трудным для оптимизации по производительности и потребовал наибольшего количества изменений кода.

D


Для распараллеливания кода D используется taskPool потоков из пакета std.parallel. Код на D претерпел наименьшее количество изменений для оптимизации производительности большая польза от использования специфического компилятора и выбранных ключей компиляции (обсуждается далее). Моя реализация Matrix позволяет отобрать столбцы по ссылке с помощью refColumnSelect.
auto calculateKernelMatrix(alias K, T)(K!(T) kernel, Matrix!(T) data){  long n = data.ncol;  auto mat = Matrix!(T)(n, n);  foreach(j; taskPool.parallel(iota(n)))  {    auto arrj = data.refColumnSelect(j).array;    foreach(long i; j..n)    {      mat[i, j] = kernel(data.refColumnSelect(i).array, arrj);      mat[j, i] = mat[i, j];    }  }  return mat;}

Julia


Код Julia использует макрос threads для распараллеливания кода и макрос views для ссылок на массивы. Единственное, что сбивает с толку с массивами в Julia это их ссылочный статус. Иногда, как и в этом случае, массивы будут вести себя как объекты-значения, и на них нужно ссылаться с помощью макроса views, иначе они будут генерировать копии. В других случаях они ведут себя как ссылочные объекты, например, при передаче их в функцию. С этим может быть немного сложно разобраться, потому что вы не всегда знаете, какой набор операций сгенерирует копию, но там, где это происходит, views обеспечивает хорошее решение.
Тип Symmetric позволяет сэкономить немного дополнительной работы, необходимой для отражения в матрице.
function calculateKernelMatrix(Kernel::K, data::Array{T}) where {K <: AbstractKernel,T <: AbstractFloat}  n = size(data)[2]  mat = zeros(T, n, n)  @threads for j in 1:n      @views for i in j:n          mat[i,j] = kernel(Kernel, data[:, i], data[:, j])      end  end  return Symmetric(mat, :L)end
Макросы @ bounds и @ simd в основных функциях использовались для отключения проверки границ и применения оптимизации SIMD к вычислениям:
struct DotProduct <: AbstractKernel end@inline function kernel(K::DotProduct, x::AbstractArray{T, N}, y::AbstractArray{T, N}) where {T,N}  ret = zero(T)  m = length(x)  @inbounds @simd for k in 1:m      ret += x[k] * y[k]  end  return retend
Эти оптимизации достаточно заметны, но очень просты в применении.

Использование памяти


Суммарное время для каждого бенчмарка и общая используемая память была собрана с помощью команды /usr/bin/time -v. Вывод для каждого из языков приведен ниже.

Chapel занял наибольшее общее время, но использовал наименьший объем памяти (почти 6 Гб оперативной памяти):
Command being timed: "./script"User time (seconds): 113190.32System time (seconds): 6.57Percent of CPU this job got: 1196%Elapsed (wall clock) time (h:mm:ss or m:ss): 2:37:39Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 5761116Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 1439306Voluntary context switches: 653Involuntary context switches: 1374820Swaps: 0File system inputs: 0File system outputs: 8Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0

D расходует наибольший объем памяти (около 20 ГБ оперативной памяти на пике), но занимает меньше общего времени, чем Chapel для выполнения:
Command being timed: "./script"User time (seconds): 106065.71System time (seconds): 58.56Percent of CPU this job got: 1191%Elapsed (wall clock) time (h:mm:ss or m:ss): 2:28:29Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 20578840Average resident set size (kbytes): 0Major (requiring I/O) page faults: 0Minor (reclaiming a frame) page faults: 18249033Voluntary context switches: 3833Involuntary context switches: 1782832Swaps: 0File system inputs: 0File system outputs: 8Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0

Julia потратила умеренный объем памяти (около 7,5 Гб пиковой памяти), но выполнялась быстрее всех, вероятно, потому что ее генератор случайных чисел является самым быстрым:
Command being timed: "julia script.jl"User time (seconds): 49794.85System time (seconds): 30.58Percent of CPU this job got: 726%Elapsed (wall clock) time (h:mm:ss or m:ss): 1:54:18Average shared text size (kbytes): 0Average unshared data size (kbytes): 0Average stack size (kbytes): 0Average total size (kbytes): 0Maximum resident set size (kbytes): 7496184Average resident set size (kbytes): 0Major (requiring I/O) page faults: 794Minor (reclaiming a frame) page faults: 38019472Voluntary context switches: 2629Involuntary context switches: 523063Swaps: 0File system inputs: 368360File system outputs: 8Socket messages sent: 0Socket messages received: 0Signals delivered: 0Page size (bytes): 4096Exit status: 0

Оптимизация производительности


Процесс оптимизации производительности на всех трех языках был очень разным, и все три сообщества были очень полезны в этом процессе. Но были и общие моменты.
  • Статическая диспетчеризация функций ядра вместо использования полиморфизма. Это означает, что при передаче функции ядра используется параметрический (времени компиляции) полиморфизм, а не динамический (времени исполнения), при котором диспетчеризация с виртуальными функциями влечет за собой накладные расходы.
  • Использование представлений/ссылок, вместо копирования данных в многопоточном режиме, имеет большое значение.
  • Распараллеливание вычислений имеет огромное значение.
  • Знание того, что массив является основным для строки/столбца, и использование этого в вычислениях имеет огромное значение.
  • Проверки границ и оптимизации компилятора дают огромную разницу, особенно в Chapel и D.
  • Включение SIMD в D и Julia внесло свой вклад в производительность. В D это было сделано с помощью флага -mcpu=native, а в Julia это было сделано с помощью макроса @ simd.

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

Код на D изменился очень мало, и большая часть производительности была получена за счет выбора компилятора и его флагов оптимизации. Компилятор LDC богат возможностями оптимизации производительности. Он имеет 8 -O уровней оптимизации, но некоторые из них повторяются. Например, -O, -O3 и -O5 идентичны, а других флагов, влияющих на производительность, бесчисленное множество. В данном случае использовались флаги -O5 --boundscheck=off -ffast-math, представляющие собой агрессивные оптимизации компилятора, проверку границ, и LLVM's fast-math, и -mcpu=native для включения инструкций векторизации.

В Julia макросы в рассмотренных ранее изменениях заметно улучшили производительность, но они не были слишком запутанными. Я попробовал изменить уровень оптимизации -O, но это не улучшило производительность.

Качество жизни


В этом разделе рассматриваются относительные плюсы и минусы, связанные с удобством и простотой использования каждого языка. Люди недооценивают усилия, затрачиваемые на повседневное использование языка; необходима значительная поддержка и инфраструктура, поэтому стоит сравнить различные аспекты каждого языка. Читателям, стремящимся избежать TLDR, следует прокрутить до конца данного раздела до таблицы, в которой сравниваются обсуждаемые здесь особенности языка. Было сделано все возможное, чтобы быть как можно более объективным, но сравнение языков программирования является сложным, предвзятым и спорным, поэтому читайте этот раздел с учетом этого. Некоторые рассматриваемые элементы, такие как массивы, рассматриваются с точки зрения Data Science/технических/научных вычислений, а другие являются более общими.

Интерактивность


Программистам нужен быстрый цикл кодирования/компиляции/результата во время разработки, чтобы быстро наблюдать за результатами и выводами для того, чтобы двигаться вперёд либо вносить необходимые изменения. Интерпретатор Julia самый лучший для этого и предлагает гладкую и многофункциональную разработку, а D близок к этому. Этот цикл кодирования/компиляции/результата может быть медленным даже при компиляции небольшого кода. В D есть три компилятора: стандартный компилятор DMD, LLVM-компилятор LDC и GCC-компилятор GDC. В этом процессе разработки использовались компиляторы DMD и LDC. DMD компилирует очень быстро, что очень удобно для разработки. А LDC отлично справляется с созданием быстрого кода. Компилятор Chapel очень медленный по сравнению с ним. В качестве примера запустим Linux time для компилятора DMD и для Chapel для нашего кода матрицы без оптимизаций. Это дает нам для D:
real0m0.545suser0m0.447ssys0m0.101s

Сравним с Chapel:
real0m5.980suser0m5.787ssys0m0.206s

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

Стоит однако отметить, что при разработке пакетов в Julia время компиляции может быть очень долгим, и пользователи отмечают, что при загрузке нескольких пакетов время компиляции может растягиваться. Поэтому практика цикла разработки в Julia может варьироваться, но в данном конкретном случае процесс был безупречным.

Документация и примеры


Один из способов сравнить документацию на разных языках это сравнить их все с официальной документацией Python, которая является золотым стандартом для языков программирования. Она сочетает примеры с формальными определениями и инструкциями в простом и удобном для пользователя виде. Поскольку многие программисты знакомы с документацией на Python, такой подход даёт представление о том, как они сравнивают.

Документация Julia наиболее близка по качеству к документации на Python и даёт пользователю очень плавный, детальный и относительно безболезненный переход на язык. Она также имеет богатую экосистему блогов, и темы по многим аспектам языка легкодоступны. Официальная документация D не так хороша и может быть сложной и разочаровывающей, однако существует очень хорошая бесплатная книга Программирование на D, которая является отличным введением в язык, но ни одна единичная книга не может охватить язык программирования целиком и не так много исходных текстов примеров для продвинутых тем. Документация Chapel достаточно хороша для того, чтобы сделать что-то, хотя представленные примеры различаются по наличию и качеству. Часто программисту требуется знать, где искать. Хорошая тема для сравнения библиотеки файлового ввода/вывода в Chapel, D и Julia. Библиотека ввода/вывода Chapel содержит слишком мало примеров, но относительно ясна и проста; ввод/вывод D распределён по нескольким модулям, и документации более сложно следовать; документация по вводу/выводу Julia содержит много примеров, и она ясна и проста для понимания.

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

Поддержка многомерных массивов


Массивы здесь относятся не к массивам в стиле С и С++, доступным в D, а к математическим массивам. Julia и Chapel поставляются с поддержкой массивов, а D нет, но у него есть библиотека Мир, которая содержит многомерные массивы (ndslice). В реализации расчета ядра матрицы я написал свой объект матрицы в D, что несложно, если понимать принцип, но это не то, что хочет делать пользователь. Тем не менее, в D есть линейная библиотека алгебры Lubeck, которая обладает впечатляющими характеристиками производительности и интерфейсами со всеми обычными реализациями BLAS. Массивы Julia, безусловно, самые простые и знакомые. Массивы Chapel сложнее для начального уровня, чем массивы Julia, но они спроектированы для запуска на одноядерных, многоядерных системах и компьютерных кластерах с использованием единого или очень похожего кода, что является хорошей уникальной точкой притяжения.

Мощность языка


Поскольку Julia это динамический язык программирования, некоторые могут сказать: Ну, Julia это динамический язык, который гораздо более разрешительный, чем статические языки программирования, поэтому дебаты закончены, но все гораздо сложнее. В статических системах типов есть свое могущество. У Julia есть система типов, похожая по своей природе на системы типов из статических языков, так что вы можете писать код так, как если бы вы использовали статический язык, но вы можете делать вещи, зарезервированные только для динамических языков. Она имеет высокоразвитый синтаксис общего и мета-программирования, а также мощные макросы. Она также имеет очень гибкую объектную систему и множественную диспетчеризацию. Это сочетание возможностей делает Julia самым мощным языком из трех.

D был задуман как замена C++ и взял очень много от C++ (а также заимствовал из Java), но делает шаблонное программирование и вычисления времени компиляции (CTFE) намного более удобными для пользователя, чем в C++. Это язык с одиночной диспетчеризацией (хотя есть пакет с мультиметодами). Вместо макросов в D есть mixin для строк и шаблонов, которые служат аналогичной цели.

Chapel имеет поддержку дженериков и зарождающуюся поддержку для ООП с одиночной диспетчеризацией, в нем нет поддержки макросов, и в этих вопросах он ещё не так зрел, как D или Julia.

Конкурентность и параллельное программирование


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

В модели параллелизма Chapel гораздо больше внимания уделяется параллелизму данных, но есть инструменты для параллелизма задач и предоставляется поддержка параллелизма на основе кластеров.

Julia имеет хорошую поддержку как конкурентности, так и параллелизма.

D имеет промышленно- сильную поддержку конкурентности и параллелизма, хотя его поддержка многопоточности гораздо менее хорошо документирована примерами.

Стандартная библиотека


Насколько хороша стандартная библиотека всех трех языков в целом? Какие задачи она позволяют пользователям легко выполнять? Это сложный вопрос, потому что при этом учитываются качество библиотеки и фактор документирования. Все три языка имеют очень хорошие стандартные библиотеки. В D самая полная стандартная библиотека, но Julia отличная вторая, потом Chapel, но все никогда не бывает так просто. Например, пользователь, желающий написать бинарный ввод/вывод, может найти Julia самой простой для начинающего; она имеет самый простой, понятный интерфейс и документацию, за ней следует Chapel, а затем D. Хотя в моей реализации программы для чтения IDX-файлов, ввод/вывод D был самым быстрым, но зато код Julia было легко написать для случаев, недоступных на двух других языках.

Менеджеры и экосистема пакетов


С точки зрения документации, использования и возможностей, менеджер пакетов D Dub является наиболее полным. D также имеет богатую экосистему пакетов на веб-сайте Dub, зато менеджер пакетов Julia тесно интегрирован с GitHub и является хорошей пакетной системой с хорошей документацией. У Chapel есть менеджер пакетов, но нет высокоразвитой экосистемы.

Интеграция с Cи


Cи- интероперабельность проста в использовании на всех трех языках; Chapel имеет хорошую документацию, но не так популярен, как другие. Документация на языке D лучше, а документация на языке Julia самая полная. Однако, как ни странно, ни в одной документации по языкам нет команд, необходимых для компиляции вашего собственного кода на C и его интеграции с языком, что является недосмотром, особенно когда дело касается новичков. Тем не менее, в D и Julia легко искать и найти примеры процесса компиляции.

Сообщество


Для всех трех языков есть удобные места, где пользователи могут задавать вопросы. Для Chapel, самое простое место это Gitter, для Julia это Discourse (хотя есть и Julia Gitter), а для D это официальный форум сайта. Julia сообщество является наиболее активным, а затем D, а затем Chapel. Я обнаружил, что вы получите хорошие ответы от всех трех сообществ, но вы, вероятно, получите более быстрые ответы по D и Julia.
Chapel D Julia
Компиляция/ Интерактивность Медленная Быстрая Лучшая
Документация & Примеры Детальные Лоскутные Лучшие
Многомерные массивы Да Только родные
(библиотека)
Да
Мощность языка Хорошая Отличная Лучшая
Конкурентность & Параллелизм Отличная Отличная Хорошая
Стандартная библиотека Хорошая Отличная Отличная
Пакетный менеджер & Экосистема Зарождающаяся Лучшая Отличная
Си -Интеграция Отличная Отличная Отличная
Сообщество Маленькое Энергичное Наибольшее
Таблица характеристик качества жизни для Chapel, D & Julia

Резюме


Если вы начинающий программист, пишущий числовые алгоритмы и выполняющий научные вычисления, и хотите быстрого и простого в использовании языка, Julia это ваш лучший выбор. Если вы опытный программист, работающий в той же области, Julia все еще является отличным вариантом. Если вы хотите более традиционный, промышленный, статически скомпилированный, высокопроизводительный язык со всеми свистоперделками, но хотите что-то более продуктивное, безопасное и менее болезненное, чем C++, то D это ваш лучший вариант. Вы можете написать что угодно в D и получить отличную производительность благодаря его компиляторам. Если вам нужно, чтобы вычисления массивов происходили на кластерах, то Chapel, наверное, самое удобное решение.

С точки зрения грубой производительности в этой задаче, D был победителем, явно демонстрируя лучшую производительность в 5 из 9 эталонных задач. Исследование показало, что ярлык Julia как высокопроизводительного языка это нечто большее, чем просто шумиха он обладает собственными достоинствами в сравнении с высококонкурентными языками. Было сложнее, чем ожидалось, получить конкурентоспособную производительность от Chapel команде Chapel потребовалось много исследований, чтобы придумать текущее решение. Тем не менее, по мере того, как язык Chapel взрослеет, мы сможем увидеть дальнейшее улучшение.
Подробнее..

Перевод Алгоритм MADDPG OpenAI

29.06.2020 14:12:48 | Автор: admin
Начинаем неделю с продолжения серии статей, подготовленных специально для базового и продвинутого курсов Математика для Data Science.

В конце статьи, поделимся с вами списком самых интересных материалов по этой теме.




Новый подход


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

  • Нестационарности между независимыми агентами;
  • Экспоненциального роста пространств действий и состояний.


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

Централизованное планирование


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

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

Децентрализованное выполнение


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

OpenAI


Исследователи из OpenAI, Калифорнийского университета в Беркли и Университета Макгилла, представили новый подход к мультиагентным настройкам с помощью Multi-Agent Deep Deterministic Policy Gradient. Такой подход, вдохновленный своим одноагентным аналогом DDPG, использует обучение вида актер-критик и показывает очень многообещающие результаты.

Архитектура


Данная статья предполагает, что вы знакомы с одноагентной версией MADDPG: Deep Deterministic Policy Gradients или DDPG. Чтобы освежить память, вы можете прочитать замечательную статью Криса Юна.

У каждого агента есть пространство наблюдений и непрерывное пространство действий. Также у каждого агента есть три компонента:

  • Сеть актеров, который использует локальные наблюдения для детерминированных действий;
  • Целевая сеть актеров с аналогичным функционалом для стабильного обучения;
  • Сеть критиков, которая использует совместные пары состояние-действие для оценки Q-значений.


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

Помните, что критик может быть общей сетью между всеми N агентами. Другими словами, вместо того чтобы обучать N сетей, которые оценивают одно и то же значение, просто обучите одну сеть и используйте ее, чтобы она помогла обучению всех остальных агентов. То же самое относится и к сетям актеров, если агенты однородные.


Архитектура MADDPG (Lowe, 2018)

Обучение


Во-первых, MADDPG использует воспроизведение опыта (experience replay) для эффективного off-policy обучения. На каждом промежутке времени агент хранит следующий переход:



Где мы храним совместное состояние, следующее совместное состояние, совместное действие и каждое из вознаграждений, полученных агентом. Затем мы берем набор таких переходов из experience replay для обучения нашего агента.

Обновления критика


Для обновления центрального критика агента мы используем lookahead TD-ошибку:



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

Обратите внимание на правую часть выражения с расчетом Q-значения. Несмотря на то, что мы никогда не сохраняем наши следующие совместные действия, мы используем каждого целевого актера агента для вычисления следующего действия во время обновления, чтобы сделать обучение более стабильным. Параметры целевого актера периодически обновляются, чтобы соответствовать параметрам актера агента.

Обновления актеров


Подобно одноагентной DDPG мы используем deterministic policy gradient для обновления каждого параметра актера агента.



Где это актер агента.

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

Выводы из политик и ансамбли политик


Мы можем сделать еще один шаг в вопросе децентрализации. В предыдущих обновлениях мы предполагали, что каждый агент автоматически узнает действия других агентов. Однако, MADDPG предлагает делать выводы из политики других агентов, чтобы сделать обучение еще более независимым. Фактически каждый агент будет добавлять N-1 сетей для оценки истинности политики всех других агентов. Мы используем вероятностную сеть, чтобы максимизировать логарифмическую вероятность вывода наблюдаемого действия другого агента.



Где мы видим функцию потерь для i-ого агента, оценивающего политику j-ого агента с помощью регуляризатора энтропии. В результате, наше целевое Q-значение становится немного другим, когда мы заменяем действия агента своими прогнозируемыми действиями!



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

Ансамбли политик


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

Градиент политики немного изменяется. Мы берем среднее значение по K подполитикам, используем линейность ожидания и распространяем обновления с помощью функции Q-значения.



Вернемся на шаг назад


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

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


Каждый компонент алгоритма служит определенной отдельной цели. Мощным алгоритм MADDPG делает следующее: его компоненты разработаны специально для преодоления серьезных препятствий, которые обычно встают перед мультиагентными системами. Дальше мы поговорим о производительности алгоритма.

Результаты


MADDPG был апробирован во многих средах. Полный обзор его работы можно найти в статье [1]. Здесь мы поговорим только о задаче кооперативной коммуникации.

Обзор среды


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

Сравнение


Для решения этой задачи в статье противопоставляются MADDPG и современные одноагентные методы. С использованием MADDPG видны значительные улучшения.

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

Наконец, ансамбли политик показали очень многообещающие результаты. В статье [1] исследуется влияние ансамблей в конкурентной среде и демонстрируется значительное улучшение производительности по сравнению с агентами с одной политикой.

Заключение


Вот и все. Здесь мы рассмотрели новый подход к мультиагентному обучению с подкреплением. Конечно, существует бесконечное количество методов, относящихся к MARL, однако MADDPG обеспечивает прочный фундамент для методов, которые решают самые глобальные проблемы мультиагентных систем.

Источники


[1] R. Lowe, Y. Wu, A. Tamar, J. Harb, P. Abbeel, I. Mordatch, Multi-Agent Actor-Critic for Mixed Cooperative-Competitive Environments (2018).



Список полезных статей






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


Подробнее..

Avito Analytics meetup

18.06.2020 14:14:33 | Автор: admin

Привет, Хабр! 30 июня в18:00 поМоскве мы проведём онлайн-митап дляаналитиков. Спикеры расскажут прорегиональные A/B-тесты, управление выдачей товаров винтернет-магазине, предсказание профита отновых фичей и data science вдоставке товаров.


Подкатом, как и всегда, тезисы докладов и все нужные ссылки.



Доклады


Региональные A/B-тесты. Зачем нужны и как устроены Игорь Красовский, Авито


image


Что делать, если тестовая группа вA/B-тесте точно неизвестна, а воздействие напользователя производится оффлайн, например, врегиональной ТВ-рекламе? Как сформировать контрольную группу длясмещённой тестовой? Как измерить эффект и отличить его отслучайной ошибки? Расскажу, как мы ответили наэти вопросы вАвито и скакими проблемами столкнулись.

О спикере: ВАвито чуть более 2лет, доэтого успел поработать вeCommerce и IT-консалтинге. Сейчас работаю вкоманде Core Analytics, которая отвечает затакие направления как Data Management, Strategic Analytics, Core Analytics Platform, Key Account Analytics.



Лучшие data-продукты рождаются вполях Марина Калабина, Леруа Мерлен


image


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

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

О спикере: 9лет работы вЛеруа Мерлен. Сначала открывала магазины, потом вних работала, а сейчас навожу порядок втоварных запасах. Собрала команду и запустила data-продукт за6недель.



Модель роста предсказываем профит от фич для приоритизации Павел Михайлов, Ostrovok.ru


image


  • Строим модель роста фреймворк наоснове когорт и ключевых метрик, который среднесрочно моделирует выручку.
  • Переводим продуктовые и бизнесовые метрики вденьги спомощью модели.
  • Оцениваем потенциальный профит отфичей напримерах.


О спикере: Head of growth вEmerging Travel Group (Ostrovok.ru) саналитическим бэкграундом. Генерирую, разрабатываю и тестирую гипотезы роста.



Как data science Авито Доставке помогал Дима Сергеев, Авито


image


Или история отом, как перестать предлагать пользователям купить Кабину Камаза сДоставкой. НаАвито уже более 60млн. товаров. Не для каждого изних удаётся слёгкостью определить, сможет ли продавец положить его вкоробку размером 1208050 и отправить покупателю вдругой город.

Временами мы такие ошибки допускаем: предлагаем доставку там, где её быть заведомо не должно и наоборот. Расскажу немного отом, как мы сэтой проблемой справляемся и каких результатов получилось достичь.

О спикере: Последний год занимаюсь аналитикой вАвито Доставке. Доэтого на протяжении трёх лет занимался аналитикой вOZON.



Задавайте вопросы вчате трансляции насамые интересные ответим вэфире. После каждого доклада можно будет отдельно пообщаться соспикером.


Пароли и явки


Трансляция нанашем ютуб-канале стартует вовторник 30июня в18:00. Планируем закончить к20:40. Натрансляции можно сразу нажать кнопку напомнить, чтобы ничего не пропустить.


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


Увидимся в онлайне!

Подробнее..

Материалы с митапа для аналитиков модель роста, AB-тесты, управление стоком и доставкой товаров

03.07.2020 12:17:33 | Автор: admin

Хабр, привет! Впоследний день июня прошёл наш митап дляаналитиков. Нанём выступали спикеры изЛеруа Мерлен, Ostrovok.ru и, конечно же, Авито. Обсуждали региональные A/B-тесты, управление выдачей товаров вбольшом интернет-магазине, предсказание профита отновых фичей и data science вдоставке.


Под катом видеозаписи выступлений стаймкодами и ссылки напрезентации.



Региональные A/B-тесты. Зачем нужны и как устроены Игорь Красовский, Авито


На примере задач изАвито Игорь рассказал, что такое региональные А/В-тесты, когда они нужны аналитику, какие алгоритмы и математика лежат вих основе и как измерить точность этих алгоритмов.



00:00 Представление спикера и темы
00:44 Длякаких задач можно применять региональные A/B-тесты
04:21 Омодели региональных А/B-тестов: этапы проведения теста, метрика близости контрольной и тестовой групп
09:51 Алгоритм подбора тестовой группы и оценка его точности
18:03 Что можно улучшить впредложенном процессе: точки роста


Посмотреть презентацию Игоря

Модель роста предсказываем профит отфич дляприоритизации Павел Михайлов, Ostrovok.ru


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


Скачать эксельку спримером модели роста.



00:00 Представление спикера и темы
01:10 Фреймворк ICE (impact, confidence, ease)
02:26 Что такое модель роста и как с её помощью измерить влияние фичи
05:55 Как построить простую модель роста снуля
18:55 Примеры гипотез, которые можно оценить спомощью модели роста
25:22 Как можно улучшать базовую модель и зачем вообще этим заниматься


Посмотреть презентацию Павла

Лучшие data-продукты рождаются вполях Марина Калабина, Леруа Мерлен


Большая часть интернет-заказов вЛеруа Мерлен собираются вторговых залах магазинов. Из-завысокой скорости оборота товаров это нередко приводило ктому, что заказ не получалось собрать. Тогда команда Data Accelerator придумала инструмент, который позволил автоматически находить проблемные артикулы и корректировать их количество передпубликацией насайте.



00:00 Представление спикера и темы
01:37 Леруаизмы термины длялучшего погружения вконтекст доклада
02:40 Как собирают заказы изинтернет-магазина, и какие проблемы могут возникнуть усборщика
04:07 Запуск подразделения Data Accelerator, чтобы принимать data-driven решения
04:46 Продукт гарантированный сток: его цели и процесс реализации
13:34 Итоги внедрения гарантированного стока


Посмотреть презентацию Марины

Как data science Авито Доставке помогал Дима Сергеев, Авито


Ежедневно наАвито продаётся несколько миллионов самых разных товаров. Не длякаждого изних можно слёгкостью определить, сможет ли продавец положить его вкоробку размером 1208050 и отправить покупателю. Временами мы такие ошибки допускаем и предлагаем доставку там, где её быть заведомо не должно и наоборот. Дима рассказал отом, как мы сэтой проблемой справляемся и каких результатов получилось достичь.



00:00 Представление спикера и темы
01:11 История появления доставки вАвито и первые проблемы
06:32 Оценка масштабов неправильного определения возможности доставить товар
11:29 Классификация товаров как способ решить проблему: data science SWAT спешит напомощь
17:44 Первые успехи и побочные эффекты
25:47 Ближайшие планы


Посмотреть презентацию Димы

До встречи на новых митапах!

Подробнее..

Перевод - recovery mode Что должен знать Data Scientist про когнитивные искажения ИИ

25.06.2020 16:23:50 | Автор: admin
image

Проблема когнитивных искажений ИИ возникает на уровне определения, но дело не только в термине. искажение это перегруженный термин, смысл которого может изменяться в зависимости от контекста.

Так, вашему вниманию могут быть представлены следующие примеры определения отклонений:

  • В статистике: искажение (bias) это разница между ожиданием оцениваемой величины и ее значением. Такое определение жутко формально, так что позвольте мне его перевести. Искажение описывает результаты, которые систематически не соответствуют ожиданиям. Представьте себе стрельбу из лука, у которого сбит прицел. Высокий уровень искажения не означает, что вы стреляете куда угодно (в этом случае речь идет о дисперсии), суть будет заключаться в том, что даже идеальный лучник будет постоянно промахиваться. В данном контексте слово искажение несет в себе небольшой эмоциональный оттенок.
  • В сборе данных (а также в статистике): когда вы собираете данные, ваша выборка может не являться репрезентативной для интересующей вас совокупности. Искажение выборки в данном случае формальный термин. Такое искажение означает, что ваши статистические результаты могут содержать ошибки.
  • В когнитивной психологии: систематическое искажение от рационального. Каждое слово в этом содержательном определении, кроме от, заряжено нюансами, специфическими для данной области. Перевод на понятный язык: речь идет об удивительном факте, заключающемся в том, что ваш мозг развил определенные способы реакции на различные объекты, и психологи изначально сочли эти реакции искажениями. Список когнитивных искажений поражает.
  • В нейросетевых алгоритмах: По сути, речь идет об отрезке, отсекаемом с координатной оси. (искажение звучит круче, чем школьные математические термины, да?)
  • В социальных и физических науках: Любое из множества явлений, связанных с чрезмерным влиянием прошлых/актуальных условий на решения, принимаемые в настоящее время. Примерами также являются культурные предрассудки и инфраструктурная предвзятость.
  • В электронике: Фиксированное постоянное напряжение или ток, приложенные в цепи с переменным током.
  • В географии: Биас, в Западной Вирджинии. (от англ. Bias) (Я слышал, что Биас есть и в Франции).
  • В мифологии: Любой из этих древних греков.
  • О чем думает большинство экспертов по ИИ: речь об алгоритмических искажение идет тогда, когда компьютерная система отражает подсознательные ценности человека, который ее создал (разве не все, что создают люди, отражает подсознательные ценности?).
  • О чем думает большинство людей? О том, что наш опыт искажает наше восприятие и реакцию на информацию, особенно в контексте несправедливого отношения к другим людям и плохих поступков вообще. Некоторые люди используют это слово как синоним предрассудков.


Ох. У термина искажение много значений, и некоторые из них более острые, чем другие.

О чем идет речь в области машинного обучения и ИИ?


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

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

Весь смысл ИИ в том, чтобы дать вам возможность объяснить свои пожелания компьютеру на примерах (данных!), а не в инструкциях. Каких примерах? Это ваш выбор в качестве учителя. Датасеты это учебники, по которым ваш ученик может учиться. И знаете что? У учебников есть авторы-люди, как и у наборов данных.

Учебники отражают предвзятость их авторов. Как и у учебников, у наборов данных есть авторы. Они собираются в соответствии с инструкциями, сделанными людьми.


Представьте себе попытку обучить человека по учебнику, написанному предвзятым автором вас удивит, если ученик в конце концов выразит некоторые из тех же предвзятых представлений? Чья это вина?

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

Искажения исходят не от алгоритмов ИИ, они исходят от людей.


Алгоритмы никогда не думают самостоятельно. На самом деле, они совсем не думают (они инструменты), поэтому мы, люди, должны думать за них. Если вы хотите узнать, что можно сделать с отклонениями в ИИ и углубиться в эту кроличью нору вот вход.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Тренды в Data Scienсe 2020

26.06.2020 18:17:05 | Автор: admin
image

Google Trends по запросу data science

Краткое изложение


  • По нашим оценкам, вакансии в advanced analytics насчитывают почти 1 миллион человек во всем мире, 291 тысяча из них в США.
  • За последние два года дефицит работ в области data science значительно сократился были наняты около 800 тысяч специалистов, однако на данный момент десятки вакансий так и остаются нетронутыми, причем подавляющее большинство из них в США.
  • Самый большой спрос на рабочих в области advanced analytics в области залива Сан- Франциско с самыми высокими зарплатами и самым большим количеством вакансий, за ней следуют крупные городские центры вроде Нью-Йорка, Бостона, Вашингтона и Сиэтла.
  • Средняя заработная плата по стране у data scientists остается выше $100,000 эта тенденция просматривается почти во всех штатах, удовлетворенность работой и престиж также остаются на высоком уровне.
  • Для подготовки специалистов в advanced analytics было создано больше ста образовательных программ.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:




Вступление


Вот уже последние несколько лет data science является одним из самых ярких трендов в бизнесе. В 2012 году Harvard Business Review назвали работу data scientists самой сексуальной работой 21-го века. Многочисленные отчеты (1, 2, 3, 4) писали, что мир сталкивается с огромным дефицитом data scientists. Создавались буткемпы и университетские программы, чтобы решить вопросы, связанные с огромным спросом на навыки в этой области.

К advanced analytics мы относим всех, кто сам относит себя к data scientist, специалистам по машинному обучению или ИИ-исследователю.

Спрос и предложение data scientists май 2020


Общее число рабочих в области advanced analytics



На сегодняшний день в мире насчитывается чуть менее одного миллиона рабочих в области advanced analytics (см. раздел методологии ниже), из которых 290 тысяч или же примерно 30% приходится на Соединенные Штаты Америки. На данный момент численность data scientists значительно превосходит численность инженеров по машинному обучению и исследователей ИИ как в США, так и во всем мире, однако и инженеры, и исследователи являются новыми на рынке труда и в будущем могут значительно вырасти.

image

Сравнение общего числа продвинутых аналитиков в мире в разбивке по должности, май 2020 г.

Открытые и дефицитные вакансии


На сегодняшний день на LinkedIn открыты около 86 тысяч вакансий в сфере advanced analytics, большая часть (53.4 тысячи) приходится на США. Интересно отметить, что США представляет собой непропорционально большое число открытых вакансий (62%) по сравнению с долей рабочих в advanced analytics во всем мире (30%), хоть это и можно списать на ложную методологию сбора данных (см. раздел методологии ниже).

image

Количество открытых ролей advanced analytics по сравнению с общим числом профессиональных сотрудников advanced analytics

Мы можем использовать число открытых вакансий (по сравнению с количеством имеющихся сотрудников) в качестве приблизительного показателя, чтобы понять сколько всего работников недостает. Из приведенного ниже графика видно, что открытых вакансий по всему миру на 9% больше, чем непосредственно сотрудников, в то время как в США это число достигает примерно 18.7%.


Сокращение дефицита


Сегодня в США насчитывают примерно 53 тысячи свободных рабочих мест в области advanced analytics. Однако, в августе 2018 года LinkedIn опубликовал отчет на тот момент дефицит составлял около 151 тысячи рабочих мест. За последние два года дефицит значительно сократился по всему миру была нанята примерно 831 тысяча профессионалов в области advanced analytics (см. ниже).

image

Apteo оценивает общее количество продвинутых аналитиков с течением времени

image

Дефицит продвинутых аналитиков в 2018 году по сравнению с 2020 годом

Распределение открытых вакансий и недостаток рабочих по городам США


Общее число специалистов и вакансий


Никого не удивит, что наибольшая часть работников в advanced analytics находятся в районе залива Сан-Франциско примерно 45.7 тысяч человек, как и наибольшее количество открытых вакансий около 8 тысяч. На втором месте идет Нью-Йоркская агломерация около 38.8 тысяч сотрудников и 5.9 тысяч вакансий. На третьем месте район Большого Бостона 15.9 тысяч сотрудников и 3.3 тысячи вакансий.

Самая высокая доля на душу населения


На первом месте район залива Сан-Франциско 5.9 тысячи человек на миллион. На втором месте идет Сиэтл 4.3 тысячи на миллион, завершает Бостон 3.2 тысячи на миллион.

Наибольшая нехватка рабочей силы


Наибольший процент (39.2%) открытых вакансий в городе Вашингтон.

image

Расширенная аналитика сотрудников и вакансий по городам

image

Заработная плата и удовлетворенность работой в США



Заработная плата в этой сфере варьируется по всей Америке. Основываясь на данных из различных источников, мы подсчитали, что средняя зарплата специалистов достигает примерно $114,000 в год, что соответствует примерно $14,000 в районе залива Сан-Франциско.

В 2020 году работа в data science заняла третье место по Америке по версии Glassdoor (сразу после Front End Engineer и Java Developer). С 2016 по 2019 года data scientists занимали первое место.

image

Образовательные программы и требуемые навыки


Для удовлетворения потребностей в бизнесе появилось множество новых образовательных программ. На данный момент существует как минимум 79 буткемпов, 62 программы бакалавриата и 111 магистерских программ, ориентированных на data science. Ниже мы перечислим наиболее упоминаемые программные средства и навыки для специалистов в области advanced analytics

Top Tools


  • Python
  • SQL
  • R
  • Spark
  • Cloud
  • AWS
  • Java
  • Tensorflow


Top Skills


  • Machine Learning / Regression
  • Statistics
  • Research
  • Prediction
  • Visualization
  • Recommendation
  • Optimization
  • Deep Learning
  • Natural Language Processing


image

Образовательные программы

Вывод


Очевидно, что data science продолжает быть крайне востребованной и на сегодняшний день. В то время как мир, судя по всему, быстро удовлетворяет этот спрос, по-прежнему существует острая нехватка рабочих в области advanced analytics. Интересно то, что возникают и новые должности типа инженера по машинному обучению (machine learning engineer) или ИИ-исследователя (A.I. researcher), и вполне вероятно, что для них потребуются дополнительные сотрудники, поскольку все больше компаний работают над внутренним продвижением data science.

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

Методология


Расчет занятости и дефицита


Для идентификации data scientists и открытых вакансий в data science, мы провели поиск по ключевым словам на LinkedIn по трем наиболее распространенным названиям вакансий, которые мы ассоциируем с математической, инженерной и аналитической работой, в которой, по нашему мнению, и заключается работа data scientist при помощи премиум аккаунта генерального директора и соучредителя Apteo Шанифа Дханани. Названия вакансий следующие data scientist, инженер по машинному обучению и исследователь искусственного интеллекта.

Data scientist и инженер по машинному обучению также могут быть связаны с такими ключевыми словами как data science и инженер МО, поэтому для предотвращения двойного подсчета мы использовали бинарный поиск искали ровно один термин за раз, исключая все остальные термины. Например, мы соединили результаты из следующих двух запросов для поиска data scientists:

data science -data scientist -machine learning engineer -ml engineer -ai researcher and data scientist -data science -machine learning engineer -ml engineer -ai researcher

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

Источники информации:

  • Данные поиска работ на LinkedIn, полученные 1-го мая 2020 года.
  • Google (численность населения)



Расчет заработной платы


Единого правдивого источника для расчета заработной платы просто не существует. Правительство США, рекрутинговые компании и независимые отчеты публикуют разные значения о заработной плате advanced analytics. Для наших отчетов мы собрали как можно больше независимых значений как на государственном, так и на национальном уровне и использовали среднее значение.

Источники информации:




Рост занятости


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

Источники информации:




Образовательные программы и требуемые навыки



Следует снова проговорить, что было сложно оценить образовательные программы. В каждом университете свое название для программы по data science, поэтому нам приходилось субъективно определять, какие программы включать в список, а какие исключать из него. Мы попытались отобрать те программы, основанные на математической строгости, вычислительной работе и аналитике. Мы исследовали различные отчеты и агрегаторы для сбора данных по университетским программам, а также различные буткемпы для определения суммарных показателей для 2020-го года.

Источники информации:


Читать еще


Подробнее..

Перевод Крутые Data Scientist не тратят время на статистику

17.06.2020 14:20:13 | Автор: admin
image

Недавно я узнала, что один мой хороший друг получил докторскую степень по статистике, при этом он даже никогда не думал над вопросом: а какой собственно прок от статистики? О боже. Если не знаешь для чего, тогда и не знаешь нужно ли оно тебе. И раз профессорам это не очевидно, посмотрим, что смогу сделать я.

Статистика это наука о том, как принимать решения в условиях неопределенности. Как вы можете думать? Следовать стандартным действиям или идти по пути априорных убеждений. Но что делать, если ваш разум не определился? Что если у вас еще не сложилось на этот счет никакого мнения?

Просто руководствуйтесь своими предположениями (это такой причудливый способ сказать, что лучшая догадка строится на ваших знаниях). Как это сделать? Посмотрите на данные, и скажите, что там. Это называется аналитикой (или data-mining), а если вам когда-нибудь доводилось пользоваться электронными таблицами, то вы наверняка уже ответили на вопрос. Дело в том, что ваше чутье поможет сделать правильную оценку и, соответственно, выбор. Поэтому всякая необходимость в сложных математических расчетах попросту отпадает.

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

Так что, сколько бы данных у вас не было, просто следуйте своей интуиции.

Подождите, но мне нужно знать, достаточно ли у меня данных? Правда? А достаточно для чего?

Притормозите на минуточку и представьте, что вы выбираете между голубой и оранжевой шляпами. Если вам на самом деле все равно, какой будет цвет, а данные складываются в пользу оранжевого экземпляра, то, взяв в итоге голубую шляпу, вы будете выглядеть как полный безумец. Даже если набралось всего 3 пункта. Да даже если за оранжевую говорит всего 0.0000000000001%. С какого перепугу тогда голубая?! Берите оранжевую шляпу и не мучайтесь больше с математикой.

image

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

Единственный вариант, почему бы вы в итоге взяли голубую шляпу она изначально нравилась вам больше.Тогда вы могли поинтересоваться, насколько сильны аргументы в пользу оранжевой. Другими словами, достаточно ли данных, чтобы изменить решение. Что ж, ну как вам сказать? Добро пожаловать в статистику.

image

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

Статистика это наука о том, как менять свои решения.


Итак, если вы столкнулись с неопределенностью (к примеру, Будет ли эта система машинного обучения работать с данными, полученными завтра?) и варианты решения не равнозначны (например, Нам, вероятно не следует запускать ее, если она не работает), тогда вы пришли в правильное место: статистика вам пригодится. Ознакомьтесь с ее идеями подробнее здесь. Всем остальным советую бросить это дело и перестать скрупулезно перебирать кучу цифр тем более, что это бестолку. Вам лучше заняться аналитикой.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Как стать Data Scientist без онлайн-курсов

17.06.2020 14:20:13 | Автор: admin
image

Это всего лишь мое мнение. Если у вас есть контраргументы, пожалуйста, напишите их в комментариях.

Хотите стать data scientists?

Я познакомился с более 50-ю data scientists и с еще парочкой поработал лично.

Здесь я расскажу, как эти люди пришли в Data Science. Без онлайн-курсов.

1. Решите задачу с помощью машинного обучения


Выберите реальную проблему, и решите ее с помощью машинного обучения.

Сделать это нелегко, так как нет готового плана действий. Но вне зависимости, преуспеете вы в этом деле или нет, благодаря полученному опыту и истории, впоследствии вы сможете продать себя гораздо дороже.

Вот примеры задач, которые вы можете попробовать разрешить:

  • Распознавание фейковых новостей
  • Прогнозирование стоимости жилья в вашем районе
  • Подбор домашних питомцев в зависимости от образа жизни потенциальных хозяев

Если ваш решатель заработает (или даже почти сработает), создайте пользовательский интерфейс, которым можно будет пользоваться, и опубликуйте его на Hacker News или Product Hunt.

Добавьте строку с названием Data Scientist в резюме. Если получилось решить проблему машинного обучения, никому и дела не будет, что это было всего лишь шоу одного актера.

Теперь вам есть, что рассказать на собеседовании, и такая история будет иметь гораздо больший вес, нежели сертификат об окончании онлайн курсов.

2. Найдите ментора эксперта по искусственному интеллекту


Наладьте отношения с опытным человеком, который может подсказать решения на основе ИИ для проблем, над которыми вы сейчас трудитесь.

Именно так мне удалось ворваться в науку о данных.

Будучи инженером-программистом, стартап-акселератор выделил моей компании PhD проект в области ИИ на несколько часов в неделю.

Каждую неделю мы обсуждали проблемы и возможные пути их решения, я пробовал их реализовать, затем мы анализировали сбои и повторяли снова. После 6 месяцев работы нам удалось решить несколько проблем, полученные знания стали бесценным опытом.

Чтобы найти новых менторов по науке о данных, я делал следующее.

  • Писал в LinkedIn исследователям данных в своем городе
  • Приглашал их выпить кофе
  • Заводил разговор о конкретной проблеме, рассказывал, как хотел бы ее решить и слушал на этот счет мнение собеседника
  • Далее продолжал работу с полученными результатами

3. Пройдите стажировку по машинному обучению


Устройтесь на временную работу с небольшой заработной платой, но возможностью поучаствовать в серьезном проекте по внедрению ИИ.

Бывший стажер-разработчик по машинному обучения в моем стартапе сейчас стажируется как дата-инженер в Facebook, и вероятно скоро станет их полноценным сотрудником.

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

Крайне важно, чтобы в вашем резюме было упоминание о работе с ИИ.

4. Начните заниматься Data Scienсe уже на вашей нынешней работе


Выясните, как компания, в которой вы сейчас работаете, может воспользоваться ИИ для решения проблемы и решите ее.

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

Если вы работаете в небольшой компании, никто не будет возражать, что вы стараетесь привнести больше пользы. Если ваш проект окажется действительно ценным, вполне вероятно, что вам добавят его в повседневные обязанности.

Позже внесите этот проект в свое резюме и попробуйте обновить название должности.

5. Организуйте буткемп по Data Science


Посетите платный буткемп по Data Science.

Это стоит денег, и не все буткемпы одинаковы, но я знаю, по крайней мере, 10 человек, которые пришли в Data Science после буткемпа, и у всех крупные, уважаемые компании.

Лучшие буткемпы принимают только докторов наук, поэтому вполне возможно, что успех кандидата зависит от предвзятого отношения (буткемпы принимают студентов, которые, по их мнению, в любом случае достигнут высот).

В чем польза буткемпов.

  • Участники занимаются консалтингом реальных компаний
  • Выпускники общаются с компаниями, которые ищут сотрудников
  • Есть профессиональная подготовка

Тем не менее, не каждый выпускник получает работу.

6. Сначала станьте программным инженером


Я писал об этом здесь.

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

Набравшись опыта как программный инженер, начните искать работу в области науки о данных, для которой понадобятся те же технические особенности (та же база данных, язык, фреймворк, пакеты программ).

Если вам удастся поставить галочку у большинства требований к кандидату, ваши шансы пройти собеседование успешно значительно возрастут.

Есть и другие плюсы в том, чтобы сначала стать программным инженером.

  • Обеспечить достойный заработок
  • Поработать в компаниях, которые нанимают исследователей данных
  • Создать универсальное техническое прошлое
  • Доказать, что вы можете заниматься подобным типом работ


7. Прежде чем устроиться на работу, получите степень доктора наук или магистра


У вас есть 2 года или 6 лет, чтобы отучиться? У меня лично нет.

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

Они либо:

  • получили степень магистра в области, связанной с ИИ
  • защитили кандидатскую ( PhD) в технической области (не обязательно близкой к ИИ)

Я бы не посоветовал возвращаться в школу(универ), чтобы заняться Data Science. Но если сейчас вы учитесь в какой-то школе, вы можете продолжить свое обучение и получить степень в области ИИ. Как ни странно, но самые высокие зарплаты в сфере ИИ получают люди с высшим образованием.

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

А что там с онлайн-курсами?


Да, онлайн курсы имеют место БТЬ. Но не для того, чтобы получить работу.

Плюсы курсов в том, что вы изучаете то, в чем у вас пробел и подробно разбираете конкретные методы.

Но с другой стороны, курсы дарят ощущение выполненного долга, не заставляя вас идти по пути наибольшего сопротивления.

Я бы лучше сначала нашел проблему, а затем научился ее решать, пройдя онлайн курсы.

У вас есть примеры того, как люди пришли в Data Science? Давайте обсудим.

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Data Science умерла. Да здравствует Business Science

27.06.2020 22:14:45 | Автор: admin

5 полезных уроков от скромного лосося



image

Три волны развития искусственного интеллекта согласно Evo Pricing, основано на исследованиях DHL.

Данные ненадежный друг, и с трудом что-то о них можно назвать научным. Что же делать с наукой о данных?

За последние 5 лет я провел собеседования с более чем 1000 кандидатами на должность аналитиков данных, желающих работать в Evo Pricing. В процессе я узнал, что то, как в СМИ изображают данную профессию, в корне неверно; мы не просто подставляем данные в уже готовые алгоритмы.

Назрела необходимость коренным образом переосмыслить наше представление о науке о данных.

70 лет истории в двух параграфах и одной картинке


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

Поскольку стоимость хранения и обработки данных снизилась, объем данных вырос: здесь работает простой закон спроса и предложения, или, можно сказать, эластичность спроса по цене данных. Снижается цена растет объем. Соответственно, со всей этой информацией кто-то что-то должен делать. Так и появилась наука о данных.

Распространенные заблуждения о науке о данных


image

Что такое Data Science?

По мнению Калифорнийского университета Беркли, эта наука один из самых перспективных карьерных путей для квалифицированных специалистов.

По моему мнению, название Data Science предполагает особый подход к решению определенных проблем. Вот есть определенные данные; а что нам с ними делать, что угодно?
На самом деле, вложить огромную сумму денег в какие-то данные, из которых, может быть, однажды получится что-то полезное, звучит не очень оптимально как с точки зрения карьерного роста, так и с точки зрения бизнес-стратегии. К сожалению, промышленная революция XIX века оставила нам в наследство школы и университеты для обучения большого числа рабочих, способных только давать однообразные ответы на стандартные вопросы; и с тех пор мало что изменилось.

А что будет, если мы научим людей задавать правильные вопросы, а машины находить ответы?


Data Science может стать карьерным тупиком


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

Обещания зарплаты в размере более 80 тысяч долларов в год могут показаться заманчивыми, однако все не так просто, как кажется. Чтобы по-настоящему преуспеть в работе с данными, нужно преуспеть в решении конкретных, значимых и четко определенных проблем, а не становиться универсальным экспертом в области данных или, что еще хуже, в науке, которая, как показывает изображение в начале статьи, достаточно устарела с академической точки зрения.

Данные и алгоритмы мощные инструменты. Но, как и любой инструмент, их результативность зависит от того, как хорош тот, кто ими пользуется.

Желайте добиться успеха развивайте Business Science


Как стать успешным, работая с данными? Сосредоточьтесь на проблеме, которую надо решить, а не на данных как таковых.

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

  • бизнес-проблема должна быть определена, изучена и решена;
  • исследование должно быть выполнено с научной точки зрения;
  • влияние на бизнес: измеримый, объективный результат;


Для некоммерческих вариантов работы с данными логика, тем не менее, аналогичная: начните с вопроса/гипотезы, придерживайтесь строгой методологии, потом вернитесь к изучаемому аспекту/вопросу и определите, было ли доказано влияние данных на бизнес или нет. И так по новой.

Возникает вопрос: как это все сделать? Это мы можем объяснить, используя довольно забавную аналогию.

Урок от лосося 1: начинайте с конца



image

Скромный лосось не только вкусный, но и за свои 5-10 лет жизни успевает сделать много правильных, логичных вещей: жизнь его начинается с конца (в устье реки), а потом возвращается к началу (истоку), где происходит нерест, после чего он покидает реку, уступая место новому поколению лососей.

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

Среднестатистическому аналитику данных есть чему поучиться у скромного лосося. Как бы ни было комфортно (и интеллектуально застойно) плыть по течению к новому объему данных, такая простая, детская стратегия не приведет к успеху в долгосрочной перспективе.

Зрелый лосось начнет двигаться вниз по течению, пристально высматривая ту цель (реку), которую он хочет достичь и на которую хочет повлиять, после чего решает медленно и мучительно двигаться вверх по течению, постепенно сужая объем данных (воды), через которую ему надо пробиться.

Урок от лосося 2: не подплывайте близко к водопаду


Я проработал консультантом по вопросам управления в McKinsey & Company 10 лет. За время пребывания в должности я строго следовал традиционной каскадной модели работы она же модель Водопад: всегда начинал работу с того, что инвестировал в проект огромное количество времени, сил и клиентского бюджета. Исследовал все максимально подробно. Грубо говоря, кипятил океан и, в процессе, убивал бедных лососей!

image

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

Данная стратегия может подходить для высоко стратегических, долгосрочных планов, но при этом не дает никаких гарантий клиенту, что завтра, а потом и через год все так же будет идти по плану, особенно в мире, который развивается все быстрее, сложнее и хаотичнее. Мой начальник, Роберт Даймонд, любит говорить так: бизнес это фильм, а не статичная картинка.

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

В конце концов, именно для этого и появилась гибкая методология разработки. Чтобы допускать дополнительные корректировки.

Урок от лосося 3: принцип 80/20 поможет избежать медведей


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

image

Берегись медведя. Фото: Прыжок смерти, Питер Шталь.

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

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

Перфекционизм главный враг Business Scientistа

Перфекционизм та черта, которая превращает жизнь в сплошной табель об успеваемости. Это может послужить причиной несчастного существования человека.


Вода (данные) может быстро стать укрытием для медведя, поджидающего свою добычу. Идеальная для плавания и жизни, она внезапно может стать и погибелью. Чтобы этого избежать, нам нужен другой, более прагматичный подход.

Наше спасение принцип 80/20 сосредоточивается на том, что действительно важно, и позволяет обойти препятствия, а не идти напролом. Поплавайте вокруг и поищите способы, которые могут помочь избежать медведей. Крайние, пограничные случаи практически не оказывают влияние на бизнес! Тогда зачем напрягаться?

Урок от лосося 4: чем меньше (данных), тем лучше (информация)


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

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

Работа на основе данных должна осуществляться снизу вверх, но эффективная коммуникация сверху вниз.


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

Не нужно создавать навороченную визуализацию, которая настолько динамична и запутанна, что понятна только технарям. Наоборот, формулировку надо максимально упростить. Тратьте МЕНЬШЕ времени на данные и БОЛЬШЕ на планирование обсуждения.

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

Урок от лосося 5: доказательство налицо


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

Только читав о спутниковой навигации, Вы не научитесь ею пользоваться.


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

Поэтому рекомендую начать с таких EOL-дел, как переупорядочение (для производственно-сбытовых цепочек) и уценки (в случае ценообразования). И я прекрасно понимаю, что лучшая уценка это та, которую Вы ВООБЩЕ не предлагаете, потому что все было с самого начала грамотно спланировано. Но насколько бы было проблемно нарушить планирование, предварительно не завоевав сердца и умы клиентов осязаемыми фактами?

Будь Business Scientistом, а деньги приложатся


Что скорее окупится: пойти, как и все остальные, изучить методы и техники науки о данных, или вложиться в изучение бизнес-приложений, где воздействие данных превосходит интуицию?
Сначала найдите свою нишу и забудьте о машинном обучении до тех пор, пока не появится захватывающая проблема, которую Вы захотите решить. После того, как я ушел из McKinsey, я за день выучил R, чтобы приступить к реализации своей идеи в сфере науки о бизнесе. Но хорошо ли я понимал, что я хотел делать?

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

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

Это философия жизни.

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

Хорошего плавания!

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Перевод Самое грустное уравнение в Data Science

29.06.2020 18:10:05 | Автор: admin
image
Запаситесь носовыми платочками! Сейчас я расскажу вам всю правду о статистике и data science. У вас слезы на глаза навернутся, я вам обещаю.

ВВОД = ДАННЕ + ПРЕДПОЛОЖЕНИЯ. Другими словами, статистика не дает вам правду.

Распространенные мифы


Часто можно услышать следующие ошибочные представления:
  • Если я найду правильные уравнения, я смогу узнать то, что сейчас никому неизвестно.
  • Если я добавлю математики в свои данные, я смогу уменьшить неопределенность.
  • Статистика может превращать данные в правду!


Все это звучит как сказки, не так ли? Потому что это они и есть.

Горькая правда


Нет в мире такой магии, которая поможет вам сотворить что-то из ничего. Забудьте об этом. Статистика о другом. Поверьте мне на слово, как статистику. (В качестве бонуса эта статья сэкономит вам кучу времени, которое вы бы потратили, преследуя эту несбыточную мечту.)

К сожалению, многие шарлатаны будут пытаться убедить вас в обратном. Они будут использовать стандартный прием, Ты не знаешь уравнений, которыми я тебя закидал, поэтому признай мое преимущество и делай как я скажу!

Не ведитесь на слова этих позеров.

Не повторяйте судьбу Икара


Думайте о статистических выводах (если коротко, о статистике) как о прыжке от того, что мы знаем (наших обычных данных) к тому, что не знаем (нашему параметру генеральной совокупности).

В статистике то, что вы знаете это не то же самое, что вы хотели бы знать

Может вы и хотите фактов о завтрашнем дне, но вы можете делать выводы только на основе вчерашнего. (Так раздражает, когда мы не помним будущее, правда?) Может вы хотите знать, что все ваши потенциальные пользователи думают о вашем продукте, но опросить вы можете лишь сотню. Тогда вы получаете неопределенность!

Это не магия, это предположения


Как вообще можно перескочить от того, что вы знаете к тому чего не знаете? Вам нужен мост, чтобы преодолеть эту пропасть. И название этому мосту предположения. Напомню вам о самом болезненном уравнении в data science: ДАННЕ + ПРЕДПОЛОЖЕНИЯ = ПРОГНОЗИРОВАНИЕ.

ДАННЕ + ПРЕДПОЛОЖЕНИЯ = ПРОГНОЗИРОВАНИЕ.

(Слово прогнозирование(prediction) спокойно можете заменить на выводы или прогнозы, если вам так удобней. Все это об одном и том же: утверждение о чем-то, что вы не знаете наверняка.)

Что такое предположение(assumption)?


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

Предположения это уродливые пластыри, которые вы накладываете в тех местах, где нет информации.


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

Статистика это ваша попытка делать все, что в ваших силах, в мире неопределенности.

Предположения и в Африке предположения. Они не превратятся в факты по взмаху волшебной палочки.

Предположения это часть принятия решений


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

Примеры: Когда вы читаете газету, вы предполагаете, что все факты проверены? Когда вы строили планы на 2020, вы предполагали, что не будет глобальной пандемии? Если вы анализировали данные, вы предполагали, что данные были записаны без ошибок? Вы предполагали, что ваш генератор случайных чисел дает случайные результаты? (Обычно они не случайны.) Когда вы решаете совершить покупку в интернете, вы предполагаете, что с вас будет списана верная сумма? Что насчет вашего последнего перекуса? Вы предполагали, что он не отравлен? Когда вы принимали лекарство, вы *знали* о его долговременном эффекте или предполагали?

Нравится вам это или нет, предположения часть принятия решений

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

Даже если вы решили обойтись без статистики, вы вероятно используете предположения, чтобы решить как действовать. Ради своей безопасности вы должны осознавать на каких предположениях основаны ваши решения.

Как творится магия статистики


В сфере статистики есть множество инструментов, позволяющих вам сформулировать предположения и объединить их с доказательствами. Так рождаются разумные решения. (Здесь можно посмотреть мое 8-минутное введение в статистику.)

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

Да, так творится статистическая магия. Вы выбираете с какими предположениями жить, затем объединяете их с данными. На основе этого нечестивого союза вы принимаете разумные решения. Вот и вся статистика.

image

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

Два человека могут прийти к совершенно разным выводам на основе одних и тех же данных! Им достаточно делать разные предположения.

По той же причине два человека могут прийти к совершенно разным выводам на основе одних и тех же данных! Им достаточно делать разные предположения. Статистика дает вам инструмент, который позволяет принимать решения более осознанно, но не существует единого правила ее использования. Это личный инструмент принятия решений.

Насколько хорошо вы проведете исследование зависит от того насколько хорошие предположения вы сделаете.

Что там по поводу науки?


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

Волей не волей ученым периодически приходится делать выводы на основе статистики, такая уж у них работа.

Я с удовольствием слушаю советы людей, у которых больше информации и опыта, чем у меня, но я никогда не позволяю себе путать мнения с фактами. Есть ученые, которые хорошо разбираются в вероятности и работают с ней. Тем не менее я также встречалась с учеными, которые наделали столько статистических ошибок, что их до конца жизни не разгребешь. Мнения не могут (и не должны) влиять на людей, которые не готовы сформулировать для себя предположения. Эти мнения были получены за счет сочетания доказательств и непроверенных предположений. Их нельзя считать компетентными.

Итог


Думайте о статистике как о науке, которая может помочь вам принять решение, когда вы в чем-то не уверены. Это фреймворк, который помогает вам принимать обдуманные решении при недостатке информации. Нет единственно верного способа использования статистики.

Нет, она не дает вам нужных фактов. Она дает вам то, что вам нужно, чтобы справиться с отсутствием фактов. Смысл статистики в том, чтобы помочь вам сделать все, что в ваших силах, в мире неопределенности.

Вам нужно лишь делать предположения.

Перевод: Диана Шеремьёва

image

Узнайте подробности, как получить востребованную профессию с нуля или Level Up по навыкам и зарплате, пройдя платные онлайн-курсы SkillFactory:



Читать еще


Подробнее..

Категории

Последние комментарии

© 2006-2020, personeltest.ru