Насколько данные для обучения модели (не)похожи на тестовую выборку? |
||
МЕНЮ Искусственный интеллект Поиск Регистрация на сайте Помощь проекту ТЕМЫ Новости ИИ Искусственный интеллект Разработка ИИГолосовой помощник Городские сумасшедшие ИИ в медицине ИИ проекты Искусственные нейросети Слежка за людьми Угроза ИИ ИИ теория Внедрение ИИКомпьютерные науки Машинное обуч. (Ошибки) Машинное обучение Машинный перевод Реализация ИИ Реализация нейросетей Создание беспилотных авто Трезво про ИИ Философия ИИ Big data Работа разума и сознаниеМодель мозгаРобототехника, БПЛАТрансгуманизмОбработка текстаТеория эволюцииДополненная реальностьЖелезоКиберугрозыНаучный мирИТ индустрияРазработка ПОТеория информацииМатематикаЦифровая экономика
Генетические алгоритмы Капсульные нейросети Основы нейронных сетей Распознавание лиц Распознавание образов Распознавание речи Техническое зрение Чат-боты Авторизация |
2018-09-05 12:31 Рассмотрим один из сценариев, при котором ваша модель машинного обучения может быть бесполезна.
Есть такая поговорка: «Не сравнивайте яблоки с апельсинами». Но что делать, если нужно сравнить один набор яблок с апельсинами с другим, но распределения фруктов в двух наборах разное? Сможете работать с данными? И как будете это делать? В реальных кейсах такая ситуация встречается повсеместно. При разработке моделей машинного обучения мы сталкиваемся с ситуацией, когда наша модель хорошо работает с обучающей выборкой, но качество модели резко падает на тестовых данных. И речь здесь идет не о переобучении. Допустим, что мы построили модель, которая дает отличный результат на кросс-валидации, однако показывает плохой результат на тесте. Значит в тестовой выборке есть информация, которую мы не учитываем. Представьте ситуацию, в которой мы прогнозируем поведение клиента в магазине. Если обучающая и тестовая выборка выглядят так, как показано на картинке ниже, это явная проблема: В этом примере модель обучена на данных со средним значением признака «возраст покупателя» ниже, чем среднее значение аналогичного признака на тесте. В процессе обучения модель никогда «не видела» бОльших значений признака «возраст». Если возраст является важным признаком для модели, то не следует ожидать хороших результатов на тестовой выборке. В этом тексте мы поговорим о «наивных» подходах, позволяющих выявить подобные явления и попробовать их устранить. Ковариационный сдвиг Дадим более аккуратное определение данному понятию. Ковариация относится к значениям признаков, а под ковариационным сдвигом понимается ситуация, когда распределения значений признаков в обучающей и тестовой выборке имеют разные характеристики (параметры). Основная идея Если в данных существует сдвиг, то при смешивании двух выборок мы сможем построить классификатор, способный определить принадлежность объекта к обучающей либо тестовой выборке. Давайте поймём, почему это так. Вернёмся к примеру с покупателями, где возраст был «сдвинутым» признаком обучающей и тестовой выборки. Если взять классификатор (например, на основе случайного леса) и попробовать разделить смешанную выборку на обучение и тест, то возраст будет очень важным признаком для такой классификации.Реализация Попробуем применить описанную идею к реальному датасету. Используем датасет из соревнования на Kaggle. Шаг 1: подготовка данных Первым делом выполним ряд стандартных шагов: почистить, заполнить пропуски, выполнить label encoding для категориальных признаков. Для рассматриваемого датасета шаг не потребовался, так что пропустим его описание.
Шаг 2: добавление индикатора источника данных К обеим частям датасета — обучающей и тестовой — необходимо добавить новый признак-индикатор. Для обучающей выборки со значением «1», для тестовой, соответственно, «0».
Шаг 3: объединение обучающей и тестовой выборки Теперь необходимо объединить два датасета. Ппоскольку обучающий датасет содержит столбец целевых значений 'target', которого нет в тестовом датасете, этот столбец необходимо удалить.
Шаг 4: построение и тестирование классификатора Для целей классификации будем использовать Random Forest Classifier, который настроим для предсказания меток источника данных в объединенном датасете. Можно использовать любой другой классификатор.
Используем стратифицированное рандомизированное разбиение на 4 фолда. Таким образом мы сохраним соотношение меток 'is_train' в каждом фолде как в исходной объединенной выборке. Для каждого разбиенения обучим классификатор на большей части разбиения и предскажем метку класса для меньшей отложенной части.
Шаг 5: интерпретация результатов Посчитаем значение метрики ROC AUC для нашего классификатора. На основе этого значения сделаем вывод, насколько хорошо наш классификатор выявляет ковариационный сдвиг в данных.
Получившееся значение близко к 0.5. А это значит, что наш классификатор по качеству такой же, как случайный предсказатель меток. Нет свидетельств наличия ковариационного сдвига в данных. Поскольку датасет взят с Kaggle, результат довольно предсказуем. Как и в других соревнованиях по машинному обучению, данные тщательно выверены, чтобы убедиться в отсутствии сдвигов. Но такой подход может быть применен в других задачах науки о данных для проверки наличия ковариационного сдвига непосредственно перед началом решения. Дальнейшие шаги Итак, либо мы наблюдаем ковариационных сдвиг, либо нет. Что же делать, чтобы улучшить качество модели на тесте?
Удаление смещенных признаков: Примечание: метод применим, если наблюдается ковариационный сдвиг в данных.
Данный алгоритм позволит удалить признаки из красной корзины на диаграмме. Использование весов важностей объектов на основе оценки коэффициента плотности Примечание: метод применим независимо от того, есть ли ковариационных сдвиг в данных.
Например, для первого объекта наш Random Forest Classifier считает, что он принадлежит обучающей выборке с вероятностью 0.397. Назовём эту величину . Или можно сказать, что вероятность принадлежности тестовым данным равна 0.603. Аналогично, назовём вероятность . Теперь небольшой трюк: для каждого объекта обучающего датасета вычислим коэффициент . Коэффициент говорит нам, насколько объект из обучающей выборки близок к тестовым данным. Основная мысль: Мы можем использовать как веса в любой из моделей, чтобы увеличить вес тех наблюдений, которые выглядят схожими с тестовой выборкой. Интуитивно это имеет смысл, так как наша модель будет более ориентирована на данные как в тестовом наборе. Эти веса могут быть вычислены с помощью кода:
Полученные коэффициенты можно передать модели, например, следующим образом:
Пара слов о полученной гистограмме:
Заключение Надеемся, что вам этот пост поможет вам в выявлении «ковариационного сдвига» в данных и борьбе с ним. Ссылки [1] Shimodaira, H. (2000). Improving predictive inference under covariate shift by weighting the log-likelihood function. Journal of Statistical Planning and Inference, 90, 227–244. Источник: habr.com Комментарии: |
|