Отчет Udacity Data Science NanoDegree.

Неудача — это не повод хвастаться. На самом деле это может быть хорошо, пока это не войдет в привычку. Как новый выпускник Udacity Data-Science NanoDegree (ну, почти. Этот блог является частью последнего проекта курса), я должен был иметь все инструменты для достижения успеха. Тем не менее, я почти потерпел неудачу. (1665 баллов из 2010 в публичной таблице лидеров конкурса). Что случилось?

Этот блог разделен следующим образом:

Фон

У NanoDegree есть окончательный проект, в котором вы можете выбирать между предоставленными упражнениями или внешними наборами данных по вашему выбору. Я выбрал внешний из PetFinder.my конкурс Kaggle, где проблема заключается в мультиклассовой классификации скоростей усыновления домашних животных на основе описаний домашних животных, которые включают данные в очень разнообразном формате. (табличные, текстовые, изображения). Цель состоит в том, чтобы создать модель, которая получает входные данные и предсказывает скорость внедрения как один из 5 классов. Метрика оценки — Квадратично взвешенная каппа. (измеряет согласие между двумя оценщиками, каждый из которых классифицирует N элементов в C). em> взаимоисключающие категории. Итог: это похоже на точность)

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

"Данные"

Содержит как обучающие/тестовые данные. Табличные данные представляют собой таблицу *.csv с числовой/текстовой информацией. Несколько числовых столбцов являются «естественными порядковыми номерами», такими как «Возраст (месяцы)» или «Плата». Большинство из них представляют собой кодировки («Порода»/«Цвет»), значение которых предоставляется в виде дополнительных файлов *.json. Снимок таблицы:

Данные для обучения содержат 14993 листинга. 55% собак, 45% кошек. Как указывалось ранее, метки содержат 5 классов [0,1,…,4] со списками [410, 3090, 3259, 4037, 4197] в каждом. Таким образом, мы видим, что метки несбалансированы.

Дополнительные файлы *.json предоставляют нам анализ настроений для текстовых описаний и анализ изображения для фотографий питомца (данные анализа изображений я фактически не использовал).

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

  • Выпало несколько столбцов (RescuerID, Name).
  • Преобразовали текстовое описание в векторное представление с помощью преобразования TF-IDF и выполнили уменьшение размерности с помощью SVD. Этот процесс называется Скрытый семантический анализ.
  • Добавлен анализ настроений для текстового описания. (Это не прямой процесс. Каждое слово в описании имеет «оценку» и «величину», поэтому требовалось средневзвешенное значение всех слов. Кроме того, в некоторых описаниях нет анализа.
  • Добавлены некоторые метаданные о фотографиях: их размер (кбайт), ширина, высота.
  • Передал фотографии через DNN ResNet-18 и извлек функции на выходе среднего слоя пула. (До полносвязного слоя). Затем я выполнил (снова) уменьшение размерности с помощью SVD для выходных векторов и добавил их.

  • Множество итераций попыток разработки функций. (Добавить это, удалить это, снова обучить, что случилось?)

Модель

Моделью, которую я обучал, была GBM (Gradient Boosting Machine). Это не преподавалось как часть наностепени. Это алгоритм обучения с учителем из семейства классификаторов ансамблевого обучения. В то время как случайные леса строят ансамбль глубоких независимых деревьев, GBM строят ансамбль мелких и слабых последовательных деревьев, где каждое дерево обучается и улучшает предыдущее. Шаг оптимизации подгоняет дерево по остаткам текущей итерации, добавляет результат и переходит к следующей итерации. Схематично:

Для метрики потерь MSE это эквивалентно шагу градиентного спуска. Фреймворк, который я использовал для реализации модели, был LightGBM. Данные были разбиты на 80–20 обучающих/тестовых выборок. Обучающие выборки были загружены в модель. Гиперпараметры модели были оптимизированы с помощью gridsearchCV с 5-кратной перекрестной проверкой. Я выбрал GBM для моделирования, потому что он считается одной из лучших моделей Kaggle.

Результаты

Как указано выше, наша метрика — QWK. Возможные значения находятся в диапазоне от 0 до 1. Чем выше балл, тем лучше. Для 5-кратной перекрестной проверки результаты моей модели (на кратность) были следующими:

Я также проверил кривую обучения модели:

Как видно, абсолютный балл CV не является хорошим. Это означает, что:

  • Моя модель была переобученной (большой разрыв между результатами обучения и CV).
  • Около 60% оценок скорости внедрения были неправильно классифицированы. (по тестовым данным)
  • Около 50% ошибочно классифицированных меток имели ошибку «1» единицу (что менее опасно, чем отсутствие на большее количество единиц времени).

Почему я потерпел неудачу и чему научился

Неудивительно, что курсы Udacity/Coursera дают вам инструменты, чтобы начать играть в игру, но они могут лишь продвинуть вас далеко вперед. Другое дело быть экспертом. Быть экспертом в соревнованиях Kaggle — это еще один уровень!

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

  • Данные, данные и еще раз данные. Я не использовал все данные, которые у меня были. Оглядываясь назад, я бы. Прочитав ядра других людей, я понял, что они извлекли каждую крупицу информации. Запустил NLP для анализа настроений, использовал анализ изображений с помощью Google Vision API. Добавлено больше данных из Интернета (например, численность населения штатов в Малезии) и множество других уловок, чтобы «выжать» каждый бит данных, который они могли, и даже больше из внешнего мира.
  • Победа в соревнованиях требует стратегии, планирования и методологии. На самом деле есть курсы, которые учат, как это делать, советы и рекомендации, сборы групп людей, работающих над проблемой и другие методы. Это чем-то похоже на подготовку к тестам SAT. Вы можете быть умным или опытным, но не подготовленным специально к тесту SAT. Я узнал об этом ПОСЛЕ того, как я закончил задание, и даже если бы я знал, мне не хватило времени, чтобы пройти его.
  • Соревнования Kaggle отнимают много времени. Я присоединился к конкурсу за неделю до его окончания (он был запущен более чем за 3 месяца до этого), и выделил на него всего около 20 часов работы, и много было потрачено на темы, связанные с учениями, а не непосредственно с соревнование. Этого просто не хватало.
  • Это сложная проблема. Моя оценка была паршивой, но в верхней публичной таблице лидеров был QWK 0,51. Это по-прежнему означает, что около 40% прогнозов не сбываются. Udacity/Coursera научат вас создавать различные модели машинного обучения, но их повышение до конкурентногопроизводительности выходит за рамки.

Объем доклада слишком мал, а инсайтов у меня еще много, но их придется подождать до следующего конкурса :)

Кратко: я представил задачу классификации в рамках конкурса kaggle. Он включал в себя различные типы данных и, следовательно, множество форм манипулирования данными и методов машинного обучения (GBM, DNN, NLP) для моделирования. Окончательные результаты были не очень хорошими, но урок противоположен тому, чтобы никогда не пытаться. Во время соревнований вы сталкиваетесь с реальными данными, реальными решениями других людей, изучаете новые методы и получаете новое представление о области машинного обучения и науки о данных. Это не заменяет изучение учебников и глубокое понимание, но, безусловно, дает вам адскую подготовку к решению реальных жизненных задач!

Для тех, кто пережил это чтение и интересуется структурой завершающего проекта/моими результатами, приглашаем ознакомиться с моим репозиторием GitHub с подробным решением Python. Любые комментарии приветствуются.

Ссылки

[1] Matlab / Глубокое обучение

[2] http://uc-r.github.io/gbm_regression