Как выделить целевую переменную pandas

Целевая переменная (Target Variable)

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Целевая (зависимая) переменная – признак Датасета (Dataset), который предстоит предсказывать Модели (Model) Машинного обучения (ML). Зависимой ее называют, поскольку в ходе Разведочного анализа данных (EDA) выявляется Корреляция (Correlation) между одной или несколькими переменными-предикторами (Predictor Variable) и рассматриваемым целевым признаком.

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Целевым признаком в соответствии с задачей является «Невыполнение кредитных обязательств». Мы передаем такую таблицу модели (Model) в качестве «образовательного материала». Иными словами, показываем модели, как выглядит профиль клиента, выплачивающего начисляемые проценты, и как выглядит профиль должника. Это фаза тренировки модели (Model Training).

Впоследствии на фазе тестирования (Model Testing) модель получает неполную таблицу (в столбце с целевой переменной пусто) с новыми данными, которых намеренно не поступало на фазе обучения. Дата-сайентист (Data Scientist) как бы создает передаваемую копию этой части данных и намеренно опустошает столбец с целевой переменной, чтобы протестировать предсказательную способность обученной модели. В случае с банком тестовая часть датасета выглядит так:

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Модель генерирует ряд предсказаний целевой переменной, который сравнивается с оригинальной, полной версией тестовых данных. Такая последовательность применима не ко всем типам данных, ко Временным рядам (Time Series) применима соответствующая Кросс-валидация (Cross Validation).

Разновидности целевых переменных

Существует несколько видов таргет-признаков:

Модель и тип целевой переменной

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

Источник

Универсальный подход (почти) к любой задаче машинного обучения

Любой data scientist ежедневно работает с большими объемами данных. Считается, что около 60% – 70% времени занимает первый этап рабочего процесса: очистка, фильтрация и преобразование данных в формат, подходящий для применения алгоритмов машинного обучения. На втором этапе выполняется предобработка и непосредственное обучение моделей. В сегодняшней статье мы сконцентрируемся на втором этапе процесса и рассмотрим различные техники и рекомендации, являющиеся результатом моего участия более чем в 100 соревнованиях по машинному обучению. Несмотря на то, что описанные концепции имеют достаточно общий характер, они будут полезны при решении многих конкретных задач.

Все примеры кода написаны на Python!

Данные

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Data in Database – данные в базе данных. Data Munging – фильтрация данных. Useful Data – полезные данные. Data Conversion – преобразование данных. Tabular Data – табличные данные. Data – независимые переменные (признаки). Labels – зависимые переменные (целевые переменные).

После того, как данные преобразованы в табличное представление, их можно использовать для обучения моделей. Табличное представление является наиболее распространенным представлением данных в сфере машинного обучения и интеллектуального анализа данных. Строки таблицы являются отдельными объектами (наблюдениями). Столбцы таблицы, содержат независимые переменные (признаки), обозначаемые X, и зависимые (целевые) переменные, обозначаемые y. В зависимости от класса задачи, целевые переменные могут быть представлены как одним, так и несколькими столбцами.

Типы целевых переменных

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

Метрика

При решении любой задачи машинного обучения, необходимо иметь возможность оценивать результат, то есть, необходима метрика. Например, для задачи двухклассовой классификации в качестве метрики обычно используется площадь под ROC-кривой (ROC AUC). В случае многоклассовой классификации обычно применяется категорийная кросс-энтропия (categorical cross-entropy). В случае регрессии – среднее квадратов отклонений (mean squared error, MSE).

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

Библиотеки

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

