С нуля научите новичков соревноваться в соревнованиях Kaggle

глубокое обучение

из среды

Автор: Орен Дар

Сборник "Сердце машины"

Участие: Лю Сяокунь, Ли Цзэнань, Лу Сюэ

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

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

Структура статьи:

  • вводить
  • Kaggle обзор
  • Создайте свою собственную среду
  • Введение в конкурс цен на жилье для прогнозов
  • Загрузка и проверка данных
  • Наши модели: введение в деревья решений, компромисс смещения и дисперсии, случайные леса
  • Предварительно обработанные данные
  • Интеграция и отправка результатов

вводить

В настоящее время мы можем найти в Интернете множество высококачественных бесплатных руководств по машинному обучению, таких как МООК. Год назад я прошел курс «Введение в машинное обучение» в Udacity, который, как мне показалось, очень удобен для начинающих. Здесь я изучил основные концепции машинного обучения, многие популярные алгоритмы и API scikit-learn. После окончания курса я отчаянно хотел узнать больше, но ненадолго потерялся.

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

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

Kaggle обзор

Целевая страница конкурса цен на жилье.

(Если вы уже знакомы с сайтом Kaggle, этот абзац можно пропустить)

На Kaggle есть два лучших конкурса для новичков (которые стали своего рода «вводными уроками» Kaggle):

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

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

На вкладке «Данные» вы можете увидеть краткое описание данных. Все, что нам нужно, это эти три файла: train.csv, test.csv и data_description.txt (это очень важно, так как он содержит подробное описание данных), поместите их в папку, к которой вы сможете быстро получить доступ.

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

Вкладка «Ядро» — это в основном приложение, кодовая версия раздела «Обсуждение», который я считаю самым важным разделом для начинающих. Где каждый может поделиться своими сценариями или заметками, связать любые наборы данных и конкурсы в виде документации, аннотаций, визуализаций и результатов, которые каждый может смотреть, голосовать, копировать даже в браузере. Просто запустите их! Два конкурса, которые я только что упомянул (Титаник, конкурс цен на дома), привели к интересным, красивым и успешным ядрам, и я настоятельно рекомендую просмотреть этот раздел после того, как опробую их самостоятельно. Kaggle постоянно улучшает функциональность ядра и теперь даже имеет «Только ядро» с бонусом Конкурс на 100 000 долларов. Тем не менее, обсуждения в ядре часто бывают жесткими, в них отсутствуют объяснения концепций или предполагается, что у вас есть соответствующие знания заранее, поэтому иногда это может быть немного сложно понять.

Создайте свою собственную среду

Я настоятельно рекомендую Python 3.6 для любой работы, связанной с наукой о данных, в среде Jupyter Notebook (наиболее популярный дистрибутив которого называется «Anaconda» и включает Python, Jupyter Notebook и множество полезных библиотек). Затем вы можете запустить среду в любое время, набрав Jupyter Notebook в терминале (или графическом интерфейсе Anaconda). В дополнение к этому, контент, показанный в этой статье, также может быть выполнен в частном ядре на веб-сайте Kaggle (полностью работающем в браузере), что эквивалентно блокноту Jupyter.

Прежде чем мы начнем, вот несколько основных моментов об использовании Jupyter Notebooks:

  • Вы можете ввести любое имя метода и нажать Tab, чтобы увидеть все возможные варианты;
  • Точно так же выберите любой метод и несколько раз нажмите Shift-Tab, чтобы открыть связанную с ним документацию в своем блокноте;
  • Введите %time перед любым оператором и выполните ячейку, чтобы вывести требуемое время выполнения;
  • Точно так же, если ввести %prun перед любым оператором и выполнить ячейку, она запустится в анализаторе кода Python и выведет результат.

Другие полезные команды можно найти здесь:Я Python.прочитайте документ S.IO/en/stable/i…

Руководство по прогнозированию цен на жилье

Обзор целей

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

Загрузка и проверка данных

