вторник, 21 августа 2018 г.

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

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

Масштабирование значений свойств

Масштабирование означает преобразование нецельночисловых значений свойств из их естественного периода значений (например, от 100 до 900) в стандартный период (например, от 0 до 1 или от -1 до +1). Если набор свойств состоит только из единственного свойства, тогда масштабирование дает мало пользы либо не дает его совсем. Однако, если набор свойств состоит из многих свойств, тогда масштабирование свойств дает следующие преимущества:

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

Не обязательно задавать каждому нецельночисловому свойству одинаковый масштаб. Ничего ужасного не случится, если свойство А масштабировано от -1 до +1, в то время как свойство В масштабировано от -3 до +3. Однако, модель будет слабо реагировать, если свойство В масштабировано от 5000 до 100000.

Очевидный способ масштабировать числовые данные - это линейно картировать [мин значение, макс значение] в маленький масштаб, такой как [-1, +1].

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

scaledvalue = (value − mean) / stddev

Например, даны:

Среднее значение = 100
Стандартное отклонение = 20
Оригинальное значение = 130
тогда:

scaled_value = (130 - 100) / 20
scaled_value = 1.5

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

Обработка экстремальных значений

Следующий график представляет свойство, названное roomsPerPerson (количество комнат на человека), из набора California Housing. Значение roomsPerPerson было рассчитано делением общего количества комнат в районе на население района. График показывает, что подавляющее большинство районов Калифорнии имеют одну или две комнаты на человека. Но обратите внимание на x-ось.

Очень длинный хвост

Как можно минимизировать влияние таких экстремальных значений? Один из способов - взять логарифм для каждого значения:

Логрифмическое масштабирование все равно оставляет хвост

Логарифмическое масштабирование справляется немного лучше, но все равно присутствует значительный хвост экстремальных значений. Существует другой подход. Что если мы просто "накроем" или "приклеим" максимальные значения roomsPerPerson к условно выбранному значению, например к 4.0?

Прикрепление значений свойства к 4.0

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

Хранение в ящиках

Следующий график показывает относительную распространенность домов в различных широтах Калифорнии. Следует отметить кластеризацию - Лос Анджелес около 34 широты и Сан Франциско около 38 широты.

Дома по широтам

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

Чтобы сделать широту полезным предсказателем, разделим широты на отдельные "ящики" как показано на следующем графике:

Значения рапределенные по "ящикам"

Вместо одного нецельночислового свойства, у нас теперь 11 различных булевых свойств (LatitudeBin1, LatitudeBin2, ..., LatitudeBin11). Наличие 11 отдельных свойств не очень элегантно, но позволяет объединить их в один 11-элементный вектор. Выполнение такой операции позволяет нам представить широту 37.4 следующим образом:

[0, 0, 0, 0, 0, 1, 0, 0, 0, 0, 0]

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

Чистка (скрабирование)

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

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

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

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

  • Макимум и минимум
  • Среднее значение и медиана
  • Стандартное отклонение

Учитывайте генерирование листов наиболее частых значений для отдельных свойств. Например, пусть количество примеров с country:uk соответствует числу, которое вы предполагали. А должен ли language:jp быть наиболее частым языком в таком наборе данных?

Понимание данных

Следуйте следующим правилам:

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