feature scaling что это

СОДЕРЖАНИЕ

Мотивация

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

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

Методы

Изменение масштаба (нормализация минимум-максимум)

Также известный как масштабирование min-max или min-max нормализация, это простейший метод, который заключается в изменении масштаба диапазона функций для масштабирования диапазона в [0, 1] или [-1, 1]. Выбор целевого диапазона зависит от характера данных. Общая формула для min-max [0, 1] задается как:

Чтобы изменить масштаб диапазона между произвольным набором значений [a, b], формула принимает следующий вид:

Средняя нормализация

Стандартизация (нормализация по Z-баллу)

Масштабирование до единичной длины

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

заявка

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

Источник

Azure Machine Learning для Data Scientist

Эта статья создана нашим другом из коммьюнити, Дмитрием Петуховым, Microsoft Certified Professional, разработчиком компании Quantum Art.
Статья — часть цикла про Fraud Detection, остальные статьи можно найти в профиле у Дмитрия.

Azure Machine Learning – облачный сервис для выполнения задач прогнозной аналитики (predictive analytics). Сервис представлен двумя компонентами: Azure ML Studio – средой разработки, доступной через web-интерфейс, и web-сервисами Azure ML.
Типичная последовательность действий data scientist’a при поиске закономерностей в наборе данных с использованием алгоритмов обучения с учителем изображена и подробно описана под хабракатом.

Проекты в Azure ML Studio называют экспериментами. Создадим эксперимент и посмотрим на набор инструментов, которые специалисту по работе с данными предлагает Azure ML для каждого из этапов проиллюстрированной выше последовательности.

Получение данных

Элемент управления Reader позволяет загружать как структурированные, так и полуструктурированные наборы данных. Поддерживается загрузка как из реляционных СУБД (Azure SQL Database), так и данных из нереляционных источников: NoSQL (Azure Table, запросы к Hive), OData-сервисов, а также загрузка документов различных текстовых форматов из Azure Blob Storage и по URL (протокол http).

Возможен и ручной ввод данных (элемент управления Enter Data). Для целей конвертация данных различных форматов служат элементы из раздела Data Format Conversation. Доступны следующие форматы выходных данных: CSV, TSV, ARFF, SVMLight.

Подготовка данных

Неполнота данных / дублирующиеся данные

В общем случае исследователь имеет дело с неполными данными – обучающая выборка имеет пустые значения в данных. Элемент управления Clean Missing Data позволяет как удалить строку/столбец, содержащий пропущенные данные, так и заменить пропущенное значение на константу, среднее, медиану, моду.
Нередка ситуация, что набор содержит дублирующийся данные, которые, в свою очередь, могут заметно снизить точность предсказания будущей модели. Для удаления дублирующийся данных служит элемент управления Remove Duplicate Rows.

Исследование данных

Трансформация и очистка данных

Трансформация данных – один из этапов, требующих большого количества ручной работы, особенно, если данные для обучающей выборки берутся из различных источников: локальный CSV, распределенные файловая система (HDFS), Hive. Отсутствие инструментов, с помощью которых запросы к гетерогенным источникам можно было бы делать единообразно, может заметно усложнить работу специалиста по анализу данных.

После загрузки данных в Azure ML исследователь не сталкивается с проблемами унифицированного доступа к гетерогенным источникам данным, а работает с данными, полученными из различных источников, единообразно. В разделе Manipulation доступны элементы управления, позволяющие делать операции inner/left/full join, проецирования, добавления и удаления столбцов, группировки данных по предикторам и даже произвольные SQL-трансформации над загруженными наборами данных (элемент управления Apply SQL Transformation).

Определение структуры (метаданных) набора данных

Элемент управления Metadata Editor позволит явно указать тип данных (string, integer, timestamp, etc.), содержащихся в определенных столбцах, отнести содержимое столбца к предикторам (feature), либо к ответам (label), а также уточнить тип шкалы предиктора: номинальная (категориальная, categorical) или абсолютная.

Наличие паттернов и аномалий

Azure ML Studio доступны многочисленные инструменты статистического анализа (раздел Statistical Functions в панели инструментов). Один из наиболее часто используемых мной — элемент управления Descriptive Statistics. С его помощью можно получить сведения о минимальном (Min) и максимальном (Max) значение, хранящемся в столбце, значение медианы (Median), арифметического среднего (Mean), значение первой (1st Quartile) и третей (3rd Quartile) квартили, стандартное отклонение (Sample Standard Deviation) и т.п.

Разбитие набора данных

