Техники отбора и сравнения на практике в Python

Практические техники отбора и сравнения в Python

Вот подробное пошаговое руководство о том, как эффективно выборочно выбрать данные, используя Python

Изображение автора

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

Потом настал момент, чтобы повесить на ёлку шары. И сразу мне пришла в голову мысль: есть как минимум три способа повесить шары на ёлку.

  • Равномерно: разместить шары равномерно на ёлке, как-то вот так
Изображение автора, создано с помощью Freepik
  • Случайно: случайным образом повесить шары на ёлку, закрыв глаза и вешая шар туда, куда вам хочется (я начал делать это, и моя жена обалдела)
Изображение автора, создано с помощью Freepik
  • Латинский гиперкуб: Разделение ёлки на N секций и случайное выборочное извлечение в каждой из этих секций. Без запуска кода очень сложно нарисовать это, но возможный латинский гиперкуб выглядит так:
Изображение автора, создано с помощью Freepik

Я попытался показать это жене. Она улыбнулась и сказала “Как угодно”, поэтому я пошел к своему компьютеру в надежде, что ваша реакция будет более удовлетворительной 😤

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

  1. У вас нет контроля над набором данных. У вас есть клиент или компания, которая предоставляет вам набор данных. С этим набором данных вам придется работать до тех пор, пока не будет назначено необходимое (возможное) повторное обучение.

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

2. Вы можете создать свою конструкцию эксперимента. Это возможно, когда у вас есть прямая модель или реальный эксперимент, который вы всегда можете настроить для запуска.

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

Рассмотрения, которые вы делаете в двух случаях, совершенно различны.

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

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

Изображение автора

где i меняется от 1 до 3 (или от 0 до 2, если вам так нравится Python 😁). В этом случае x_i – это i-я переменная, которая всегда будет больше, чем x_i^L (нижняя граница), но всегда будет меньше, чем x_i^U (верхняя граница).

У нас есть наш куб в трех измерениях.

Изображение автора

Теперь, помните, что у нас полный контроль над нашими данными. Как мы выбираем образцы? Другими словами, как мы определяем x? Какие точки мы хотим выбрать, чтобы запустить прямую модель (эксперимент или моделирование) и получить целевые значения?

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

Давайте начнем с равномерного выбора:

1. Равномерный выбор

Метод равномерного выбора, пожалуй, является самым простым и известным.

Он заключается в разделении каждого параметра (или измерения) на шаги. Допустим, у нас есть 3 шага на каждое измерение, для 2 измерений. Каждое измерение меняется от 0 до 1 (мы расширим это через минуту). И вот выборка:

  • (0,0)
  • (0,0.5)
  • (0,1)
  • (0.5,0)
  • (0.5,0.5)
  • (0.5,1)
  • (1,0)
  • (1,0.5)
  • (1,1)

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

1.1 Код равномерного выбора

Как мы это делаем? Давайте избежим такой структуры:

  • для a в размерности 1
  • для b в размерности 2
  • ….
  • для последней буквы алфавита в размерности количество букв в алфавите: X.append([a,b,…,последняя буква алфавита])

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

вопрос np.meshgrid(*points) делает то же самое, что вы делали бы с помощью цикла for, но оптимизированным способом. Ваш словарь параметров предназначен для указания минимального и максимального значений каждого параметра.

Используя этот небольшой фрагмент кода, вы создадите куб 0/1 и куб с тремя разными измерениями (например, от -5 до 1 в первом измерении, от 0 до 10 во втором измерении и от -1 до 1 в третьем измерении):

У нас есть три измерения, давайте построим первые два:

1.2 Плюсы и минусы

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

Недостатки: Огромная проблема этого метода, конечно, зависимость от экспоненты. Если мы предположим, что количество измерений фиксировано (скажем, 6) для дизайна со 100 шагами, то мы уже имеем дело с реализацией в миллион точек. И проблема, снова, в экспоненциальности этой вещи. Так что, если вы хотите увеличить количество шагов вдвое (20 шагов вместо 10), то теперь вы имеете дело с проблемой в 64 миллиона точек.

2. Произвольная выборка

Альтернативой равномерной выборке является произвольная выборка. Как это работает? Очень просто: в интересующем вас кубе вы просто случайным образом выбираете точки на границах.

2.1 Код произвольной выборки

Метод произвольной выборки крайне прост в написании кода как для кубов от 0 до 1, так и для произвольных границ кубов. Вот как:

Давайте это отобразим:

2.2 Преимущества и недостатки

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

Недостатки: Проблема заключается в неопределенности выборки. Это может потенциально создавать кластеры и области с недостаточным исследованием.

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

3. Выборка латинским гиперкубом

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

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

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

3.1 Код выборки латинским гиперкубом

Для этого метода требуется создание специальной установки, а именно пакета Surrogate Modelling Toolbox (smt)

pip install smt

Очень легко:

3.2 Преимущества и недостатки

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

4. Выводы

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

  • Равномерную (сеточную) выборку: это метод построения N-мерной сетки, где N – количество измерений. Прост в использовании, но недостаточно подробен, особенно для больших размерностей.
  • Произвольную выборку – это метод определения N-мерного куба и извлечения случайных значений из куба. Прост в использовании и работает лучше, чем равномерная выборка в случае больших размерностей, но все же не оптимален, так как может создавать кластеры и слишком плотные области
  • Выборку латинским гиперкубом – это метод, который регуляризует произвольную выборку, требуя, чтобы была собрана хотя бы одна точка для разных частей N-мерного гиперкуба. Оптимальный для большой размерности и небольшого количества выборок, но требует специальных знаний в области и оптимизационных процедур.

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

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

5. Выводы

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

А. Подписаться на мой подписку. Он будет держать вас в курсе о новых статьях и дать вам возможность написать мне, чтобы получить все исправления или сомнения, которые у вас могут возникнуть.Б. Следить за мной в Linkedin, где я публикую все свои истории.В. Стать привлеченным участником. Тогда у вас не будет «максимального количества историй в месяц», и вы сможете читать все, что я (и тысячи других ведущих писателей по машинному обучению и науке о данных) пишем о самых новых доступных технологиях.