Теперь, когда мы успешно запустили Jupyter Notebook, первое, что нужно сделать, это загрузить данные в Pandas DataFrame. Pandas — это мощная и популярная библиотека, которая выполняет всю работу, связанную с анализом данных, в Python, а DataFrame — это имя объекта, который она использует для хранения данных.

Нажмите Shift-Tab несколько раз, чтобы открыть документ.

В последней строке используется строковый формат Python 3.6 для загрузки CSV-файла, загруженного из Kaggle («значения, разделенные запятыми», общий формат, который можно открыть с помощью любого стандартного программного обеспечения, такого как Excel), в Pandas DataFrame. Мы будем использовать read_csv намного позже, поэтому рекомендуется сначала просмотреть его документацию (что является хорошей практикой). Загрузка данных и просмотр DataFrame показывают, что первый столбец в наборе данных — это идентификатор, который представляет собой индекс этой строки в наборе данных, а не истинное наблюдение. Поэтому я модифицировал код, добавив index_col="Id" в качестве параметра, чтобы при загрузке данных в DataFrame, убедитесь, что Pandas рассматривает его как индекс, а не как столбец, и добавьте перед ним новый индексный столбец.

Теперь давайте посмотрим, как выглядит тренировочный набор.

Структура данных обучающей выборки

Всего в обучающем наборе 80 столбцов (кроме Id), из которых 79 — независимые переменные, а 1 — зависимая переменная. Следовательно, тестовый набор должен иметь только 79 столбцов (независимых переменных). Большинство чисел и строк бессмысленны, а в столбце Alley даже все «NaN», т. е. пропущенное значение. Не волнуйтесь, мы разберемся с этим позже. Следующим шагом является рассмотрение модели, которую необходимо использовать. Начнем с обсуждения деревьев решений (иногда называемых деревьями регрессии применительно к задачам регрессии).

Как построить нашу модель

Введение в деревья решений

Основная идея очень проста: при изучении (подборе) обучающих данных дерево регрессии ищет все независимые переменные и все значения каждой независимой переменной, чтобы найти переменные и значения, которые лучше всего разделяют данные на две группы (математически говоря, дерево всегда выбирает разделение, которое минимизирует средневзвешенную дисперсию двух узлов), а затем вычисляет оценку (предпочтительно по выбранной метрике) и среднее значение зависимой переменной для каждой группы. Затем дерево регрессии рекурсивно повторяет этот процесс до тех пор, пока дальнейшее разбиение не станет возможным (если только не задано конкретное значение max_depth, как показано на рисунке ниже). Каждый узел на последнем уровне дерева называется «листом», и каждый связан со средним значением зависимой переменной (все наблюдения, относящиеся к этому листу).

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

Наглядный пример нашего набора данных с max_depth, установленным на 3.

В каждом узле дерева первый элемент — это правило разбиения для узла (независимые переменные и их значения переменных), второй элемент — это среднеквадратическая ошибка (MSE) всех наблюдений в этом узле, а третий элемент — это Количество наблюдений (выборок) узла, то есть размер этой группы. Значение последнего элемента представляет собой натуральный логарифм целевой переменной (цена дома). Этот процесс аналогичен жадному алгоритму.Оптимальная сегментация выполняется локально в каждом узле, что действительно может уменьшить значение среднеквадратичной ошибки по мере расширения дерева, и каждый конечный узел имеет связанное значение «Цена продажи».

Компромисс смещения и дисперсии

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

Если модель неадекватно соответствует обучающим данным, она будет иметь большое смещение (часто называемое недообучением), поэтому у нее будет большая ошибка обучения. Однако, если модель соответствует обучающим данным, она фиксирует особые отношения между переменными (случайно), что приводит к высокой дисперсии (часто называемой переобучением), и, следовательно, ее ошибка теста больше. Итак, нам нужно найти компромисс между предвзятостью и дисперсией.

переоснащение дерева решений

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

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

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

Решение: случайный лес

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

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

Теперь все, что мы делаем, это строим множество слабых классификаторов или слабых деревьев решений и берем их среднее, зачем нам это делать?

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

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

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

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