При использовании алгоритмов обучения с учителем минимум один раз за эксперимент (в общем случае) придется делить набор данных на два поднабора: обучающую выборку (Training Dataset) и тестовую (Test Dataset).

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

Для задач разбития набора данных в Azure ML Studio используется элемент управления Split, которые реализует несколько стратегий разделения данных и позволяет указать пропорции данных, которые попадут в каждый из поднаборов.

Построение модели

Feature Selection

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

Элемент управления Filter Based Feature Selection позволит идентифицировать предикторы в загруженном наборе данных, основываясь на корреляции Пирсона, Спирмена, Кендалла или других статистических методах. Выявление предикторов с использованием математических методов поможет на первых этапах максимально быстро создать приемлемую по модель. На заключительном же этапе уточнения модели выбор предикторов часто осуществляется на основе экспертного мнения в исследуемой области. Для явного (ручного) выделения предикторов в Azure ML используется инструмент Metadata Editor, который позволяет указать, что столбец набора данных считать предиктором.

Feature Scaling / Dimension reduction

Некоторые алгоритмы машинного обучения работают некорректно без нормализации значений предикторов (Feature Scaling). Кроме того, уменьшение количества имеющихся в модели переменных/предикторов (Dimension reduction) позволяют улучшить утилизацию ресурсов при выполнении обучающего алгоритма, избежать переобучения модели. Оба этих приема позволят уменьшить время поиска целевой функции, описывающей модель.
Элементы из этой группы функциональности находиться в разделе Scale and Reduce панели инструментов Azure ML Studio.

Читайте также:  coaster brake что это
Применение алгоритма машинного обучения

В Azure ML доступны алгоритмы регрессии, классификации, кластеризации. Есть возможность настройки ключевых параметров выбранного алгоритма: так для алгоритма Multiclass Neural Network можно задать количество скрытых узлов, количества итераций обучения, начальные веса, тип нормализации и т.п. (список всех настраиваемых параметров).

Полный список алгоритмов на март 2015 года отображен на иллюстрации ниже.

Оценка модели

Элемент управления Evaluate Model содержит матрицу неточностей (confusion matrix), которая содержит правильно распознанные хорошие примеры (True Positive, TP), правильно распознанные плохие примеры (True Negative, TN) и ошибки в распознании (False Positive, False Negative).

Оценка производительности модели доступна как в виде графика, так и в виде таблицы метрик: Accuracy, Precision, Recall, F1 Score.

Наибольший (но не единственный) интерес представляет показатель точности предсказания Accuracy, который рассчитывается как отношение всех успешных предсказания к полному количеству элементов в наборе: (TP + TN)/Total numbers.
Смысл, оставшихся показателей наглядно демонстрирует следующая иллюстрация:

Следующий по популярности после Accuracy показатель – AUC (Area Under Curve). AUC лежит в интервале от 0 до 1; значения близкие 0,5 говорят, что модель работает с той же эффективностью, как если бы вы подкидывали монету и на основе выпадения одной из сторон монеты делали предположение к какому классу относится событие. Тем ближе AUC к 1, тем более точна модель. Для каждого уровня Threshold свой график AUC.
Более подробно о показателях производительности алгоритмов в в Azure ML можно прочитать здесь.

Публикация модели

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

Сервис работает в 2-ух режимах: пакетный режим (асинхронный ответ от сервиса, SLA 99.9%) и режим Request/Response с низкой задержкой (синхронный ответ, SLA 99.95%).
Сервис получает и отправляет сообщения в формате application/json по https. Для доступа к сервису выдается API Key – ключ доступа, включаемый в header запроса.
Есть возможность добавить произвольное количество конечных точек, через которые можно получить доступ к сервису. Для каждой конечной точки можно настроить Throttle Level, что безусловно является достоинством. Недостатком же является то, что этих уровней всего два – High и Low – и нет никакой возможности задать этот уровень вручную, скажем, на 10240 запросов/сек. Еще одна странность – это то, что у всех конечных точек единый API Key.

После создания сервиса становится доступна страница документации по API сервиса, которая кроме общего описания сервиса, описания форматов ожидаемых входных и выходных сообщений, содержит еще и примеры вызова сервиса на C#, Python и R.
Кроме того, успешной моделью всегда можно поделиться с community в Azure ML Gallery, в которой уже сейчас много интересных экспериментов. Если ваша модель представляет большую общественную ценность, то воспользуйтесь возможностью опубликовать сервис, предоставляющий доступ к модели, в магазине SaaS-приложений Microsoft Azure Marketplace. В свою очередь Azure Marketplace уже содержит большой количество data-сервисов, доступных как бесплатно, так по подписке (например, за каждые 10К запросов).

Недостатки

В Azure ML, как и во многих сервисах облачной платформы Azure, есть несколько уровней (tier) предоставления сервиса. В Azure ML это уровни Free и Standard. Free обойдется вам в минимальную (почти нулевую) сумму и отлично подойдет для первоначального знакомства с сервисом. Уровень Standart – это enterprise-уровень, свободный от большого количества искусственных ограничений, имеющихся у Free Tier. Поэтому далее я буду говорить только о Standart Tier.

Я не скажу, что то, что перечислю ниже это ограничения, это скорее вещи, которые мне остались неясны.

Ложка дегтя для Azure ML Experiment

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

Ложка дегтя для Azure ML Web Services

Неизвестно: максимальное количество одновременных запросов к одной конечной точке (endpoint) и максимальное количество конечных точек. Всего в одном месте я нашел следующие цифры (не берусь судить об их актуальности): максимум 20 параллельных запросов на одну конечную точку, максимум 80 конечных точек. Я проверил длительность вызова для одного моего Azure ML web-сервиса, находящегося в регионе US Central South (клиент, отправляющий запросы, находился в том же ДЦ). Время ожидания ответа в режиме сервиса Request/Response составляет около 0,4 секунды.
Отсюда можно посчитать, что производительность более 5К (20*80*1/0,4) запросов в секунду, в моем конкретном случае, ожидать не стоит. Данное ограничение масштабируемости приложения также необходимо учитывать при проектировании.

И, последнее, не хватает возможности настройки прав для каждой конечной точки в отдельности. Но для того, чтобы эти права выдавать для каждой конечной точки нужен персональный endpoint API Key (или другое средство аутентификации), а такая возможность пока в Azure ML отсутствует.

Killer Feature (вместо заключения)

Стоит отметить, что функциональности встроенных инструментов Azure ML Studio по каким-то причинам не хватает, исследователям доступна возможность написания и выполнения в проекте скриптов, написанных на R (quickstart) и Python (quickstart) – популярнейшие языки программирования в области научных исследований данных.
А еще говорят, что все это можно попробовать бесплатно. Кому покажется мало, здесь цены на Free и Standart Tier.

Источник

Открытый курс машинного обучения. Тема 6. Построение и отбор признаков

Сообщество Open Data Science приветствует участников курса!

В рамках курса мы уже познакомились с несколькими ключевыми алгоритмами машинного обучения. Однако перед тем как переходить к более навороченным алгоритмам и подходам, хочется сделать шаг в сторону и поговорить о подготовке данных для обучения модели. Известный принцип garbage in – garbage out на 100% применим к любой задаче машинного обучения; любой опытный аналитик может вспомнить примеры из практики, когда простая модель, обученная на качественно подготовленных данных, показала себя лучше хитроумного ансамбля, построенного на недостаточно чистых данных.

UPD: теперь курс — на английском языке под брендом mlcourse.ai со статьями на Medium, а материалами — на Kaggle (Dataset) и на GitHub.

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

Отдельно отмечу, что в этой статье почти не будет формул, зато будет относительно много кода.

Извлечение признаков (Feature Extraction)

Тексты

Текст – самый очевидный пример данных в свободном формате; методов работы с текстом достаточно, чтобы они не уместились в одну статью. Тем не менее, обзорно пройдем по самым популярным.

Перед тем как работать с текстом, его необходимо токенизировать. Токенизация предполагает разбиение текста на токены – в самом простом случае это просто слова. Но, делая это слишком простой регуляркой («в лоб»), мы можем потерять часть смысла: «Нижний Новгород» это не два токена, а один. Зато призыв «воруй-убивай!» можно напрасно разделить на два токена. Существуют готовые токенайзеры, которые учитывают особенности языка, но и они могут ошибаться, особенно если вы работаете со специфическими текстами (профессиональная лексика, жаргонизмы, опечатки).

Читайте также:  при фарингите какой антибиотик самый эффективный

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

Итак, мы превратили документ в последовательность слов, можно начинать превращать их в вектора. Самый простой подход называется Bag of Words: создаем вектор длиной в словарь, для каждого слова считаем количество вхождений в текст и подставляем это число на соответствующую позицию в векторе. В коде это выглядит даже проще, чем на словах:

Также идея хорошо иллюстрируется картинкой:

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

Используя алгоритмы вроде Вag of Words, мы теряем порядок слов в тексте, а значит, тексты «i have no cows» и «no, i have cows» будут идентичными после векторизации, хотя и противоположными семантически. Чтобы избежать этой проблемы, можно сделать шаг назад и изменить подход к токенизации: например, использовать N-граммы (комбинации из N последовательных терминов).

Также отмечу, что необязательно оперировать именно словами: в некоторых случаях можно генерировать N-граммы из букв (например, такой алгоритм учтет сходство родственных слов или опечаток).

Развитие идеи Bag of Words: слова, которые редко встречаются в корпусе (во всех рассматриваемых документах этого набора данных), но присутствуют в этом конкретном документе, могут оказаться более важными. Тогда имеет смысл повысить вес более узкотематическим словам, чтобы отделить их от общетематических. Этот подход называется TF-IDF, его уже не напишешь в десять строк, потому желающие могут ознакомиться с деталями во внешних источниках вроде wiki. Вариант по умолчанию выглядит так:

Аналоги Bag of words могут встречаться и за пределами текстовых задач: например, bag of sites в соревновании, которые мы проводим – Catch Me If You Can. Можно поискать и другие примеры – bag of apps, bag of events.

Используя такие алгоритмы, можно получить вполне рабочее решение несложной проблемы, эдакий baseline. Впрочем, для нелюбителей классики есть и более новые подходы. Самый распиаренный метод новой волны – Word2Vec, но есть и альтернативы (Glove, Fasttext…).

Word2Vec является частным случаем алгоритмов Word Embedding. Используя Word2Vec и подобные модели, мы можем не только векторизовать слова в пространство большой размерности (обычно несколько сотен), но и сравнивать их семантическую близость. Классический пример операций над векторизированными представлениями: king – man + woman = queen.

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

Похожие методы, кстати, применяются и других областях (например, в биоинформатике). Из совсем неожиданных применений – food2vec.

Изображения

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

Во времена, когда GPU были слабее, а «ренессанс нейросетей» еще не случился, генерация фичей из картинок была отдельной сложной областью. Для работы с картинками нужно было работать на низком уровне, определяя, например, углы, границы областей и так далее. Опытные специалисты в компьютерном зрении могли бы провести много параллелей между более старыми подходами и нейросетевым хипстерством: в частности, сверточные слои в современных сетях очень похожи на каскады Хаара. Не будучи опытным в этом вопросе, не стану даже пытаться передать знание из публичных источников, оставлю пару ссылок на библиотеки skimage и SimpleCV и перейду сразу к нашим дням.

Часто для задач, связанных с картинками, используется какая-нибудь сверточная сеть. Можно не придумывать архитектуру и не обучать сеть с нуля, а взять предобученную state of the art сеть, веса которой можно скачать из открытых источников. Чтобы адаптировать ее под свою задачу, дата сайнтисты практикуют т.н. fine tuning: последние полносвязные слои сети «отрываются», вместо них добавляются новые, подобранные под конкретную задачу, и сеть дообучается на новых данных. Но если вы хотите просто векторизовать изображение для каких-то своих целей (например, использовать какой-то несетевой классификатор) – просто оторвите последние слои и используйте выход предыдущих слоев:

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

Если на картинке ожидается текст, его также можно прочитать и не разворачивая своими руками сложную нейросеть: например, при помощи pytesseract.

Надо понимать, что pytesseract – далеко не панацея:

Еще один случай, когда нейросети не помогут – извлечение признаков из метаинфорации. А ведь в EXIF может храниться много полезного: производитель и модель камеры, разрешение, использование вспышки, геокоординаты съемки, использованный для обработки софт и многое другое.

Геоданные

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

Геоданные чаще всего представлены в виде адресов или пар «широта + долгота», т.е. точек. В зависимости от задачи могут понадобиться две обратные друг другу операции: геокодинг (восстановление точки из адреса) и обратный геокодинг (наоборот). И то, и другое осуществимо при помощи внешних API вроде Google Maps или OpenStreetMap. У разных геокодеров есть свои особенности, качество разнится от региона к региону. К счастью, есть универсальные библиотеки вроде geopy, которые выступают в роли оберток над множеством внешних сервисов.

Если данных много, легко упереться в лимиты внешних API. Да и получать информацию по HTTP – далеко не всегда оптимальное по скорости решение. Поэтому стоит иметь в виду возможность использования локальной версии OpenStreetMap.

Если данных немного, времени хватает, а желания извлекать наворченные признаки нет, то можно не заморачиваться с OpenStreetMap и воспользоваться reverse_geocoder :

