Это первая статья из будущей серии, посвященной поиску способа борьбы с соревнованиями по машинному обучению (ML). Несколько месяцев назад MLJCUnito получил доступ к международному конкурсу машинного обучения по изменению климата, организованному Университетом Торонто: www.projectx2020.com. Этот конкурс начнется в сентябре 2020 года, поэтому мы решили начать сбор некоторых полезных материалов, связанных с динамикой конкуренции, таких как предварительная обработка данных, разработка функций, и преобразовать их в формат, похожий на лекцию.

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

Макро, мезо, микромасштаб в науке

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

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

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

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

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

Масштабирование в науке о данных

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

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

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

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

Более конкретно, предположим, что у нас есть проблема с двумя функциями, где x ₁ - длина футбольного поля и принимает значения от 90 (метров ) и 115 (метров) и x ₂ - это радиус шара, который принимает значения от 10,5 (сантиметры ) до 11,5 (сантиметров). Если вы построите счетные числа функции стоимости J (ω), то вы можете получить что-то похожее на левый график, и именно из-за них перекошенная эллиптическая форма, если мы запустим градиентный спуск по этой функции стоимости, она может занять много времени и колебаться вперед и назад, прежде чем достигнет глобального минимума.

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

Предварительная обработка данных

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

В этом разделе мы собираемся погрузиться в Scikit-Learn и использовать его мощный пакет processing.

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

Стандартизация

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

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

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

Возможный ответ: многие элементы, используемые в целевой функции алгоритма обучения (например, ядро ​​RBF в Support Vector Machines или l1 и l2 регуляризаторы линейных моделей) предполагают, что все функции сосредоточены вокруг нуля и имеют дисперсию в одном и том же порядке. Если характеристика имеет дисперсию, которая на несколько порядков больше, чем у других, она может доминировать над целевой функцией и сделать оценщик неспособным правильно учиться на других функциях, как ожидалось.

Есть быстрый способ сделать это с одним массивом с помощью функции scale.

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

(Вы должны хорошо знать, что такое sklearn.pipeline.Pipeline, это важно для развертывания стратегии.)

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

Можно отключить центрирование или масштабирование, передав with_mean = False или with_std = False. Первый может быть особенно полезен при применении к разреженным матрицам CSR или CSC, чтобы избежать нарушения разреженной структуры данных.

Масштабирование функций до диапазона

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

Здесь вы можете увидеть, как масштабировать матрицу данных игрушки до диапазона [0,1]:

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

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

Можете ли вы получить явную формулу для MinMaxScaler?

Вот решение

MaxAbsScaler работает аналогичным образом, данные будут находиться в диапазоне [-1,1]. Он предназначен для данных, которые уже сосредоточены на нуле или разреженных данных.

Масштабирование данных с помощью выбросов

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

Этот скейлер удаляет медианное значение и масштабирует данные в соответствии с IQR (InterQuartile Range).

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

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

Нелинейные преобразования

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

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

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

Сопоставление с равномерным распределением

QuantileTransformer обеспечивает непараметрическое преобразование для отображения данных в равномерное распределение со значениями от 0 до 1:

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

Еще несколько приложений здесь.

Сопоставление с распределением Гаусса

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

PowerTransformer предоставляет два преобразования, преобразование Йео-Джонсона:

и преобразование Бокса-Кокса:

Бокс-Кокса можно применять только к строго положительным данным. В обоих методах преобразование параметризуется параметром $ \ lambda $, который определяется посредством оценки максимального правдоподобия. Вот пример использования Box-Cox для сопоставления выборок, взятых из логнормального распределения в нормальное распределение:

(Еще несколько приложений здесь)

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

Нормализация

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

Функция обеспечивает быстрый и простой способ выполнить эту операцию с одним массивом, используя нормы L1 или L2:

Модуль предварительной обработки предоставляет служебный класс Normalizer, который реализует ту же операцию с помощью API Transformer. Этот класс подходит для sklearn.pipeline.Pipeline

Кодирование категориальных функций

Во многих случаях характеристики являются не постоянными значениями, а категориальными. Например. у человека могут быть некоторые особенности: ["from Italy", "from France", "from Germany"], ["play sports", "doesn't play sports"], ["uses Firefox", "uses Opera", "uses Chrome", "uses Safari", "uses Internet Explorer"].

Такие функции могут быть эффективно закодированы как целые числа, например ["from France", "play sports", "uses Chrome"] может быть [1,0,2].

Чтобы преобразовать категориальные признаки в такие целочисленные коды, мы можем использовать OrdinalEncoder. Таким образом, мы преобразуем каждую функцию в одну новую функцию целых чисел от (0 до n_categories-1):

Некоторые оценщики scikit-learn ожидают непрерывного ввода и интерпретируют категории как упорядоченные, что обычно нежелательно.

Есть еще один способ преобразовать категориальные функции в функции, которые можно использовать с оценщиками scikit-learn: горячее кодирование. Его можно получить с помощью OneHotEncoder, который преобразует каждую категориальную функцию с n_categories возможных значений в n_categories двоичных функций, одна из которых 1, а все остальные 0.

Продолжим приведенный выше пример:

Значения, которые может принимать каждый объект, автоматически выводятся из набора данных и могут быть найдены в атрибуте categories_:

Мы закончили с кратким введением в предварительную обработку данных. Я попытался показать некоторые из наиболее полезных функций scikit-learn, которая, безусловно, является одной из основных библиотек для машинного обучения. В следующей лекции мы собираемся погрузиться в разработку функций, которую я лично считаю наиболее фундаментальной частью конвейера машинного обучения. Следите за следующей статьей! 👩‍💻👨‍💻