вернуться к игре

Предварительно обработанные данные

У нас есть еще одна вещь, которую нужно сделать, прежде чем мы запустим Random Forest: хотя Random Forest теоретически может обрабатывать категориальные функции (не данные: строки) и отсутствующие данные, реализация scikit-learn не поддерживает и то, и другое. Поэтому нам нужно использовать pd.interpolate() для заполнения пропущенных значений, а затем использовать «горячее кодирование» pd.get_dummies() для преобразования категориальных признаков в числовые. Этот метод очень прост, предположим, что категориальная переменная имеет n возможных значений. Столбец разделен на n столбцов, каждый из которых соответствует примитивному значению (эквивалентному «is_value?» для каждого примитивного значения). Каждое наблюдение (которое ранее имело строковое значение для категориальной переменной) теперь имеет столбец в столбце, соответствующем старому строковому значению. 1 и 0 во всех остальных столбцах.

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

Интегрируйте результаты и отправьте

Это весь код, который наша модель должна отправить в Kaggle — около 20 строк! Мы запустили код, а затем отправили результаты в Kaggle с оценкой 0,14978, что в настоящее время составляет около 63%. Неплохо для пяти минут кодирования! Здесь мы можем увидеть силу случайных лесов.

import pandas as pd
from sklearn.ensemble import RandomForestRegressor
PATH = "Oren/Kaggle/Housing Prices/" #where you put the files
df_train = pd.read_csv(f'{PATH}train.csv', index_col='Id')
df_test = pd.read_csv(f'{PATH}test.csv', index_col='Id')
target = df_train['SalePrice'] #target variable
df_train = df_train.drop('SalePrice', axis=1)
df_train['training_set'] = True
df_test['training_set'] = False
df_full = pd.concat([df_train, df_test])
df_full = df_full.interpolate()
df_full = pd.get_dummies(df_full)
df_train = df_full[df_full['training_set']==True]
df_train = df_train.drop('training_set', axis=1)
df_test = df_full[df_full['training_set']==False]
df_test = df_test.drop('training_set', axis=1)
rf = RandomForestRegressor(n_estimators=100, n_jobs=-1)
rf.fit(df_train, target)
preds = rf.predict(df_test)
my_submission = pd.DataFrame({'Id': df_test.index, 'SalePrice': preds})
my_submission.to_csv(f'{PATH}submission.csv', index=False)

инструкция

После загрузки обучающих и тестовых наборов в DataFrame по отдельности я сохранил целевую переменную и удалил ее в DataFrame (поскольку я хотел сохранить только независимые переменные и функции в DataFrame). Впоследствии я добавил новый временный столбец («training_set») в обучающий и тестовый наборы, чтобы мы могли объединить их (поместить в один и тот же DataFrame), а затем разделить. Мы продолжаем их интегрировать, заполнять пропущенные значения и преобразовывать категориальные функции в числовые с помощью One-Hot Encoding.

Как упоминалось ранее, случайные леса (и большинство других алгоритмов) будут хорошо работать, когда обучающий и тестовый наборы имеют одинаковые числа, поэтому при внесении изменений я хотел бы внести одинаковые изменения в оба набора данных. В противном случае интерполяция может заполнить разные значения в обучающем и тестовом наборах, а get_dummies может кодировать одни и те же категориальные признаки двумя разными способами, что приведет к снижению производительности. Затем я разбиваю его, удаляю временную колонку, строю случайный лес из 100 деревьев (обычно чем больше деревьев, тем лучше, но это также означает больше времени на обучение), используя все ядра процессора компьютера (n_jobs= - 1), используйте обучающий набор для подбора, используйте подобранный случайный лес, чтобы предсказать целевые переменные тестового набора, и сравните результаты с их соответствующими значениями. Идентификаторы помещаются в DataFrame и сохраняются в файл CSV. Затем войдите на страницу Kaggle, чтобы отправить файл CSV, и все готово!

Оригинальный адрес:к data science.com/machine-ahhh…

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