Работая с геокодингом, нельзя забывать о том, что адреса могут содержать опечатки, соответственно, стоит потратить время на очистку. В координатах опечаток обычно меньше, но и с ними не все хорошо: GPS по природе данных может «шуметь», а в некоторых местах (туннели, кварталы небоскребов. ) – довольно сильно. Если источник данных – мобильное устройство, стоит учесть, что в некоторых случаях геолокация определяется не по GPS, а по WiFi сетям в округе, что ведет к дырам в пространстве и телепортации: среди набора точек, описывающих путешествие по Манхеттену может внезапно оказаться одна из Чикаго.

Читайте также:  что делает полицейский в мафии

WiFi location tracking основан на комбинации SSID и MAC-адреса, которые могут совпадать у совсем разных точек (например, федеральный провайдер стандартизировал прошивку роутеров с точностью до MAC-адреса и размещает их в разных городах). Есть и более банальные причины вроде переезда компании со своими роутерами в другой офис.

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

Если две или более точек взаимосвязаны, возможно, стоит извлекать признаки из маршрута между ними. Здесь пригодятся и дистанции (стоит смотреть и на great circle distance, и на «честное» расстояние, посчитанное по дорожному графу), и количество поворотов вместе с соотношением левых и правых, и количество светофоров, развязок, мостов. Например, в одной из моих задач неплохо себя проявил признак, который я назвал «сложность дороги» – расстояние, посчитанное по графу и деленное на GCD.

Дата и время

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

Начнем с дней недели – их легко превратить в 7 dummy переменных при помощи one-hot кодирования. Кроме этого, полезно выделить отдельный признак для выходных.

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

А вот с часом (минутой, днем месяца. ) все не так радужно. Если использовать час как вещественную переменную, мы немного противоречим природе данных: 0 01.01 23:00:00. Для некоторых задач это может оказаться критично. Если же кодировать их как категориальные переменные, можно наплодить кучу признаков и потерять информацию о близости: разница между 22 и 23 будет такой же, как и между 22 и 7.

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

Такое преобразование сохраняет дистанцию между точками, что важно для некоторых алгоритмов, основанных на расстоянии (kNN, SVM, k-means. )

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

Временные ряды, веб и прочее

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

Как и в других доменных областях, можно придумывать свои признаки, основываясь на догадках о природе данных. На момент написания статьи Chromium 56 был новым, а через какое-то время такая версия браузера сможет сохраниться только у тех, кто очень давно не перезагружал этот самый браузер. Почему бы в таком случае не ввести признак «отставание от свежей версии браузера»?

Кроме ОС и браузера, можно посмотреть на реферер (доступен не всегда), http_accept_language и другую метаинформацию.

Следующая по полезности информация – IP-адрес, из которого можно извлечь как минимум страну, а желательно еще город, провайдера, тип подключения (мобильное / стационарное). Нужно понимать, что бывают разнообразные прокси и устаревшие базы, так что признак может содержать шум. Гуру сетевого администрирования могут попробовать извлекать и гораздо более навороченные признаки: например, строить предположения об использовании VPN. Кстати, данные из IP-адреса неплохо комбинировать с http_accept_language: если пользователь сидит за чилийским прокси, а локаль браузера – ru_RU, что-то здесь нечисто и достойно единицы в соответствующей колонке в таблице ( is_traveler_or_proxy_user ).

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

Преобразования признаков (Feature transformations)

Нормализация и изменение распределения

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

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

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

Самая простая трансформация – это Standart Scaling (она же Z-score normalization).

StandartScaling хоть и не делает распределение нормальным в строгом смысле слова.

… но в какой-то мере защищает от выбросов

Другой достаточно популярный вариант – MinMax Scaling, который переносит все точки на заданный отрезок (обычно (0, 1)).

StandartScaling и MinMax Scaling имеют похожие области применимости и часто сколько-нибудь взаимозаменимы. Впрочем, если алгоритм предполагает вычисление расстояний между точками или векторами, выбор по умолчанию – StandartScaling. Зато MinMax Scaling полезен для визуализации, чтобы перенести признаки на отрезок (0, 255).

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

В примерах выше мы работали с синтетическими данными и строго проверяли нормальность при помощи критерия Шапиро-Уилка. Давайте попробуем посмотреть на реальные данные, а для проверки на нормальность будем использовать менее формальный метод – Q-Q график. Для нормального распределения он будет выглядеть как ровная диагональная линия, и визуальные отклонения интуитивно понятны.

Источник

Сказочный портал