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

Яблони дают смесь великолепных фруктов и червивых гадостей. Тем не менее, яблоки в дорогих продуктовых магазинах представляют собой 100% идеальные плоды. Между садом и продуктовым магазином кто-то тратит много времени на то, чтобы удалить испорченные яблоки или полить небольшим количеством воска те, которые можно спасти. Как инженер ML, вы потратите огромное количество времени, отбрасывая плохие примеры и исправляя те, которые можно спасти. Даже несколько «плохих парней» могут испортить большой набор данных.

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

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

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

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

Обработка экстремальных выбросов

На следующем графике представлен объект roomsPerPerson названиемroomsPerPerson из набора данных California Housing . roomsPerPerson рассчитывалось путем деления общего количества комнат на территории на численность населения этой территории. На графике видно, что в подавляющем большинстве районов Калифорнии на человека приходится одна или две комнаты. Но взгляните вдоль оси X.

График RoomPerPerson, на котором почти все значения сгруппированы между 0 и 4, но есть очень длинный хвост, доходящий до 55 комнат на человека.

Рисунок 4. Очень длинный хвост.

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

График log(roomsPerPerson), в котором 99% значений группируются между 0,4 и 1,8, но все еще остается длинный хвост, доходящий до 4,2 или около того.

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

Масштабирование журнала работает немного лучше, но по-прежнему остается значительный хвост выбросов. Давайте выберем еще один подход. Что roomsPerPerson если мы просто «ограничим» или «обрежем» максимальное значениеroomsPerPerson произвольным значением, скажем, 4,0?

График RoomPerPerson, на котором все значения лежат в диапазоне от -0,3 до 4,0. Сюжет колоколообразный, но на 4.0 есть аномальный холм

Рисунок 6. Значения функций отсечения в версии 4.0

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

Биннинг

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

Участок домов на широту. График крайне нерегулярный: в районе 36-й широты наблюдается затишье, а в районе 34-й и 38-й широты - резкие скачки.

Рисунок 7. Дома по широте.

В наборе данных latitude представляет собой значение с плавающей запятой. Однако в нашей модели не имеет смысла представлять latitude как функцию с плавающей запятой. Это потому, что не существует линейной зависимости между широтой и стоимостью жилья. Например, дома на 35-й широте не являются \(\frac{35}{34}\) более дорогими (или менее дорогими), чем дома на 34-й широте. И тем не менее, отдельные широты, вероятно, являются довольно хорошим предиктором стоимости дома.

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

Участок домов на широту. Участок разделен на

Рисунок 8. Значения группировки.

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

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

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

Чистка

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

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

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

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

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

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

Знайте свои данные

Следуйте этим правилам:

  • Помните, как, по вашему мнению, должны выглядеть ваши данные.
  • Убедитесь, что данные соответствуют этим ожиданиям (или что вы можете объяснить, почему это не так).
  • Еще раз проверьте, совпадают ли данные обучения с другими источниками (например, информационными панелями).

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

Дополнительная информация

Правила машинного обучения , ML, этап II: разработка функций