Рубрики
Без рубрики

Как получить смущение быстрого случайного подмножества отбора проб с Python

Автор оригинала: FreeCodeCapm Team.

Кирилл Дубовиков

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

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

Благодаря связующему, вы можете Играйте с кодом онлайн не установив ничего локально. Или вы можете клонировать Github Repository Отказ Обратите внимание, что все ориентиры могут отличаться от машины к машине.

Ну, в чем дело? Давайте использовать numpy !

На MacBook Pro этот код работает для около 1,4 секунды за петлю Отказ Если вы хотите получить 100 000 образцов, это займет около полутора дней. Отель!

Встать на скорость ☄️

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

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

Теперь пришло время кодировать это:

На этот раз мы получаем 21,1 мкс ± 979 нс на петлю, что быстрее на несколько порядков.

Даже быстрее? ?

Можем ли мы сделать это еще быстрее? Да, но нам нужно идти родным. Cython Переведает Python подобный код для оптимизации нативного C или C ++, который можно скомпилировать и использовать в качестве дружественного и знакомого модуля Python.

Вы можете играть с Cython в ноутбуках Jupyter, загружая расширение Cython с % load_ext cython и используя %% Cython Magic как первое утверждение в ячейке с Cython Code.

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

  • Мы статим аннотируем все типы для функциональных подписей и определения переменной, чтобы использовать нативные переменные C вместо медленных объектов Python, где это возможно
  • Мы используем CDEF Ключевое слово для функций, которые не должны быть экспортированы как API Python. CDEF Звонки намного быстрее.
  • Мы отключаем отрицательную индексацию и границ массива, проверяя с @ cython.wraparound и @ cython.boundscheck Чтобы получить больше скорости

Этот незначительный рефакторинг достаточно, чтобы получить разумное ускорение (2x на моем ноутбуке) по сравнению с версией Python.

Я обязан сказать, что Cython гораздо больше, чем оптимизированный переводчик Python-C. С этим потрясающим инструментом вы также можете:

Как насчет столкновений? ?

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

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

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

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

P-значение, которое мы получаем, это 0, что означает, что результат, который мы получили, является значительным.

Давайте сделаем сюжет и посмотрите разницу:

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

Заключение

Большое спасибо за чтение этого до конца! Дай мне несколько хлопов? Если вы нашли этот материал полезным – это поможет распространить слово.