Следует сказать, что я не использую Anaconda (https://www.continuum.io/downloads). Anaconda объединяет в себе большинство популярных библиотек и существенно упрощает процесс установки, но мне необходимо больше свободы. Решать вам. 🙂

Фреймворк для машинного обучения

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Рисунок из публикации: Такур А., Крон-Гримберге А. AutoCompete: фреймворк для соревнований по машинному обучению. (A. Thakur and A. Krohn-Grimberghe, AutoCompete: A Framework for Machine Learning Competitions.)

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

На первом шаге определяется класс задачи. Это можно сделать, проанализировав целевую переменную. Задача может представлять собой классификацию или регрессию, классификация может быть двухклассовой или многоклассовой, классы могут пересекаться или не пересекаться. После того, как класс задачи определен, мы разделяем исходный набор данных на две части и получаем обучающий набор (training set) и валидационный набор (validation set), как показано на рисунке ниже.

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

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

В примере кода выше размер валидационного набора (eval_size) составляет 10% от исходного набора данных. Это значение следует выбирать, ориентируясь на объем исходных данных.

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

На следующем шаге мы определяем типы признаков. Наиболее распространены три типа: числовой, категорийный и текстовый. Давайте рассмотрим набор данных из популярной задачи о пассажирах «Титаника» (https://www.kaggle.com/c/titanic/data).

Описание переменных
survivalВыжил ли пассажир (0 – нет, 1 – да)
pclassКласс (1 – первый, 2 – второй, 3 – третий)
nameИмя
sexПол
ageВозраст
sibspКоличество братьев, сестер, супругов на борту
parchКоличество родителей, детей на борту
ticketНомер билета
fareСтоимость билета
cabinКаюта
embarkedМесто посадки (C – Шербур, Q – Куинстаун, S – Саутгемптон)

В этом наборе данных столбец survival содержит целевую переменную. На предыдущем шаге мы уже отделили целевую переменную от признаков. Признаки pclass, sex и embarked являются категорийными. Признаки age, sibsp, parch и подобные являются числовыми. Признак name является текстовым. Впрочем, я не думаю, что имя пассажира будет полезно при прогнозировании, выжил этот пассажир или нет.

Числовые признаки не нуждаются в преобразовании. Такие признаки в исходном виде готовы к нормализации и обучению моделей.

Категорийные признаки можно преобразовать двумя способами:

Не забудьте, что перед применением OneHotEncoder, необходимо преобразовать категории в числа с помощью LabelEncoder.

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

Текстовые признаки можно объединить следующим образом:

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Затем мы можем выполнить преобразование с помощью класса CountVectorizer или TfidfVectorizer библиотеки scikit-learn.

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Как правило, TfidfVectorizer обеспечивает лучший результат, чем CountVectorizer. На практике я выяснил, что следующие значения параметров TfidfVectorizer являются оптимальными в большинстве случаев:

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

На следующем шаге признаки, полученные в результате описанных выше преобразований, передаются в стекер (stacker). Этот узел фреймворка объединяет все преобразованные признаки в одну матрицу. Обратите внимание, в нашем случае речь идет о стекере признаков (feature stacker), который не следует путать со стекером моделей (model stacker), представляющим другую популярную технологию.

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Объединение признаков можно выполнить с помощью функции hstack библиотеки numpy (в случае неразреженных (dense) признаков) или с помощью функции hstack из модуля sparse библиотеки scipy (в случае разреженных (sparse) признаков).

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

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

Чтобы применять линейные модели, необходимо выполнить нормализацию признаков с помощью классов Normalizer или StandardScaler библиотеки scikit-learn.

Данные методы нормализации обеспечивают хороший результат только в случае неразреженных (dense) признаков. Чтобы применить StandardScaler к разреженным (sparse) признакам, в качестве параметра необходимо указать with_mean=False.

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Чтобы не усложнять, мы не будем рассматривать линейный дискриминантный анализ (linear discriminant analysis, LDA) и квадратичный дискриминантный анализ (quadratic discriminant analysis, QDA). В общем случае, для уменьшения размерности данных применяется метод главных компонент (principal component analysis, PCA). При работе с изображениями следует начинать с 10 – 15 компонент и увеличивать это значение до тех пор, пока результат существенно улучшается. При работе с другими видами данных можно начинать с 50 – 60 компонент.

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

В случае текстовых данных, после преобразования текста в разреженную матрицу можно применить сингулярное разложение (singular value decomposition, SVD). Реализация сингулярного разложения TruncatedSVD доступна в библиотеке scikit-learn.

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Количество компонент сингулярного разложения, которое, как правило, обеспечивает хороший результат в случае признаков, полученных в результате преобразования с помощью CountVectorizer или TfidfVectorizer, составляет 120 – 200. Большее количество компонент позволяет незначительно улучшить результат ценой существенных вычислительных затрат.

Выполнив описанные шаги, не забываем нормализовать признаки, чтобы иметь возможность применять линейные модели. Далее мы можем либо использовать подготовленные признаки для обучения моделей, либо выполнить отбор признаков (feature selection).

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Существуют различные методы отбора признаков. Одним из популярных методов является жадный алгоритм отбора признаков (greedy feature selection). Жадный алгоритм имеет описанную далее схему. Шаг 1: обучаем и оцениваем модель на каждом из исходных признаков; отбираем один признак, обеспечивший лучшую оценку. Шаг 2: обучаем и оцениваем модель на парах признаков, состоящих из лучшего признака, отобранного на предыдущем шаге, и каждого из оставшихся признаков; отбираем лучший признак из оставшихся. Повторяем аналогичные шаги, пока не отберем нужное количество признаков, или пока не будет выполнен какой-либо другой критерий. Вариант реализации данного алгоритма, где в качестве метрики используется площадь под ROC-кривой, доступен по следующей ссылке: https://github.com/abhishekkrthakur/greedyFeatureSelection. Следует отметить, что данная реализация неидеальна и требует определенных модификаций под конкретную задачу.

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

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

Отбор признаков также можно выполнить с помощью алгоритмов на основе градиентного бустинга. Рекомендуется использовать библиотеку xgboost вместо соответствующей реализации из scikit-learn, поскольку реализация xgboost намного более быстрая и масштабируемая.

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Алгоритмы RandomForestClassifier, RandomForestRegressor и xgboost также позволяют выполнять отбор признаков в случае разреженных данных.

Другой популярной техникой отбора неотрицательных признаков является отбор на основе критерия хи-квадрат (chi-squared). Реализация этого метода также доступна в библиотеке scikit-learn.

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

В коде выше мы применяем класс SelectKBest совместно с критерием хи-квадрат (chi2), чтобы отобрать 20 лучших признаков. Количество отбираемых признаков, по сути, является гиперпараметром, который необходимо оптимизировать, чтобы улучшить результат модели.

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

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

В общем случае, выбирая алгоритм машинного обучения, необходимо рассмотреть следующие варианты:

Какие же параметры следует оптимизировать? Как подобрать оптимальные значения параметров? Это наиболее распространенные вопросы, возникающие на этапе настройки гиперпараметров. Ответы на эти вопросы можно получить, только приобретая опыт работы с различными алгоритмами и комбинациями параметров на различных наборах данных. Следует также отметить, что не все опытные специалисты готовы поделиться своими секретами. К счастью, я имею достаточно большой опыт и охотно покажу вам свои наработки.

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

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

Метка RS* в таблице означает, что невозможно указать оптимальные значения и следует выполнить случайный поиск (random search).

Еще раз напомню, не забывайте сохранять все примененные преобразователи:

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

И не забывайте применять их к валидационному набору:

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

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

Источник

Как выделить целевую переменную pandas

Начнем с подключения необходимых библиотек

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

Рассмотрим следующий пример, на котором будет хорошо видно, что значит переобучение модели. Для этого нам понадобится сгенерировать синтетические данные. Рассмотрим зависимость \( y(x) = \cos(1.5\pi x) \), \( y \) — целевая переменная (таргет), а \( x \) — объект (просто число от \( 0 \) до \( 1 \)). В жизни мы наблюдаем какое-то конечное количество пар объект-таргет, поэтому смоделируем это, взяв \( 30 \) случайных точек \( x_i \) в отрезке \( [0;1] \). Более того, в реальной жизни целевая переменная может быть зашумленной (измерения в жизни не всегда точны), смоделируем это, зашумив значение функции нормальным шумом: \( \tilde_i = y(x_i) + \mathcal(0, 0.01) \):

Загрузка данных

Мы будем работать с данными из соревнования House Prices: Advanced Regression Techniques, в котором требовалось предсказать стоимость жилья. Давайте сначала загрузим и немного изучим данные ( train.csv со страницы соревнования).

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

Посмотрим сначала на значения целевой переменной:

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

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

Коэффициент корреляции Пирсона

Коэффициент корреляции Пирсона характеризует существование линейной зависимости между двумя величинами.

Посмотрим на признаки из начала списка. Для этого нарисуем график зависимости целевой переменной от каждого из признаков. На этом графике каждая точка соответствует паре признак-таргет (такие графики называются scatter-plot ).

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

Первая модель

Мы обучили первую модель и даже посчитали ее качество на отложенной выборке! Давайте теперь посмотрим на то, как можно оценить качество модели с помощью кросс-валидации. Принцип кросс-валидации изображен на рисунке

Как выделить целевую переменную pandas. Смотреть фото Как выделить целевую переменную pandas. Смотреть картинку Как выделить целевую переменную pandas. Картинка про Как выделить целевую переменную pandas. Фото Как выделить целевую переменную pandas

При кросс-валидации мы делим обучающую выборку на \( n \) частей (fold). Затем мы обучаем \( n \) моделей: каждая модель обучается при отсутствии соответствующего фолда, то есть \( i \)-ая модель обучается на всей обучающей выборке, кроме объектов, которые попали в \( i \)-ый фолд (out-of-fold). Затем мы измеряем качество \( i \)-ой модели на \( i \)-ом фолде. Так как он не участвовал в обучении этой модели, мы получим «честный результат». После этого, для получения финального значения метрики качества, мы можем усреднить полученные нами \( n \) значений.

Для того, чтобы иметь некоторую точку отсчета, удобно посчитать оптимальное значение функции потерь при константном предсказании.

Давайте посмотрим на то, какие же признаки оказались самыми «сильными». Для этого визуализируем веса, соответствующие признакам. Чем больше вес — тем более сильным является признак.

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

Для этого воспользуемся трансформером StandardScaler. Трансформеры в sklearn имеют методы fit и transform (а еще fit_transform ). Метод fit принимает на вход обучающую выборку и считает по ней необходимые значения (например статистики, как StandardScaler : среднее и стандартное отклонение каждого из признаков); transform применяет преобразование к переданной выборке.

Наряду с параметрами (веса \( w \), \( w_0 \)), которые модель оптимизирует на этапе обучения, у модели есть и гиперпараметры. У нашей модели это alpha — коэффициент регуляризации. Подбирают его обычно по сетке, измеряя качество на валидационной (не тестовой) выборке или с помощью кросс-валидации. Посмотрим, как это можно сделать (заметьте, что мы перебираем alpha по логарифмической сетке, чтобы узнать оптимальный порядок величины).

Работа с категориальными признаками

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

Посмотрим на размеры матрицы после OneHot-кодирования:

Как видим, количество признаков увеличилось более, чем в 3 раза. Это может повысить риски переобучиться: соотношение количества объектов к количеству признаков сильно сократилось.

Попытаемся обучить линейную регрессию с \( \ell_1 \)-регуляризатором. На лекциях вы узнаете, что \( \ell_1 \)-регуляризатор разреживает признаковое пространство, иными словами, такая модель зануляет часть весов.

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

Как видно из гистограммы, есть примеры с очень большими остатками. Попробуем их выбросить из обучающей выборки. Например, выбросим примеры, остаток у которых больше 0.95-квантили.

Видим, что качество модели заметно улучшилось! Также бывает очень полезно посмотреть на примеры с большими остатками и попытаться понять, почему же модель на них так сильно ошибается: это может дать понимание, как модель можно улучшить.

Источник

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *