понедельник, 20 августа 2018 г.

Представление: разработка свойств

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

Картирование сырых данных в свойства

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

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

Разработка свойств картирует сырые данные в свойства для машинного обучения

Картирование числовых значений

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

Картирование цельночисловых значений в нецельночисловые свойства

Картирование категоризированных значений

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

{'Charleston Road', 'North Shoreline Boulevard', 'Shorebird Way', 'Rengstorff Avenue'}

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

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

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

  • картируем Charleston Road как 0
  • картируем North Shoreline Boulevard как 1
  • картируем Shorebird Way как 2
  • картируем Rengstorff Avenue как 3
  • картируем все остальное (OOV) как 4

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

  • Мы будем обучаться единственному весу, который будет применяться ко всем улицам. Например, если мы присвоим в ходе обучение вес равный 6 для street_name, тогда мы будем умножать это на 0 для Charleston Road, на 1 для North Shoreline Boulevard, 2 для Shorebird Way и т.д. Предположим модель, которая будет прогнозировать цену домов, используя street_name как свойство. Вряд ли существует линейная зависимость цен от названия улиц и кроме того, предполагается, что улицы были отсортированы на основе их средней цены на жилье. Наша модель требуется в большей гибкости в обучении различных весов для каждой улицы, которая будет добавлена в цену, рассчитанную по другим свойствам.
  • Мы не учли случаев, когда street_name может иметь несколько значений. Например, многие дома расположены на углу двух улиц, и нет пути кодировать такую информацию в значение street_name если оно может содержать только один индекс.

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

  • Для значений, которые применяются к примеру, установить соотвествующий вектор элементов равный 1
  • Установить все остальные элементы равными 0

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

Следующий график показывает одноразовое кодирование определенной улицы: Shorebird Way. Элемент бинарного вектора для Shorebird Way имеет значение 1, в то время как остальные элементы для всех остальных улиц имеют значение 0.

Картирование адреса улицы через одноразовое кодирование

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

Аналогично, если дом расположен на углу двух улиц, тогда два бинарных значения равны 1 и модель использует оба этих веса.

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

Разреженное представление

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