Category: Data Science

24
Мар
2021

📕 ТОП-10 книг по обработке естественного языка: от новичка до профессионала

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

24
Мар
2021

Интенсив «Профессия Data Scientist: учимся обработке и анализу данных за 3 дня»

На интенсиве по анализу данных поработаете с основными инструментами профессии, визуализируете данные, построите формулы и выявите зависимости на Python.
— Читать дальше «Интенсив «Профессия Data Scientist: учимся обработке и анализу данных за 3 дня»»

18
Мар
2021

Конференция EPAM Insider Казань

Эксперты EPAM познакомят IT-специалистов Казани с компанией, планами развития и карьерными возможностями.
— Читать дальше «Конференция EPAM Insider Казань»

12
Мар
2021

🤖📊 Как машинное обучение упорядочивает большие данные

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

Что такое большие данные?

Big Data – область, в которой рассматриваются различные способы систематического извлечения полезных для решения бизнес-задач знаний из больших объемов данных. Для этого существуют различные механические или алгоритмические процессы получения оперативной информации. Специалисты по Big Data работают с сырыми неструктурированными данными, результаты анализа которых используются для поддержки принятия решений. Аналитика включает проверку, преобразование, очистку и моделирование данных.

Анализ больших данных – относительно новая, но довольно востребованная сфера рынка труда. Спрос на специалистов в этой области постоянно растет.

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

Аналитик Big Data – специалист, который выявляет и исследует закономерности в данных с помощью специальных программных средств.

5V больших данных


Работа с большими данными строится вокруг пяти основных принципов (c англ. V’s of Big Data: Volume, Velocity, Variety, Veracity, Value):

  1. Объем: количество собираемой компаниями информации действительно огромно, поэтому ее объем становится критическим фактором в аналитике.
  2. Скорость: практически все происходящее вокруг нас (поисковые запросы, социальные сети и т. д.) очень быстро генерирует новые данные, многие из которых могут быть использованы в бизнес-решениях.
  3. Разнообразие: генерируемая информация неоднородна и может быть представлена в различных форматах, таких, например, как видео, текст, базы данных, числа, сенсорные данные и т. д. Понимание типов больших данных является ключевым фактором для раскрытия их ценности.
  4. Достоверность: данные высокой достоверности содержат много записей, которые ценны для анализа и которые вносят значимый вклад в общие результаты. Данные с низкой достоверностью содержат высокий процент бессмысленной информации, которая называется шумом.
  5. Ценность: возможность трансформировать большие данные в бизнес-решения.

Откуда получают большие данные


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

Некоторые из основных источников Big Data:

  • Социальные сети;
  • Облачные Хранилища;
  • Веб-страницы;
  • Интернет вещей.

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

Что такое машинное обучение?


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

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

  • Сегментацию данных;
  • Анализ данных;
  • Моделирование.

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

Как машинное обучение применяется в Big Data?

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

Примеры применения алгоритмов МО для больших данных

Автоматизация Маркетинга

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

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

Анализ тональности текста


Анализ тональности текста – мощный инструмент для запуска нового продукта или внедрения новых функций. Тренированные на больших данных модели машинного обучения позволяют с высокой точностью предсказать реакцию клиентов: полюбят ли они продукт или полностью проигнорируют его. Предсказание результатов возможно в самом начале разработки продукта! Это позволяет изменить дизайн или маркетинговую стратегию в соответствии с потребностями рынка.

Рекомендательные системы

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

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

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

Регулирование рисков

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

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

Расшифровка паттернов

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

Прогнозная аналитика


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

***

Мы рассмотрели возможности и сферы применения машинного обучения в больших данных. Если вы еще не определились со специализацией, начните с базового онлайн-курса «Библиотеки программиста» по математике в Data Science. Без царицы наук в этой области обойтись не получится, а с помощью опытных преподавателей из ведущих вузов страны получить знания намного проще, чем самостоятельно по книгам. Также ведется запись и на продвинутый курс. Удачи в освоении востребованной профессии!

09
Мар
2021

Интенсив «Как выбрать язык программирования и найти работу»

Познакомитесь с различными языками и направлениями в программировании, узнаете о профессии и карьере разработчика. Поймёте, что вам интереснее, и подберёте подходящую специализацию.
— Читать дальше «Интенсив «Как выбрать язык программирования и найти р…

08
Мар
2021

🤖 Классификация одежды из набора данных DeepFashion с помощью Fastai

Статья описывает мультиклассовую классификацию изображений на основе модели ResNet34 с помощью популярных библиотек PyTorch и Fastai. Автор начинает с ревизии зимней одежды и заканчивает нейросетями.

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

Фото <a href="https://www.shutterstock.com/de/g/Roman+Samborskyi" target="_blank" rel="noopener noreferrer nofollow">Романа Самборского</a> использовано по лицензии <a href="https://www.shutterstock.com/" target="_blank" rel="noopener noreferrer nofollow">Shutterstock.com</a>.
Фото Романа Самборского использовано по лицензии Shutterstock.com.

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

Эта статья состоит из следующих частей:

  1. Данные.
  2. Обучение модели.
  3. Оценка модели.
  4. Как загрузить предобученную модель из Fastai в PyTorch.
  5. Заключение.

Хотя я годами использовала для глубокого обучения Keras, на этот раз я решила дать шанс PyTorch и Fastai. Полный код, использованный в этой статье, можно найти здесь.

Данные

Чтобы определить, к каким категориям относятся предметы моего гардероба, мне потребуется модель, обученная для решения этой задачи, а для обучения такой модели нужны данные. В этом проекте я использовала набор данных DeepFashion, огромную базу данных для предсказания категории и атрибутов одежды, собранную Лабораторией Мультимедия Китайского университета в Гонконге.

Набор данных DeepFashion
Набор данных DeepFashion

Критерий оценки классификации был опубликован в 2016-м. Он оценивает производительность модели FashionNet в предсказании 46 категорий и 1000 атрибутов одежды. Оригинальный документ можно найти здесь: “DeepFashion: надежное распознавание и восстановление одежды с подробными аннотациями”, CVPR 2016.

База данных DeepFashion содержит несколько наборов данных. В этом проекте мы используем набор “Category and Attribute Prediction” (“предсказание категории и атрибутов”). Этот набор содержит 289.222 разнообразных изображений одежды, принадлежащих 46 различным категориям.

Метки классов для обучения хранятся в train_labels.csv в следующем формате:

Файл тренировочных данных
Файл тренировочных данных

Этот файл тренировочных данных содержит расположение файлов изображений и метки. Метки хранятся как строковые объекты, по одной на изображение.

Мы можем загрузить эти данные train_labels.csv в класс ImageDataLoaders с помощью метода from_csv:

        data = ImageDataLoaders.from_csv(PATH, csv_fname=TRAINING_PATH,
                                 item_tfms=Resize(300),
                                 batch_tfms=aug_transforms(size=224, min_scale=0.9),
                                 valid_pct=0.1,
                                 splitter=RandomSplitter(seed=42), #seed=42
                                 num_workers=0)
    

Я использую стратегию дополнения (augmentation) данных Fastai, называемую предмасштабированием (presizing). Она сначала сокращает изображения до квадратов меньшего размера. Это позволяет выполнять будущие дополнения изображений быстрее, поскольку квадратные изображения можно обрабатывать на GPU. Затем мы применяем дополнение к каждому пакету данных (batch). batch_tfms производит все дополнения вроде поворотов и масштабирований последовательно, с единственной интерполяцией в конце. Эта стратегия дополнения позволит нам добиться лучшего качества дополненных изображений и выиграть в скорости обработки вследствие обработки на GPU.

Давайте посмотрим на некоторые изображения из нашего набора данных.

        data.show_batch(max_n=6, nrows=1)
    
Тренировочные изображения с метками
Тренировочные изображения с метками

Мы также можем проверить, как выглядят дополненные изображения, передав параметр showImage=True в упомянутый выше метод show_batch().

Дополненные изображения
Дополненные изображения

Как видите, изображения сохранили свое качество после дополнения.

Обучение модели

В этом проекте я использовала предобученную модель ResNet34. Я экспериментировала с более современными архитектурами, но они не привели к существенному улучшению. Основная сложность набора данных DeepFashion – это качество меток. Например, на приведенном выше рисунке видны два предмета одежды: блуза и шорты, но его метка лишь “блуза”. Таким образом, модель будет неизбежно страдать от шума.

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

        learn = cnn_learner(data, resnet34, metrics=accuracy, pretrained=True)
learn.fine_tune(2)
learn.save('stage-1_resnet34')
    

Когда мы вызываем learn.fine_tune(), мы замораживаем всю нейронную сеть и обучаем случайно инициализированные веса нашего нового слоя одну эпоху. Затем мы размораживаем сеть и обучаем все ее слои заданное количество эпох (в нашем случае две). Вот почему в выходных данных мы видим одну “лишнюю” эпоху.

Ранняя оценка (Early evaluation)

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

        interp = ClassificationInterpretation.from_learner(learn)
interp.most_confused(min_val=70)
    

Как можно заметить, нейронная сеть чаще всего путает ‘Top’ (топ) с ‘Blouse’ (блузкой), ‘Romper’ (комбинезон) с ‘Dress’ (платьем) и ‘Tee’ (футболку) с ‘Blouse’ (блузкой). Даже человек может сделать такие ошибки. Таким путем мы можем на раннем этапе оценить, правильно ли обучается наша нейронная сеть.

Другой способ посмотреть на ошибки – это вывести объекты с максимальными значениями функции потерь:

        interp.plot_top_losses(6, nrows=2)
    
Объекты с максимальными значениями функции потерь (ранняя оценка)
Объекты с максимальными значениями функции потерь (ранняя оценка)

Как мы уже говорили, в исходных метках немало шума. Наша модель правильно распознала Jumpsuit (комбинезон), две Skirt (юбки) и Dress (платье), тогда как метки для этих предметов в наборе данных были неверными.

Поиск скорости обучения

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

        learn = cnn_learner(data, resnet34, metrics=accuracy)
lr_min, lr_steep = learn.lr_find()
    
Кривая потерь
Кривая потерь

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

        learn.fine_tune(2, base_lr=5e-3)
    

После обучения модели на протяжении 3 эпох мы получили точность 0.697, что является улучшением по сравнению с 0.694, которую мы получили при скорости обучения, установленной по умолчанию.

Дискриминационные скорости обучения

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

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

Кривая потерь после трех эпох обучения
Кривая потерь после трех эпох обучения

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

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

        learn.fit_one_cycle(6, lr_max=slice(1e-7, 1e-3))
    

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

Тренировочные и валидационные потери
Тренировочные и валидационные потери

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

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

На предыдущем шаге мы сумели достичь Топ-1 точности 70.4% на валидационном наборе данных. Если мы выведем график валидационной точности, мы сможем увидеть, как она улучшается с каждой эпохой обучения.

Ввалидационная точность Топ-1 на каждой эпохе
Ввалидационная точность Топ-1 на каждой эпохе

Оценка на тренировочном наборе данных

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

        learn.show_results()
    
Оценка на тренировочных данных
Оценка на тренировочных данных

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

Оценка на тестовом наборе данных

А теперь давайте загрузим тестовые данные и проверим, как модель работает на них.

        test_img_data = ImageDataLoaders.from_csv(PATH, csv_fname=TEST_PATH,
                                 item_tfms=Resize(224), 
                                 num_workers=0)
learn.data = test_img_data
learn.validate()
learn.show_results()
    
Оценка на тестовых данных
Оценка на тестовых данных

Тестовая точность Топ-1 нашей модели равна 70.4%. Она неправильно классифицирует некоторые объекты, но все-таки очень близка к результату, который мы получили на валидационном наборе.

Авторы исходной статьи “DeepFashion: надежное распознавание и восстановление с подробными аннотациями”, CVPR 2016 использовали точность Топ-3 и Топ-5 для этой оценки.

DeepFashion: надежное распознавание и восстановление с подробными аннотациями, CVPR 2016
DeepFashion: надежное распознавание и восстановление с подробными аннотациями, CVPR 2016

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

        # https://forums.fast.ai/t/return-top-k-accuracy/27658/3
# модифицировано для работы на PyTorch 1.7.1
def accuracy_topk(output, target, topk=(3,)):
    """Computes the accuracy for the specified values of k"""

    maxk = max(topk)
    batch_size = target.size(0)

    _, pred = output.topk(maxk, 1, True, True)
    pred = pred.t()
    correct = pred.eq(target.view(1, -1).expand_as(pred))

    res = []
    for k in topk:
        correct_k = correct[:k].contiguous().view(-1).float().sum(0, keepdim=True)
        res.append(correct_k.mul_(100.0 / batch_size))
    return res

output, target = learn.get_preds()

print(accuracy_topk(output=output, target=target))
print(accuracy_topk(output=output, target=target, topk=(5,)))
    

Точность Топ-3 нашей модели равна 88.6%, что на 6% выше исходной точности, а точность Топ-5 нашей модели равна 94.1%, что на 4% выше исходной. Это не должно нас удивлять, поскольку авторы исходной статьи использовали в качестве базовой архитектуры VGG16, менее мощную модель, чем наша ResNet34.

Оценка на пользовательском наборе данных

Наконец-то мы можем проверить, как наша модель работает на моих изображениях. Я сняла 98 изображений своих предметов одежды на камеру смартфона. Давайте загрузим эти изображения и проверим, сможет ли модель правильно их классифицировать.

        test_dict = {}
size = 224,224
missclassified_list = []

reader = csv.DictReader(open(PATH + CUSTOM_DATASET_PATH))

for row in reader:
    test_dict[row["image_name"]] = row["category_name"]

for key, value in test_dict.items():
    predicted = learn.predict(PATH + key)[0]
    print("Predicted: ", predicted, "True: ", value)
    img=Image.open(PATH + key)
    img.thumbnail(size,Image.ANTIALIAS)
    display(img)
    if predicted != value:
        missclassified_list.append((predicted, value))
    

Точность модели Топ-1 на пользовательских данных равна 62.4%, что ниже показателя для набора данных DeepFashion. Однако она все еще хороша для модели классификации с 46 классами.


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

Как загрузить предобученную модель из Fastai в PyTorch

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

        modelname = learn.model
modelname.cpu()
torch.save(modelname, 'stage-1_resnet34.pkl')

with open(PATH+CLASSES_PATH, 'w') as f:
    for item in data.vocab:
        f.write("%s\n" % item)
    

torch.save сохраняет веса предобученной модели. Она использует утилиту Python pickle для сериализации. Чтобы запустить модель на PyTorch, нам нужно загрузить веса и заново определить модель:

        class ClassificationModel():
    
    def __init__(self):
        return
        
    def load(self, model_path, labels_path,  eval=False):
      
        self.model = torch.load(model_path)
        self.model = nn.Sequential(self.model)
        
        self.labels = open(labels_path, 'r').read().splitlines()
        
        if eval:
            print(model.eval())
        return
    
    def predict(self, image_path):
        
        device = torch.device("cpu")
        img = Image.open(image_path)
        
        test_transforms = transforms.Compose([transforms.Resize(224),
                                      transforms.ToTensor(),
                                      transforms.Normalize([0.485, 0.456, 0.406],
                                                           [0.229, 0.224, 0.225])
                                     ])
        
        image_tensor = test_transforms(img).float()
        image_tensor = image_tensor.unsqueeze_(0)
        inp = Variable(image_tensor)
        inp = inp.to(device)
        output = self.model(inp)
        index = output.data.cpu().numpy().argmax()
        return self.labels[index]
    

Заметьте, что на этот раз мы должны масштабировать и нормализовать изображения, прежде чем запускать предсказание. Библиотека Fastai хранит информацию о трансформациях, которые нужно произвести, в learner’е, но когда мы запускаем модель за пределами Fastai, мы должны сначала масштабировать изображения.

После этого мы можем запускать предсказания, используя определенный нами класс:

        learner = ClassificationModel()
learner.load(MODEL_PATH, CLASSES_PATH)
learner.predict(DATA_PATH+"img-phone-jpg\IMG_2966.jpg")
    

Заключение

В этом руководстве я показала, как обучить модель ResNet34 для распознавания типа одежды, используя библиотеку Fastai и набор данных DeepFashion. Мы увидели, что мы можем обучить модель, которая превзойдет текущие базовые показатели на 6% для точности Топ-3 и на 4% для точности Топ-5. Мы запустили оценку для моих собственных изображений и убедились, что модель классифицировала предметы правильно, если не считать предметы, чувствительные к масштабу (проблема “штаны или шорты”). Производительность модели можно еще улучшить, если повысить качество тренировочных меток или повысить разнообразие изображений.

02
Мар
2021

🤖 Современные рекомендательные системы

Сегодня мы поглубже нырнем в особенности работы алгоритмов искусственного интеллекта, на которых построили бизнес Facebook, Google и другие ИТ-гиганты.

Не далее чем в мае 2019 Facebook выложил в открытый доступ исходный код некоторых своих подходов к рекомендациям и представил DLRM (Deep-Learning Recommendation Model – рекомендательную модель глубокого обучения). Эта статья попробует объяснить, как и почему DLRM и другие современные подходы к рекомендациям работают настолько хорошо, посредством анализа их происхождения от прежних результатов в данной области и детального объяснения внутренних деталей их работы и заложенных в них идей.


Персонализированная реклама, основанная на ИИ, сегодня царствует в онлайн-маркетинге, и такие компании, как Facebook, Google, Amazon, Netflix и прочие – короли джунглей этого онлайн-маркетинга, поскольку они не просто усвоили этот тренд, а фактически сами воплотили его в жизнь и построили на нем всю свою бизнес-стратегию. Netflix’овские “другие фильмы, которые могут вам понравиться” и Amazon’овские “люди, купившие это, купили также…” – всего лишь несколько примеров из реального мира.

Само собой, будучи постоянным пользователем Facebook и Google, в какой-то момент я спросил себя:

КАК ИМЕННО ЭТА ШТУКА РАБОТАЕТ?

И, разумеется, мы все уже видели базовый пример рекомендации фильмов, объясняющий, как работают коллаборативная фильтрация и факторизация матриц. Я также не говорю о подходе обучения простого классификатора для каждого пользователя, который будет выдавать вероятность того, что этому пользователю понравится тот или иной продукт. Эти два подхода, называемые коллаборативной фильтрацией и рекомендацией, основанной на контексте, наверняка более-менее эффективны и выдают предсказания, которые можно использовать, но у Google, Facebook и прочих наверняка должно быть что-нибудь получше, какой-нибудь “туз в рукаве”, иначе они бы не были там, где они находятся сейчас.

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

предсказания, насколько данному пользователю понравится данный продукт,

которая в мире онлайнового маркетинга складывается в предсказание показателя кликабельности (click-through rate, CTR) для возможных рекламных объявлений, основанное как на явной обратной связи (рейтинги, лайки и т.п.), так и на неявной (клики, истории поиска, комментарии или посещения веб-сайтов).

Коллаборативная фильтрация против фильтрации на основе содержимого

1. Фильтрация на основе содержимого (content-based filtering)

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

2. Коллаборативная фильтрация

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

Недостаток классической MF в том, что мы не можем использовать никакие признаки, кроме пользовательских оценок – например, жанр фильма, год выхода и т.д. – MF приходится догадываться обо всем этом из имеющихся оценок. Кроме того, MF страдает от так называемой “проблемы холодного старта”: новый фильм, который еще никто не оценил, не может быть рекомендован. Фильтрация на основе содержимого справляется с этими двумя проблемами, но ей не хватает предсказательной мощности просмотра предпочтений других пользователей.

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

1. Машина Факторизации (Factorization Machine)

Одна из идей гибридной модели, предложенная Стеффеном Рендлом в 2010-м – это Машина Факторизации. Она придерживается базового математического подхода, комбинируя факторизацию матриц с регрессией:

y^(x):=w0+∑i=0nwixi⏟regressionpart+∑i=1n∑j=i+1n⟨vi,vj⟩xixj⏟MFpartw0∈R;w∈Rn;V∈Rn∗k;vi,vj∈Rk

Здесь <vi, vj> – произведение векторов, которые можно рассматривать как строки матрицы V.

Понять смысл этого уравнения довольно просто, если посмотреть на пример представления данных x, попадающих в эту модель. Давайте рассмотрим пример, представленный Стеффеном в его статье о Машине Факторизации.

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

  • пользователь u из множества U = {Alice (A), Bob (B),…}
  • фильм i из множества I = {“Титаник” (TN), “Ноттинг Хилл” (NH), “Звездные Войны” (SW), “Стар Трек” (ST),…}
  • оценка r из {1, 2, 3, 4, 5}, поставленная во время t.
Рис.1. С. Рендл, "Машины факторизации", Международная конференция IEEE по Data Mining, 2010.
Рис.1. С. Рендл, “Машины факторизации”, Международная конференция IEEE по Data Mining, 2010.

Посмотрев на приведенный выше рисунок, мы увидим представление данных в гибридной рекомендательной модели. Как разреженные признаки, представляющие пользователя и оцениваемый объект, так и любая другая дополнительная информация об объекте или мета-информация (в этом примере – Time и Last Movie Rated) попадают в вектор признаков x, который соответствует значению целевой переменной y. Теперь главное – то, как они обрабатываются моделью.

  • Регрессионая часть FM обрабатывает и разреженные, и плотные данные (например, Time), как обычная задача линейной регрессии, и, таким образом, может считаться подходом фильтрации на основе содержимого в составе FM.
  • Часть MF отвечает за взаимодействие между блоками признаков (например, взаимодействие между “Пользователем” и “Фильмом”), где матрицу V можно рассматривать как встроенную матрицу, используемую в подходах коллаборативной фильтрации. Эти отношения пользователь-фильм предоставляют нам догадки вроде:

Пользователю i, которому соответствует вектор vi (представляющий его предпочтения к параметрам фильмов), похожий на вектор vj пользователя j, скорее всего, понравятся те же фильмы, что и пользователю j.

Сложение вместе предсказаний регрессионной части и части MF и одновременное обучение их параметров в одной функции потерь приводит к гибридной модели FM, которая теперь использует подход “лучшее из обоих миров” для выдачи рекомендации пользователю.

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

если взять нейронную сеть, то будет еще лучше!

2. Широкие и глубокие: нейронная коллаборативная фильтрация (NCF) и Глубокие Машины Факторизации (DeepFM)

Для начала бросим взгляд на то, как можно реализовать коллаборативную фильтрацию с помощью нейронных сетей, просмотрев статью об NCF. В конце концов это приведет нас к Глубоким Машинам Факторизации (DeepFM), представляющим собой нейросетевую версию машин факторизации. Мы увидим, почему они превосходят обычные машины факторизации, и как можно интерпретировать архитектуру этих нейронных сетей. Мы увидим, что DeepFM была разработана как улучшение вышедшей до этого модели Wide&Deep от Google, которая была одним из первых крупных прорывов в области глубокого обучения рекомендательных систем. В конце концов это приведет нас к упомянутой выше статье по DLRM, опубликованной Facebook’ом в 2019-м, которую можно считать упрощением и небольшим усовершенствованием DeepFM.

NCF

В 2017-м группа исследователей опубликовала свою работу о Нейронной Коллаборативной Фильтрации (NCF). Она содержит обобщенный фреймворк для изучения нейронных зависимостей, моделируемых факторизацией матриц при коллаборативной фильтрации с помощью нейронной сети. Авторы также объяснили, как получить зависимости высшего порядка (MF имеет порядок всего лишь 2), и как объединить оба эти подхода.

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

Рис. 2. Из статьи "Нейронная коллаборативная фильтрация" Кс. Хе, Л. Ляо, Х. Жанг, Л. Ни, Кс. Ху, Ц. Чуа – Материалы 26-й международной конференции по World-Wide Web, 2017.
Рис. 2. Из статьи “Нейронная коллаборативная фильтрация” Кс. Хе, Л. Ляо, Х. Жанг, Л. Ни, Кс. Ху, Ц. Чуа – Материалы 26-й международной конференции по World-Wide Web, 2017.

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

В реальных задачах мы не просто используем двоичные векторы, соответствующие пользователю и объекту в качестве необработанных данных для их представления, но, очевидно, включаем и прочую дополнительную или мета-информацию, которая может представлять ценность (например, возраст, страну, аудио- и текстовые записи, метки времени,…), так что в реальности у нас получается набор данных очень высокой размерности, сильно разреженный и содержащий смесь качественных переменных с количественными. К этому моменту представленную на рис. 2 нейронную сеть можно считать и рекомендацией на основе содержимого в виде простого нейронного бинарного классификатора прямого прохода. И эта интерпретация – ключевая для понимания того, почему этот подход в конце концов оказывается гибридным между коллаборативной фильтрацией и рекомендациями на основе содержимого. Эта нейронная сеть может усвоить любые функциональные зависимости – например, взаимодействия 3-й степени и выше, вроде x1 * x2 * x3, или любые нелинейные трансформации в классическом понимании, используемом в нейронных классификаторах – в виде sigma(.. sigma(w1x1+w2x2+w3x3+b)).

Вооружившись мощью изучения зависимостей высшего порядка, мы можем использовать простой способ изучения зависимостей 1-го и 2-го порядков, скомбинировав нейронную сеть с широко известной моделью для их изучения, Машиной Факторизации. Именно это авторы DeepFM предложили в своей статье. Идея этой комбинации – параллельно изучать зависимости между признаками низких и высоких порядков – ключевая часть многих современных рекомендательных систем, и в том или ином виде ее можно найти почти в каждой архитектуре нейронной сети, предлагаемой в этой области.

DeepFM

DeepFM – это смешанный подход, включающий факторизацию матриц и глубокую нейронную сеть, причем оба используют один и тот же входной слой представления (embedding). Необработанные признаки трансформируются, чтобы закодировать категориальные признаки унитарным кодом (one-hot encoding). Итоговое предсказание (показатель кликабельности), выдаваемое последним словом нейронной сети, определяется так:

y^=sigmoid(yFM+yDNN)

То есть, это сумма предсказаний матричной факторизации и нейронной сети, пропущенная через сигмоидную функцию активации.

Компонент факторизации матриц – это обычная Машина Факторизации, оформленная в стиле архитектуры нейронной сети:

Рис. 3. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе "DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017
Рис. 3. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе “DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017

Часть сложения (Addition) этого слоя матричной факторизации получает вектор входных данных x от слоя разреженных признаков (Sparse Features) и умножает каждый элемент на его вес (Normal Connection) перед суммированием. Часть перемножения векторов (Inner Product) также получает вектор x, но только после его прохождения через слой представления и просто перемножает представленные векторы без весов (“Weight-1 Connection”). Сложение обеих частей вместе приводит к вышеупомянутому уравнению для Машины Факторизации:

yFM:=w0+∑i=0nwixi+∑i=1n∑j=i+1n⟨vi,vj⟩xixj

В этом уравнении перемножение xixj нужно только для записи суммы от 1 до n. Оно не является частью вычислений нейронной сети. Нейронная сеть автоматически знает, произведение каких векторов vi и vj потребуется, благодаря архитектуре слоя представления.

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

Рис. 4. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе "DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017
Рис. 4. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе “DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017

Здесь Vp – матрица представлений для каждого поля p={1,2…,m} c k столбцами и количеством строк, соответствующим количеству элементов поля, закодированных двоичным образом. Выход этого слоя представления определяется как

a(0)=[e1,e2,…em]

и важно отметить, что этот слой не полносвязный, а именно – нет связей между необработанным входом любого поля и представлением любого другого поля. Представьте это следующим образом: вектор значений для пола (например, (0, 1)), закодированный унитарным кодом, не может иметь ничего общего с вектором представлений для дня недели (например, вектором (0, 1, 0, 0, 0, 0, 0), закодированный “Вторник”, или его вектором представления, например, для k=4, (12, 4, 5, 9).

Компонент FM – это Машина Факторизации, отражающая высокую важность взаимодействий 1 и 2 порядка, которые прямо складываются с выходом глубокого компонента и передаются в сигмоидную функцию активации последнего слоя.

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

Рис. 5. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе "DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017
Рис. 5. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе “DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017

Нейронная сеть на основе стандартного многослойного перцептрона со слоем представления между необработанными данными (сильно разреженными после унитарного кодирования категориальных переменных) и следующими слоями нейронной сети описывается следующей формулой:

a(l+1)=σ(W(l)a(l)+b(l))

где sigma – функция активации, W – матрица весов, a – результат функции активации предыдущего слоя, а b – порог.

Это приводит к общей архитектуре нейронной сети DeepFM:

Рис. 6. Общая архитектура DeepFM
Рис. 6. Общая архитектура DeepFM

со следующими параметрами:

  • Скрытый вектор Vi для измерения влияния взаимодействий признака i с другими признаками (слой представления).
  • Vi передается в компонент FM для моделирования взаимодействий 2 порядка (компонент FM).
  • wi взвешивает важность необработанного признака i 1-го порядка (компонент FM).
  • Vi также передается в Глубокий компонент для моделирования всех взаимодействий высших порядков (>2)(Глубокий компонент).
  • WI и bI – веса и пороги нейронной сети (Глубокий компонент).

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

Сравнение с Wide&Deep и NeuMF

Есть много вариаций, о которых можно задуматься, чтобы “отполировать” эту архитектуру и сделать ее еще лучше. Однако в основном все они сходятся в своем гибридном подходе, заключающемся в одновременной обработке взаимодействий высших и низших порядков. Авторы DeepFM также предложили замену многоуровневого перцептрона на так называемую PNN, глубокую нейронную сеть, получающую в качестве входных данных выводы FM и слоя представления.

Авторы статьи про NCF также предложили похожую архитектуру, которую они назвали NeuMF (Neural Matrix Factorization – нейронная факторизация матриц). Вместо использования FM в качестве компонента низшего порядка они используют обычную факторизацию матриц, результаты которой передаются в функцию активации. Этому подходу, однако, не хватает взаимодействий 1 порядка, моделируемых линейной частью FM. Авторы также указали, что модель имеет различные представления пользователя и объекта для матричной факторизации и многослойного перцептрона.

Как упомянуто выше, команда исследователей Google была одной из первых, предложивших нейронные сети для гибридного подхода к рекомендации. DeepFM можно рассматривать как дальнейшеее развитие алгоритма Wide&Deep от Google, который выглядит примерно так:

Рис. 7. Х-Т Ченг, Л. Кос, Дж. Хармсен, Т. Шакед, Т. Чандра, Х. Арадхье, Г. Андерсон, Г. Коррадо, В. Чаи, М. Испир, Р. Анил, З. Хак, Л. Хонг, В. Джейн, Кс. Лю и Х. Шах. "Широкое и глубокое обучение для рекомендательных систем" – Материалы 1 семинара по глубокому обучению для рекомендательных систем, стр. 7-10, 2016.
Рис. 7. Х-Т Ченг, Л. Кос, Дж. Хармсен, Т. Шакед, Т. Чандра, Х. Арадхье, Г. Андерсон, Г. Коррадо, В. Чаи, М. Испир, Р. Анил, З. Хак, Л. Хонг, В. Джейн, Кс. Лю и Х. Шах. “Широкое и глубокое обучение для рекомендательных систем” – Материалы 1 семинара по глубокому обучению для рекомендательных систем, стр. 7-10, 2016.

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

ϕk(x)=∏i=1dxickicki∈{0,1}

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

Легко видеть, что DeepFM является развитием этой модели, поскольку она не требует никакого предварительного конструирования признаков и может обучиться взаимодействиям низкого и высокого порядка на основе одних и тех же входных данных, разделяющих один и тот же слой представления. DeepFM действительно содержит Машину Факторизации как часть основной сети, тогда как Wide&Deep не выполняет произведение векторов в какой-либо части сети, а делает это предварительно на шаге конструирования признаков.

3. DLRM – рекомендационная модель глубокого обучения

Ну что ж, рассмотрев различные варианты от Google, Huawei (команда исследователей, стоящая за архитектурой DeepFM) и прочих, давайте познакомимся с видением исследователей Facebook. Они опубликовали свою статью о DLRM в 2019-м, и она в основном фокусируется на практической реализации этих моделей. Решения с параллельным обучением, переложение расчетов на GPU, а также различная обработка постоянных и категориальных признаков.

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

Нейронная сеть DLRM, как описано в <a href="http://arxiv.org/abs/1906" target="_blank" rel="noopener noreferrer nofollow">статье про DLRM</a>. Рисунок Макса Беккерса
Нейронная сеть DLRM, как описано в статье про DLRM. Рисунок Макса Беккерса

Предложение DLRM – это нечто вроде упрощенной и модифицированной версии DeepFM в том смысле, что оно также использует произведение векторов, но намеренно пытается держаться подальше от взаимодействий высших порядков, не обязательно прогоняя представленные категориальные признаки через многослойный перцептрон. Такой дизайн предназначен для копирования подхода, используемого в Машине Факторизации, когда она рассчитывает взаимодействия второго порядка между представлениями. Мы можем рассматривать всю DLRM как отдельную часть DeepFM, компонент FM. Можно считать, что классический Глубокий компонент DeepFM, вывод которого складывается с выводом компонента FM в финальном слое DeepFM (а потом передается в функцию сигмоиды) в DLRM полностью отсутствует. Теоретические преимущества DeepFM очевидны, поскольку ее дизайн намного лучше приспособлен для изучения взаимодействий высших порядков, однако, по мнению специалистов Facebook:

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

4. Обзор и кодирование

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

Я изучил детали реализации и протестировал предлагаемые специальные API наборов данных, которые авторы создали для прямой обработки различных наборов данных. Как соревнование по рекламе дисплеев на Kaggle от Criteo, так и их набор данных Terabyte имеют готовые реализации API, их можно загрузить и впоследствии использовать для обучения полной DLRM всего одной командой bash (инструкции см. в репозитории DLRM). Затем я расширил API модели DLRM от Facebook, добавив шаги загрузки и предварительной обработки для другого набора данных, “Предсказание показателя кликабельности для рекламы DIGIX в 2020”. Результат можно найти здесь.

Примерно так же, как и для приведенных авторами примеров, после загрузки и распаковки данных DIGIX, вы также сможете обучить модель на этом наборе данных одной командой bash. Все шаги предварительной обработки, размеры представлений и параметры архитектуры нейронной сети были настроены на обработку набора данных DIGIX. Блокнот, который проведет вас по этим шагам, можно найти здесь. Эта модель выдает приличные результаты, и я продолжаю над ней работать с целью улучшения производительности посредством лучшего понимания необработанных данных и процесса работы с рекламными объявлениями, используемого в DIGIX. Специализированная очистка данных, настройка гиперпараметров и конструирование признаков – все это вещи, над которыми я хотел бы еще поработать, и они упомянуты в блокноте. Моей первой целью было технически рациональное расширение API модели DLRM, способное использовать необработанные данные DIGIX в качестве входных данных.

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

Ссылки

Стеффен Рендл, “Машины факторизации”, Международная конференция IEEE по Data Mining, стр. 995-1000, 2010.

Ксианьян Хе, Лизи Ляо, Ханванг Жанг, Ликианг Ли, Ксиа Ху и Тат-Сенг Чуа. “Нейронная коллаборативная фильтрация”, Материалы 26-й международной конференции по World-Wide Web, стр. 173-182, 2017.

Хуифенг Гуо, Руиминг Тэнг, Юнминь Е, Женгуо Ли и Ксиукианг Хе. “DeepFM: нейронная сеть для предсказания показателя кликабельности, основанная на машине факторизации”, препринт arXiv:1703.04247, 2017.

Джианксун Лиан, Ксиаохуан Жоу, Фуженг Жанг, Жонгксиа Чен, Ксинг Кси и Гуангжонг Сун. “xDeepFM: комбинируем явные и неявные взаимодействия признаков для рекомендательных систем”, в Материалах 24-й международной конференции ACM SIGKDD по исследованию знаний и Data Mining, стр. 1754–1763. ACM, 2018.

Хенг-Це Ченг, Левент Коц, Джеремия Хармсен, Тал Шакед, Тушар Чандра, Хриши Арадхье, Глен Андерсон, Грег Коррадо, Вей Чай, Мустафа Испир, Рохан Анил, Закария Хак, Личан Хонг, Вихан Джайн, Ксяобинг Лю и Хемаль Шах. “Широкое и глубокое обучение для рекомендательных систем”, в материалах 1-го семинара по глубокому обучению рекомендательных систем”, стр. 7-10, 2016.

М. Наумов, Д. Мудигер, Х.М. Ши, Дж. Хуанг, Н. Сундараман, Дж. Парк, Кс. Ванг, У. Гупта, Ц. Ву, А.Г. Аццолини, Д. Джулгаков, А. Малевич, И. Чернавский, Ю. Лю, Р. Кришнамурти, А. Ю, В. Кондратенко, С. Перейра, Кс. Чен, В. Чен, В. Рао, Б. Джиа, Л. Ксионг и М. Смелянский “Рекомендационная модель глубокого обучения для систем персонализации и рекомендации”, CoRR, vol. abs/1906.00091, 2019. [Онлайн]. Доступна здесь.

02
Мар
2021

🤖 Как устроены современные рекомендательные системы?

Сегодня мы глубоко погрузимся в особенности работы алгоритмов искусственного интеллекта, на которых построили бизнес Facebook, Google и другие ИТ-гиганты. Внимание: статья рассчитана на специалистов.

Современные рекомендательные системы

Не далее чем в мае 2019 Facebook выложил в открытый доступ исходный код некоторых своих подходов к рекомендациям и представил DLRM (Deep-Learning Recommendation Model – рекомендательную модель глубокого обучения). Эта статья попробует объяснить, как и почему DLRM и другие современные подходы к рекомендациям работают настолько хорошо, посредством анализа их происхождения от прежних результатов в данной области и детального объяснения внутренних деталей их работы и заложенных в них идей.


Персонализированная реклама, основанная на ИИ, сегодня царствует в онлайн-маркетинге, и такие компании, как Facebook, Google, Amazon, Netflix и прочие – короли джунглей этого онлайн-маркетинга, поскольку они не просто усвоили этот тренд, а фактически сами воплотили его в жизнь и построили на нем всю свою бизнес-стратегию. Netflix’овские “другие фильмы, которые могут вам понравиться” и Amazon’овские “люди, купившие это, купили также…” – всего лишь несколько примеров из реального мира.

Само собой, будучи постоянным пользователем Facebook и Google, в какой-то момент я спросил себя:

КАК ИМЕННО ЭТА ШТУКА РАБОТАЕТ?

И, разумеется, мы все уже видели базовый пример рекомендации фильмов, объясняющий, как работают коллаборативная фильтрация и факторизация матриц. Я также не говорю о подходе обучения простого классификатора для каждого пользователя, который будет выдавать вероятность того, что этому пользователю понравится тот или иной продукт. Эти два подхода, называемые коллаборативной фильтрацией и рекомендацией, основанной на контексте, наверняка более-менее эффективны и выдают предсказания, которые можно использовать, но у Google, Facebook и прочих наверняка должно быть что-нибудь получше, какой-нибудь “туз в рукаве”, иначе они бы не были там, где они находятся сейчас.

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

предсказания, насколько данному пользователю понравится данный продукт,

которая в мире онлайнового маркетинга складывается в предсказание показателя кликабельности (click-through rate, CTR) для возможных рекламных объявлений, основанное как на явной обратной связи (рейтинги, лайки и т.п.), так и на неявной (клики, истории поиска, комментарии или посещения веб-сайтов).

Коллаборативная фильтрация против фильтрации на основе содержимого

1. Фильтрация на основе содержимого (content-based filtering)

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

2. Коллаборативная фильтрация

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

Недостаток классической MF в том, что мы не можем использовать никакие признаки, кроме пользовательских оценок – например, жанр фильма, год выхода и т.д. – MF приходится догадываться обо всем этом из имеющихся оценок. Кроме того, MF страдает от так называемой “проблемы холодного старта”: новый фильм, который еще никто не оценил, не может быть рекомендован. Фильтрация на основе содержимого справляется с этими двумя проблемами, но ей не хватает предсказательной мощности просмотра предпочтений других пользователей.

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

1. Машина Факторизации (Factorization Machine)

Одна из идей гибридной модели, предложенная Стеффеном Рендлом в 2010-м – это Машина Факторизации. Она придерживается базового математического подхода, комбинируя факторизацию матриц с регрессией:

y^(x):=w0+∑i=0nwixi⏟regressionpart+∑i=1n∑j=i+1n⟨vi,vj⟩xixj⏟MFpartw0∈R;w∈Rn;V∈Rn∗k;vi,vj∈Rk

Здесь <vi, vj> – произведение векторов, которые можно рассматривать как строки матрицы V.

Понять смысл этого уравнения довольно просто, если посмотреть на пример представления данных x, попадающих в эту модель. Давайте рассмотрим пример, представленный Стеффеном в его статье о Машине Факторизации.

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

  • пользователь u из множества U = {Alice (A), Bob (B),…}
  • фильм i из множества I = {“Титаник” (TN), “Ноттинг Хилл” (NH), “Звездные Войны” (SW), “Стар Трек” (ST),…}
  • оценка r из {1, 2, 3, 4, 5}, поставленная во время t.
Рис.1. С. Рендл, "Машины факторизации", Международная конференция IEEE по Data Mining, 2010.
Рис.1. С. Рендл, “Машины факторизации”, Международная конференция IEEE по Data Mining, 2010.

Посмотрев на приведенный выше рисунок, мы увидим представление данных в гибридной рекомендательной модели. Как разреженные признаки, представляющие пользователя и оцениваемый объект, так и любая другая дополнительная информация об объекте или мета-информация (в этом примере – Time и Last Movie Rated) попадают в вектор признаков x, который соответствует значению целевой переменной y. Теперь главное – то, как они обрабатываются моделью.

  • Регрессионая часть FM обрабатывает и разреженные, и плотные данные (например, Time), как обычная задача линейной регрессии, и, таким образом, может считаться подходом фильтрации на основе содержимого в составе FM.
  • Часть MF отвечает за взаимодействие между блоками признаков (например, взаимодействие между “Пользователем” и “Фильмом”), где матрицу V можно рассматривать как встроенную матрицу, используемую в подходах коллаборативной фильтрации. Эти отношения пользователь-фильм предоставляют нам догадки вроде:

Пользователю i, которому соответствует вектор vi (представляющий его предпочтения к параметрам фильмов), похожий на вектор vj пользователя j, скорее всего, понравятся те же фильмы, что и пользователю j.

Сложение вместе предсказаний регрессионной части и части MF и одновременное обучение их параметров в одной функции потерь приводит к гибридной модели FM, которая теперь использует подход “лучшее из обоих миров” для выдачи рекомендации пользователю.

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

если взять нейронную сеть, то будет еще лучше!

2. Широкие и глубокие: нейронная коллаборативная фильтрация (NCF) и Глубокие Машины Факторизации (DeepFM)

Для начала бросим взгляд на то, как можно реализовать коллаборативную фильтрацию с помощью нейронных сетей, просмотрев статью об NCF. В конце концов это приведет нас к Глубоким Машинам Факторизации (DeepFM), представляющим собой нейросетевую версию машин факторизации. Мы увидим, почему они превосходят обычные машины факторизации, и как можно интерпретировать архитектуру этих нейронных сетей. Мы увидим, что DeepFM была разработана как улучшение вышедшей до этого модели Wide&Deep от Google, которая была одним из первых крупных прорывов в области глубокого обучения рекомендательных систем. В конце концов это приведет нас к упомянутой выше статье по DLRM, опубликованной Facebook’ом в 2019-м, которую можно считать упрощением и небольшим усовершенствованием DeepFM.

NCF

В 2017-м группа исследователей опубликовала свою работу о Нейронной Коллаборативной Фильтрации (NCF). Она содержит обобщенный фреймворк для изучения нейронных зависимостей, моделируемых факторизацией матриц при коллаборативной фильтрации с помощью нейронной сети. Авторы также объяснили, как получить зависимости высшего порядка (MF имеет порядок всего лишь 2), и как объединить оба эти подхода.

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

Рис. 2. Из статьи "Нейронная коллаборативная фильтрация" Кс. Хе, Л. Ляо, Х. Жанг, Л. Ни, Кс. Ху, Ц. Чуа – Материалы 26-й международной конференции по World-Wide Web, 2017.
Рис. 2. Из статьи “Нейронная коллаборативная фильтрация” Кс. Хе, Л. Ляо, Х. Жанг, Л. Ни, Кс. Ху, Ц. Чуа – Материалы 26-й международной конференции по World-Wide Web, 2017.

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

В реальных задачах мы не просто используем двоичные векторы, соответствующие пользователю и объекту в качестве необработанных данных для их представления, но, очевидно, включаем и прочую дополнительную или мета-информацию, которая может представлять ценность (например, возраст, страну, аудио- и текстовые записи, метки времени,…), так что в реальности у нас получается набор данных очень высокой размерности, сильно разреженный и содержащий смесь качественных переменных с количественными. К этому моменту представленную на рис. 2 нейронную сеть можно считать и рекомендацией на основе содержимого в виде простого нейронного бинарного классификатора прямого прохода. И эта интерпретация – ключевая для понимания того, почему этот подход в конце концов оказывается гибридным между коллаборативной фильтрацией и рекомендациями на основе содержимого. Эта нейронная сеть может усвоить любые функциональные зависимости – например, взаимодействия 3-й степени и выше, вроде x1 * x2 * x3, или любые нелинейные трансформации в классическом понимании, используемом в нейронных классификаторах – в виде sigma(.. sigma(w1x1+w2x2+w3x3+b)).

Вооружившись мощью изучения зависимостей высшего порядка, мы можем использовать простой способ изучения зависимостей 1-го и 2-го порядков, скомбинировав нейронную сеть с широко известной моделью для их изучения, Машиной Факторизации. Именно это авторы DeepFM предложили в своей статье. Идея этой комбинации – параллельно изучать зависимости между признаками низких и высоких порядков – ключевая часть многих современных рекомендательных систем, и в том или ином виде ее можно найти почти в каждой архитектуре нейронной сети, предлагаемой в этой области.

DeepFM

DeepFM – это смешанный подход, включающий факторизацию матриц и глубокую нейронную сеть, причем оба используют один и тот же входной слой представления (embedding). Необработанные признаки трансформируются, чтобы закодировать категориальные признаки унитарным кодом (one-hot encoding). Итоговое предсказание (показатель кликабельности), выдаваемое последним словом нейронной сети, определяется так:

y^=sigmoid(yFM+yDNN)

То есть, это сумма предсказаний матричной факторизации и нейронной сети, пропущенная через сигмоидную функцию активации.

Компонент факторизации матриц – это обычная Машина Факторизации, оформленная в стиле архитектуры нейронной сети:

Рис. 3. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе "DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017
Рис. 3. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе “DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017

Часть сложения (Addition) этого слоя матричной факторизации получает вектор входных данных x от слоя разреженных признаков (Sparse Features) и умножает каждый элемент на его вес (Normal Connection) перед суммированием. Часть перемножения векторов (Inner Product) также получает вектор x, но только после его прохождения через слой представления и просто перемножает представленные векторы без весов (“Weight-1 Connection”). Сложение обеих частей вместе приводит к вышеупомянутому уравнению для Машины Факторизации:

yFM:=w0+∑i=0nwixi+∑i=1n∑j=i+1n⟨vi,vj⟩xixj

В этом уравнении перемножение xixj нужно только для записи суммы от 1 до n. Оно не является частью вычислений нейронной сети. Нейронная сеть автоматически знает, произведение каких векторов vi и vj потребуется, благодаря архитектуре слоя представления.

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

Рис. 4. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе "DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017
Рис. 4. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе “DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017

Здесь Vp – матрица представлений для каждого поля p={1,2…,m} c k столбцами и количеством строк, соответствующим количеству элементов поля, закодированных двоичным образом. Выход этого слоя представления определяется как

a(0)=[e1,e2,…em]

и важно отметить, что этот слой не полносвязный, а именно – нет связей между необработанным входом любого поля и представлением любого другого поля. Представьте это следующим образом: вектор значений для пола (например, (0, 1)), закодированный унитарным кодом, не может иметь ничего общего с вектором представлений для дня недели (например, вектором (0, 1, 0, 0, 0, 0, 0), закодированный “Вторник”, или его вектором представления, например, для k=4, (12, 4, 5, 9).

Компонент FM – это Машина Факторизации, отражающая высокую важность взаимодействий 1 и 2 порядка, которые прямо складываются с выходом глубокого компонента и передаются в сигмоидную функцию активации последнего слоя.

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

Рис. 5. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе "DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017
Рис. 5. из статьи Х. Гуо, Р. Тэнг, Ю. Е, Ж. Ли и Кс. Хе “DeepFM – нейронная сеть на основе машины факторизации для предсказания показателя кликабельности. arXiv:1703.04247, 2017

Нейронная сеть на основе стандартного многослойного перцептрона со слоем представления между необработанными данными (сильно разреженными после унитарного кодирования категориальных переменных) и следующими слоями нейронной сети описывается следующей формулой:

a(l+1)=σ(W(l)a(l)+b(l))

где sigma – функция активации, W – матрица весов, a – результат функции активации предыдущего слоя, а b – порог.

Это приводит к общей архитектуре нейронной сети DeepFM:

Рис. 6. Общая архитектура DeepFM
Рис. 6. Общая архитектура DeepFM

со следующими параметрами:

  • Скрытый вектор Vi для измерения влияния взаимодействий признака i с другими признаками (слой представления).
  • Vi передается в компонент FM для моделирования взаимодействий 2 порядка (компонент FM).
  • wi взвешивает важность необработанного признака i 1-го порядка (компонент FM).
  • Vi также передается в Глубокий компонент для моделирования всех взаимодействий высших порядков (>2)(Глубокий компонент).
  • WI и bI – веса и пороги нейронной сети (Глубокий компонент).

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

Сравнение с Wide&Deep и NeuMF

Есть много вариаций, о которых можно задуматься, чтобы “отполировать” эту архитектуру и сделать ее еще лучше. Однако в основном все они сходятся в своем гибридном подходе, заключающемся в одновременной обработке взаимодействий высших и низших порядков. Авторы DeepFM также предложили замену многоуровневого перцептрона на так называемую PNN, глубокую нейронную сеть, получающую в качестве входных данных выводы FM и слоя представления.

Авторы статьи про NCF также предложили похожую архитектуру, которую они назвали NeuMF (Neural Matrix Factorization – нейронная факторизация матриц). Вместо использования FM в качестве компонента низшего порядка они используют обычную факторизацию матриц, результаты которой передаются в функцию активации. Этому подходу, однако, не хватает взаимодействий 1 порядка, моделируемых линейной частью FM. Авторы также указали, что модель имеет различные представления пользователя и объекта для матричной факторизации и многослойного перцептрона.

Как упомянуто выше, команда исследователей Google была одной из первых, предложивших нейронные сети для гибридного подхода к рекомендации. DeepFM можно рассматривать как дальнейшеее развитие алгоритма Wide&Deep от Google, который выглядит примерно так:

Рис. 7. Х-Т Ченг, Л. Кос, Дж. Хармсен, Т. Шакед, Т. Чандра, Х. Арадхье, Г. Андерсон, Г. Коррадо, В. Чаи, М. Испир, Р. Анил, З. Хак, Л. Хонг, В. Джейн, Кс. Лю и Х. Шах. "Широкое и глубокое обучение для рекомендательных систем" – Материалы 1 семинара по глубокому обучению для рекомендательных систем, стр. 7-10, 2016.
Рис. 7. Х-Т Ченг, Л. Кос, Дж. Хармсен, Т. Шакед, Т. Чандра, Х. Арадхье, Г. Андерсон, Г. Коррадо, В. Чаи, М. Испир, Р. Анил, З. Хак, Л. Хонг, В. Джейн, Кс. Лю и Х. Шах. “Широкое и глубокое обучение для рекомендательных систем” – Материалы 1 семинара по глубокому обучению для рекомендательных систем, стр. 7-10, 2016.

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

ϕk(x)=∏i=1dxickicki∈{0,1}

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

Легко видеть, что DeepFM является развитием этой модели, поскольку она не требует никакого предварительного конструирования признаков и может обучиться взаимодействиям низкого и высокого порядка на основе одних и тех же входных данных, разделяющих один и тот же слой представления. DeepFM действительно содержит Машину Факторизации как часть основной сети, тогда как Wide&Deep не выполняет произведение векторов в какой-либо части сети, а делает это предварительно на шаге конструирования признаков.

3. DLRM – рекомендационная модель глубокого обучения

Ну что ж, рассмотрев различные варианты от Google, Huawei (команда исследователей, стоящая за архитектурой DeepFM) и прочих, давайте познакомимся с видением исследователей Facebook. Они опубликовали свою статью о DLRM в 2019-м, и она в основном фокусируется на практической реализации этих моделей. Решения с параллельным обучением, переложение расчетов на GPU, а также различная обработка постоянных и категориальных признаков.

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

Нейронная сеть DLRM, как описано в <a href="http://arxiv.org/abs/1906" target="_blank" rel="noopener noreferrer nofollow">статье про DLRM</a>. Рисунок Макса Беккерса
Нейронная сеть DLRM, как описано в статье про DLRM. Рисунок Макса Беккерса

Предложение DLRM – это нечто вроде упрощенной и модифицированной версии DeepFM в том смысле, что оно также использует произведение векторов, но намеренно пытается держаться подальше от взаимодействий высших порядков, не обязательно прогоняя представленные категориальные признаки через многослойный перцептрон. Такой дизайн предназначен для копирования подхода, используемого в Машине Факторизации, когда она рассчитывает взаимодействия второго порядка между представлениями. Мы можем рассматривать всю DLRM как отдельную часть DeepFM, компонент FM. Можно считать, что классический Глубокий компонент DeepFM, вывод которого складывается с выводом компонента FM в финальном слое DeepFM (а потом передается в функцию сигмоиды) в DLRM полностью отсутствует. Теоретические преимущества DeepFM очевидны, поскольку ее дизайн намного лучше приспособлен для изучения взаимодействий высших порядков, однако, по мнению специалистов Facebook:

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

4. Обзор и кодирование

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

Я изучил детали реализации и протестировал предлагаемые специальные API наборов данных, которые авторы создали для прямой обработки различных наборов данных. Как соревнование по рекламе дисплеев на Kaggle от Criteo, так и их набор данных Terabyte имеют готовые реализации API, их можно загрузить и впоследствии использовать для обучения полной DLRM всего одной командой bash (инструкции см. в репозитории DLRM). Затем я расширил API модели DLRM от Facebook, добавив шаги загрузки и предварительной обработки для другого набора данных, “Предсказание показателя кликабельности для рекламы DIGIX в 2020”. Результат можно найти здесь.

Примерно так же, как и для приведенных авторами примеров, после загрузки и распаковки данных DIGIX, вы также сможете обучить модель на этом наборе данных одной командой bash. Все шаги предварительной обработки, размеры представлений и параметры архитектуры нейронной сети были настроены на обработку набора данных DIGIX. Блокнот, который проведет вас по этим шагам, можно найти здесь. Эта модель выдает приличные результаты, и я продолжаю над ней работать с целью улучшения производительности посредством лучшего понимания необработанных данных и процесса работы с рекламными объявлениями, используемого в DIGIX. Специализированная очистка данных, настройка гиперпараметров и конструирование признаков – все это вещи, над которыми я хотел бы еще поработать, и они упомянуты в блокноте. Моей первой целью было технически рациональное расширение API модели DLRM, способное использовать необработанные данные DIGIX в качестве входных данных.

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

Ссылки

Стеффен Рендл, “Машины факторизации”, Международная конференция IEEE по Data Mining, стр. 995-1000, 2010.

Ксианьян Хе, Лизи Ляо, Ханванг Жанг, Ликианг Ли, Ксиа Ху и Тат-Сенг Чуа. “Нейронная коллаборативная фильтрация”, Материалы 26-й международной конференции по World-Wide Web, стр. 173-182, 2017.

Хуифенг Гуо, Руиминг Тэнг, Юнминь Е, Женгуо Ли и Ксиукианг Хе. “DeepFM: нейронная сеть для предсказания показателя кликабельности, основанная на машине факторизации”, препринт arXiv:1703.04247, 2017.

Джианксун Лиан, Ксиаохуан Жоу, Фуженг Жанг, Жонгксиа Чен, Ксинг Кси и Гуангжонг Сун. “xDeepFM: комбинируем явные и неявные взаимодействия признаков для рекомендательных систем”, в Материалах 24-й международной конференции ACM SIGKDD по исследованию знаний и Data Mining, стр. 1754–1763. ACM, 2018.

Хенг-Це Ченг, Левент Коц, Джеремия Хармсен, Тал Шакед, Тушар Чандра, Хриши Арадхье, Глен Андерсон, Грег Коррадо, Вей Чай, Мустафа Испир, Рохан Анил, Закария Хак, Личан Хонг, Вихан Джайн, Ксяобинг Лю и Хемаль Шах. “Широкое и глубокое обучение для рекомендательных систем”, в материалах 1-го семинара по глубокому обучению рекомендательных систем”, стр. 7-10, 2016.

М. Наумов, Д. Мудигер, Х.М. Ши, Дж. Хуанг, Н. Сундараман, Дж. Парк, Кс. Ванг, У. Гупта, Ц. Ву, А.Г. Аццолини, Д. Джулгаков, А. Малевич, И. Чернавский, Ю. Лю, Р. Кришнамурти, А. Ю, В. Кондратенко, С. Перейра, Кс. Чен, В. Чен, В. Рао, Б. Джиа, Л. Ксионг и М. Смелянский “Рекомендационная модель глубокого обучения для систем персонализации и рекомендации”, CoRR, vol. abs/1906.00091, 2019. [Онлайн]. Доступна здесь.

26
Фев
2021

👨‍🎓️ 5 простых шагов: как подготовиться к поступлению в «Школу анализа данных»?

Поступить и учиться в ШАД от Яндекс – мечта многих начинающих специалистов по Data Science. Рассказываем, как это можно сделать, пройдя пять простых шагов.

В апреле 2021 года начинается набор в «Школу анализа данных» – это бесплатная двухгодичная программа Яндекс для желающих освоить профессию Data Scientist или стать архитектором систем хранения и обработки больших данных. Мы составили небольшой гид по подготовке к поступлению и обучению в этой школе.

Набор проходит в три этапа:

  1. Онлайн-тестирование: решение заданий теста за 5 часов;
  2. Для поступающих в московское отделение второй этап состоит из двух частей: первая математика и алгоритмы, вторая программирование и основы анализа данных;
  3. Заключительный этап очное собеседование, во время которого придется решать задачи по математике, алгоритмам и программированию.
<a href="https://upload.wikimedia.org/wikipedia/commons/a/a8/%D0%9B%D0%9E%D0%93%D0%9E_%D0%A8%D0%90%D0%94.png" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Шаг 1: Выясните, каких знаний вам не хватает

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

Шаг 2: Математическая подготовка

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


Алгeбра

Чек-лист из программы для поступления в «Школу анализа данных»:

  • Определение, четность, произведение подстановок. Разложение подстановок в произведение транспозиций и независимых циклов.
  • Комплексные числа. Геометрическое изображение, алгебраическая и тригонометрическая форма записи, извлечение корней, корни из единицы.
  • Системы линейных уравнений. Прямоугольные матрицы. Приведение матриц и систем линейных уравнений к ступенчатому виду. Метод Гаусса.
  • Линейная зависимость и ранг. Линейная зависимость строк (столбцов). Основная лемма о линейной зависимости, базис и ранг системы строк (столбцов). Ранг матрицы. Критерий совместности и определенности системы линейных уравнений в терминах рангов матриц. Фундаментальная система решений однородной системы линейных уравнений.
  • Определитель квадратной матрицы, его основные свойства. Критерий равенства определителя нулю. Формула разложения определителя матрицы по строке (столбцу).
  • Операции над матрицами и их свойства. Теорема о ранге произведения двух матриц. Определитель произведения квадратных матриц. Обратная матрица, ее явный вид (формула), способ выражения с помощью элементарных преобразований строк.
  • Векторное пространство, его базис и размерность. Преобразования координат в векторном пространстве. Подпространства как множества решений систем однородных линейных уравнений. Связь между размерностями суммы и пересечения двух подпространств. Линейная независимость подпространств. Базис и размерность прямой суммы подпространств.
  • Линейные отображения, их запись в координатах. Образ и ядро линейного отображения, связь между их размерностями. Сопряженное пространство и сопряженные базисы. Изменение матрицы линейного оператора при переходе к другому базису.
  • Билинейные функции, их запись в координатах. Изменение матрицы билинейной функции при переходе к другому базису. Ортогональное дополнение к подпространству относительно симметрической билинейной функции. Связь между симметричными билинейными и квадратичными функциями. Существование ортогонального базиса для симметрической билинейной функции. Нормальный вид вещественной квадратичной функции. Закон инерции.
  • Евклидовы пространства. Неравенство Коши-Буняковского. Ортогональные базисы. Ортогонализация Грама-Шмидта. Ортогональные операторы.
  • Собственные векторы и собственные значения линейного оператора. Собственные подпространства линейного оператора, их линейная независимость. Условие диагонализируемости оператора.

Дополнительный материал: «Как линейная алгебра используется в машинном обучении?».

Математически анализ

Чек-лист из программы для поступления в «Школу анализа данных»:

  • Пределы и непрерывность. Пределы последовательностей и функций. Непрерывные функции.
  • Ряды. Числовые и функциональные ряды. Признаки сходимости (Даламбера, Коши, интегральный, Лейбница). Абсолютно и условно сходящиеся ряды.
  • Дифференцирование. Дифференцирование функций. Применение производной для нахождения экстремумов функций. Формула Тейлора.
  • Функции многих переменных. Частные производные. Градиент и его геометрический смысл. Гессиан. Метод градиентного спуска. Поиск экстремумов функций от многих переменных.
  • Интегрирование. Определенный и неопределенный интегралы. Методы интегрирования функций. Первообразные различных элементарных функций. Кратные интегралы (двойные, тройные), замена координат, связь с повторными.
  • Элементы функционального анализа: нормированные, метрические пространства, непрерывность, ограниченность.

Дополнительный материал: «Для чего нужен математический анализ в машинном обучении».

Комбинаторика

Чек-лист из программы для поступления в «Школу анализа данных»:

  • Основные правила комбинаторики. Правило подсчета количества комбинаторных объектов. Принцип Дирихле. Примеры.
  • Множества. Круги Эйлера, операции на множествах. Формула включений и исключений. Примеры.
  • Сочетания. Размещения, перестановки и сочетания. Бином Ньютона. Треугольник Паскаля. Сочетания с повторениями.

Дополнительный материал: «Первое занятие нашего курса по математике для Data Science доступно на YouTube».


Теория вероятностей

Чек-лист из программы для поступления в «Школу анализа данных»:

  • Основные понятия теории вероятностей. Определение вероятностного пространства, простейшие дискретные случаи (выборки с порядком и без него, упорядоченные и неупорядоченные), классическая вероятностная модель. Случайная величина, функция распределения.
  • Условные вероятности. Определение условной вероятности, формула полной вероятности, формула Байеса.
  • Математическое ожидание, дисперсия, корреляция. Определение математического ожидания, дисперсии, ковариации и корреляции, их свойства.
  • Независимость событий. Попарная независимость и независимость в совокупности.
  • Основные теоремы теории вероятностей. Неравенство Чебышева. Закон больших чисел. Центральная предельная теорема.
  • Распределения. Стандартные дискретные и непрерывные распределения, их математические ожидания, дисперсии и свойства: биномиальное; равномерное; нормальное; пуассоновское; показательное; геометрическое.

Дополнительный материал: «Зачем в науке о данных нужны теория вероятностей и статистика».


Шаг 3: Программирование

Для Data Scientist также важны сбор, очистка, обработка и систематизация данных. При решении этих задач и реализации моделей машинного обучения используются Python и R. Для поступления в «Школу анализа данных» нужно владеть хотя бы одним из основных языков программирования. Какой из них стоит выбрать для работы, мы обсуждали в статье «От “R против Python” к “R и Python”».

Чек-лист из программы для поступления в «Школу анализа данных»:

  • Простейшие конструкции языка программирования. Циклы, ветвления, рекурсия.
  • Анализ алгоритмов. Понятие о сложности по времени и по памяти. Асимптотика, O-символика. Инварианты, пред- и пост- условия. Доказательство корректности алгоритмов.
  • Простейшие структуры данных. Массивы, стеки, очереди, связные списки, Сравнение временных затрат при различных типах операций.
  • Строки и операции над ними. Представление строк. Вычисление длины, конкатенация.
  • Сортировки. Нижняя теоретико-информационная оценка сложности задачи сортировки. Алгоритмы сортировки вставками, пузырьком, быстрая сортировка, сортировка слиянием. Оценка сложности.
  • Указатели.Указатели и динамическое управление памятью.

Курсы для подготовки:


Шаг 4: Анализ данных

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

Чек-лист из программы для поступления в «Школу анализа данных»:

  • Основные машинного обучения: классификация, регрессия, ранжирование, кластеризация. Обучение с учителем и без учителя.
  • Предобработка и очистка данных. Работа с пропущенными значениями.
  • Feature Engineering. Работа с категориальными признаками.
  • Переобучение: как его обнаружить и как с ним бороться. Разделение на обучающую и тестовую выборки. Методы регуляризации.
  • Сравнение моделей. Метрики в задачах классификации и регрессии. Методология подборара гиперпараметров.
  • Основные модели классификации и регрессии: линейные модели, решающие деревья. Ансамбли алгоритмов.

Курсы для подготовки:

Шаг 5: Практика

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

Примеры упражнений:

***

Если вы хотите наработать необходимую для поступления в «Школу анализа данных» математическую базу и подготовиться к обучению на Data Scientist, обратите внимание на онлайн-курс «Библиотеки программиста». С помощью опытных преподавателей из МГУ сделать это будет намного проще, чем самостоятельно по книгам. Студенты могут выбрать отдельные разделы (например, линейную алгебру) или оплатить весь курс целиком с существенной скидкой.

25
Фев
2021

Топ 10 Python-библиотек для Data Science

Изучающий data science сталкивается с огромным разнообразием возможностей. Я хочу поделиться с вами своим топом Python библиотек, которые широко используются в data science.
— Читать дальше «Топ 10 Python-библиотек для Data Science»

25
Фев
2021

📊 Обучение на Data Scientist: стоит ли игра свеч?

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

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

Оценка рынка

Согласно отчету LinkedIn Emerging Jobs Report, начиная с 2012 года только в течение пяти лет количество рабочих мест в области науки о данных увеличилось на 650%. В докладе LinkedIn Emerging Jobs Report 2020 года роль искусственного интеллекта и науки о данных продолжает расти почти во всех отраслях. А по данным Glassdoor 50 Best Jobs in America, Data Scientist остается в тройке лучших вакансий в США. В совместном исследовании Академии больших данных MADE и hh.ru также сообщается, что за прошедшие 5 лет вакансий в области анализа данных стало больше в 9,6 раза, а в области машинного обучения — в 7,2 раза.

Начальная зарплата Data Scientist с опытом работы до года – от 113 тыс. рублей. Через 1 – 2 года такой специалист может получать уже до 160 тыс. рублей. Для сотрудника с опытом работы от 4 – 5 лет вилка вырастает до 310 тыс.

О чём специалисту по анализу данных следует задуматься при переговорах о зарплате в 2021 году?

Персональные факторы:

  • Опыт работы: новичок (junior), 1-3 года (middle) или 6+ лет (senior);
  • Уровень образования: самостоятельное обучение через курсы, опыт работы над проектами, степень магистра или PhD;
  • Владение необходимыми навыками: Python, R, SQL, TensorFlow, Deep Learning и т.д.;
  • Предыдущая работа: ожидание такой же или более высокой заработной платы на следующей позиции.

Особенности компании:

  • Расположение: зарубежная или российская компания, большой/маленький город, удаленно/в офисе;
  • Тип компании: компании-гиганты (Google, Amazon, Yandex и т.д.), средний и малый бизнес, НКО, университет, государственная компания;
  • Другие Data Scientists в команде: распределение обязанностей, нагрузка, общий бюджет на команду Data Science;
  • Должность: например, Senior Data Scientist, Junior Data Scientist, Data Science инженер, стажер и т.д.

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

Насколько реально сменить профессию?


Для специалистов из смежных областей

Если вы хотите перейти в науку о данных из смежных областей, вроде математики и статистики, физики, программирования и компьютерных наук, у вас есть большое преимущество. Имеющиеся навыки и опыт работы позволят вам намного быстрее погрузиться в новую специализацию. При выборе специализации Data Science, не спешите сразу к ней переходить. Изучите смежные с вашей нынешней профессией сферы – это может облегчить смену рода занятий. Например, математику будет лучше освоить алгоритмы машинного обучения и Deep Learning, а разработчику программного обеспечения не составит труда перейти к анализу данных.

Для абсолютных новичков

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

Способы получить профессию


Навыки и образование

Одним из распространенных заблуждений является мнение, будто для работы в Data Science необходима степень в компьютерных науках или математике. Вам не нужно стремиться получить степень магистра. Для работы с алгоритмами машинного обучения и Deep Learning действительно могут понадобиться знание математического анализа, линейной алгебры и теории вероятностей, но это не означает, что вы не сумеете получить навыки самостоятельно. Владение различными инструментами управления данными, а также умение учиться намного важнее, чем формальное образование. Если верить описаниям актуальных вакансий, наиболее востребованными навыками и инструментами для Data Scientist являются следующие:

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

Направления и обзор вакансий

Существует несколько основных ролей специалистов по Data Science, каждая из которых направлена на решение определенных проблем с помощью данных:

  • Data Scientist – специалист, который с помощью различных инструментов, методов, методологий и алгоритмов получает инсайты из огромного объема информации. Он выполняет исследовательский анализ, а также использует различные виды алгоритмов машинного обучения для составления прогнозов. Data Scientist сосредоточен на выявлении неизвестных корреляций, скрытых моделей и рыночных тенденций.
  • Data Engineer отвечают за поиск тенденций в наборах данных и разработку алгоритмов, помогающих компаниям извлекать инсайты из необработанной информации. Эти специалисты работают с большими объемами информации, и занимаются разработкой, конструированием, тестированием и поддержкой архитектуры крупномасштабных систем обработки и баз данных. Data Engineers также должны понимать, как оптимизировать поиск данных, как сделать информационные панели, отчеты и другие виды визуализации понятными для всех заинтересованных сторон.
  • Аналитик данных отвечает за получение и обработку больших объемов информации. В его обязанности также включены проектирование и обслуживание информационных систем и баз данных: исправление ошибок кодирования и других проблем. Аналитик будет использовать статистические инструменты для интерпретации данных, уделяя особое внимание тенденциям и закономерностям, которые могут быть полезны для диагностической и прогностической аналитики. В его задачи также входит предоставление отчетности и визуализация анализа данных, которые будут использованы для принятия наиболее эффективных бизнес-решений.
В Data Science множество направлений. Делайте выбор в зависимости от вашего образования, опыта и личного интереса. Поговорите с людьми, которые работают в отрасли, чтобы выяснить, какие обязанности придется выполнять и каких навыков потребует желаемая должность.

Противоречия


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

Если взвесив все плюсы и минусы вы решили, что Data Science точно для вас, обратите внимание на курс «Профессия‌ ‌Data‌ ‌Scientist‌»: обучение на специалиста по Data Science онлайн от Skillbox. Он предназначен для начинающих программистов и аналитиков, а также для желающих кардинально сменить профессию. Цель курса дать студентам знания и навыки, которые могут понадобиться в реальной работе Data Scientist. Программа включает основательную математическую подготовку, занятия по Python, R и SQL, а также по аналитике и машинному обучению. Особенность курса заключается в проектно-ориентированном обучении, во время которого вы сможете на практике понять, как применять методы Data Science для решения бизнес-проблем.

***

Бонус для читателей

Если вас заинтересовала возможность построить карьеру в новой и перспективной области, но вы не готовы принять решение здесь и сейчас, Skillbox предоставляет возможность начать обучение и ознакомиться с 2 модулями программы бесплатно. Вы освоите основы языка Python для анализа данных, а также сможете начать работать в Jupyter Notebook. Для своих студентов в Skillbox предусмотрели удобные условия по рассрочке оплаты за обучение – оплата курсов возможна через год после начала занятий.

22
Фев
2021

🎲 Зачем в науке о данных нужны теория вероятностей и статистика

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

В двух первых статьях мы рассказали о роли математического анализа и линейной алгебры в машинном обучении. Продолжая тему, поговорим о теории вероятностей и статистике в науке о данных. Более углубленно эти темы будут рассмотрены в нашем «Онлайн-курсе по математике в Data Science Pro».

С одной стороны, роль теории вероятностей и статистики в машинном обучении сравнительно невелика: используются лишь базовые понятия, хотя и довольно широко. С другой стороны, разведочный анализ данных, их очистка, подготовка и конструирование новых признаков – это чистая статистика. А поскольку эти операции в прикладной науке о данных (Data Science) занимают 90-95% времени, самый важный раздел математики для Data Scientist’ов – именно статистика. Кстати, это отлично демонстрирует разницу между машинным обучением и наукой о данных.

“Вероятности” классификации

Практически все модели классификации, используемые в машинном обучении, на самом деле выдают не единственную метку класса (или его номер), а набор “вероятностей” принадлежности к каждому классу. Логистическая регрессия с бинарной классификацией – это та же линейная регрессия, результат которой пропускается через функцию сигмоиды, преобразующую весь диапазон действительных чисел к диапазону [0,1].

Функции сигмоиды с разными параметрами
Функции сигмоиды с разными параметрами

Число p, являющееся результатом сигмоиды, считается “вероятностью” принадлежности результата к одному из классов, а “вероятность” принадлежности к другому классу равна 1-p. Разумеется, это не настоящие вероятности – строго говоря, в данном случае вообще нет смысла говорить о вероятности, ведь результат классификации однозначен. Возможно, в данном случае было бы правильнее называть результат степенью уверенности: например, модель считает, что данный экземпляр принадлежит к классу 1 с уверенностью 74%. Тем не менее, принято называть этот показатель именно вероятностью.

Если классов больше двух, вместо сигмоиды используется Softmax – функция, преобразующая вектор вещественных чисел z размерности N в вектор неотрицательных чисел той же размерности, сумма которых равна 1 (sigma):

σ(z)i=ezi∑k=1Nezk

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

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

Все будет нормально

Нормальное распределение, или распределение Гаусса – это семейство функций плотности распределения вероятности с двумя параметрами: mu (среднее значение, оно же медиана и мода) и sigma (стандартное или среднеквадратическое отклонение). Иногда вместо sigma используется параметр sigma2 – дисперсия нормального распределения:

ϕμ,σ2(x)=1σ2πe−(x−μ)22σ2

График функции плотности нормального распределения похож на колокол. Его центральная координата равна mu, а стандартное отклонение sigma определяет уровень “крутизны” графика: чем оно меньше, чем большая доля значений переменной будет находиться недалеко от центра.

Функции плотности нормального распределения с разными параметрами
Функции плотности нормального распределения с разными параметрами

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

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

Разведочный анализ данных

Разведочный анализ данных (exploratory data analysis, EDA) – это изучение данных для принятия решений по поводу их применения, очистки, преобразования и конструирования новых признаков. Как сказано выше, EDA – это чистая статистика, и основные цели его первого этапа – понять вид распределения признаков, основные параметры этого распределения, обнаружить выбросы и т.д.

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


“Ящик с усами” не позволяет увидеть общую картину распределения, зато предоставляет ценную информацию о его параметрах, особенно квантилях. Квантиль – это такое значение признака, что заданный процент значений этого признака в наборе данных меньше этого квантиля. Например, квантиль 50% – это такое значение, что половина значений признака меньше, а вторая половина – больше него, этот квантиль называется медианой. Квантили 0%, 25%, 50%, 75% и 100% называются квартилями, поскольку они делят область определения признака на четыре части.

"Ящик с усами" и его параметры. Минимум и максимум не учитывают выбросы (на рисунке не показаны)
“Ящик с усами” и его параметры. Минимум и максимум не учитывают выбросы (на рисунке не показаны)

“Усы” выводятся без учета выбросов (outliers) – значений, больших Q3+1.5*IQR или меньших Q1-1.5*IQR. Принято считать, что выбросы скорее свидетельствуют об ошибках ввода данных, чем о реальных значениях признаков, и с ними надо что-то делать – например, удалить. На нашем рисунке выбросы не показаны, а в реальных “ящиках с усами” они выводятся в виде кружков за пределами “усов”. Все понятия, о которых мы говорили, изучает статистика.

Анализ зависимостей между признаками

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

Попарная диаграмма четырех признаков пингвинов (для трех разных видов, обозначенных цветами). Рисунок взят из документации по Seaborn.
Попарная диаграмма четырех признаков пингвинов (для трех разных видов, обозначенных цветами). Рисунок взят из документации по Seaborn.

Коэффициент корреляции между двумя признаками x и y по набору данных, состоящему из n записей, считается следующим образом (“x с крышкой” и “y с крышкой” – средние значения x и y):

rxy=∑i=1n(xi−x¯)(yi−y¯)∑i=1n(xi−x¯)2∑i=1n(yi−y¯)2

Коэффициент корреляции всегда находится в интервале [-1, 1], и его значение показывает, насколько велика линейная зависимость между признаками. Если его значение близко к 1, то зависимость очень сильна, если к -1, то признаки противоположны друг другу, а если к 0 – совершенно не зависят друг от друга. Для анализа многих признаков сразу обычно выводится матрица корреляции, в которой цвет каждого коэффициента соответствует его значению.

Матрица корреляции для набора данных о "Титанике".
Матрица корреляции для набора данных о “Титанике”.

Например, из матрицы корреляции для набора данных о “Титанике” легко увидеть, что какая-то положительная корреляция есть только между количеством родителей и количеством детей на борту: люди плыли либо парами/в одиночку, либо целыми семьями. Отрицательная корреляция есть между пассажирским классом и ценой проезда (естественно, билеты низших по номеру классов стоили дороже) и между полом и признаком выжившего: мужчины уступали места в шлюпках дамам.

Заключение

Как мы уже говорили, статистика занимает особое место в науке о данных, поскольку все данные собираются и обрабатываются именно методами статистики. Более того, иногда вся работа Data Scientist’а, включая создание и усовершенствование моделей, проводится только для того, чтобы доказать или опровергнуть какую-нибудь статистическую гипотезу! А это значит, что каждый Data Scientist обязан знать статистику на профессиональном уровне – по крайней мере, именно такие требования к ним предъявляют на Западе. Помимо статистики придется освоить основы математического анализа и линейной алгебры, о которых шла речь в первых публикациях нашего небольшого цикла.

***

Если вы хотите наработать необходимую для изучения Data Science математическую базу и подготовиться к углубленным занятиям в «Школе обработки данных» или Computer Science Center, обратите внимание на онлайн-курс «Библиотеки программиста». С помощью опытных преподавателей из МГУ сделать это будет намного проще, чем самостоятельно по книгам. Студенты могут выбрать отдельные разделы (например, линейную алгебру) или оплатить весь курс целиком с существенной скидкой.

19
Фев
2021

10 вопросов на позицию специалиста по Data Science

По 5 вопросов с собеседований из двух обязательных для Data Scientist областей знаний — теории вероятности и машинного обучения
— Читать дальше «10 вопросов на позицию специалиста по Data Science»

17
Фев
2021

∀ Как линейная алгебра используется в машинном обучении?

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

Продолжая серию публикаций к запуску авторского «Онлайн-курса по математике в Data Science Pro», поговорим о применении линейной алгебры в машинном обучении. За примерами далеко ходить не нужно: напротив, очень трудно найти такую сферу машинного обучения, в которой не используется линейная алгебра. Причем не только ее основные методы, вроде операций с векторами и матрицами, но и продвинутые вроде сингулярного разложения матрицы (Singular Value Decomposition, SVD), метода главных компонент (Principal Component Analysis, PCA) и метода опорных векторов (Support Vector Machines, SVM). Последний – один из основных алгоритмов машинного обучения.

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

Основы

Линейная алгебра работает с векторами и матрицами – а точнее, с их линейными комбинациями, также являющимися векторами и матрицами. Математически вектор можно представить набором действительных чисел:

j¯=[a1,a2,…an]∈Rn

Такой набор может представлять очень разные сущности: например, геометрический вектор в некоторой системе координат (при этом числа ai умножаются на векторы базиса), полином (числа ai умножаются на xi) и вообще любую линейную комбинацию каких-либо элементов. Матрица – это такой же набор действительных чисел, но организованный в виде прямоугольника. Матрицу тоже можно представить в виде длинного вектора, если поставить ее столбцы друг на друга.

Q=∥a11a12…a1na21a22…a2n…………am1am2…amn∥∈Rm∗n

Что в машинном обучении можно представить в виде векторов и матриц? Практически всё! Например, одна строка из набора данных – это вектор, каждый элемент которого представляет значение некоторого признака. Весь тренировочный набор данных (или, в случае нейронной сети, один batch из этого набора) – это матрица. Изображение, которое будет распознавать сверточная нейронная сеть – тоже матрица чисел, соответствующих отдельным пикселям. Градиент функции потерь – это вектор, и так далее.

Произведение векторов, умножение матрицы на вектор и произведение матриц – все это используется в машинном обучении. Например, модель линейной регрессии с вектором весов w и вектором признаков x можно записать в виде произведения векторов, если добавить в вектор признаков x[0] = 1:

Mw(x)=w[0]+w[1]×x[1]+w[2]×x[2]+…+w[m]×x[m]=w[0]+∑j=1mw[j]×x[j]=w¯⋅x¯

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

Prediction=A⋅x¯=y~;Loss=L(y~−y)

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

Tθ=∥cos(θ)−sin(θ)sin(θ)cos(θ)∥
Поворот исходного изображения (Original) на 112.5 градусов
Поворот исходного изображения (Original) на 112.5 градусов

Измерения

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

L1=∥x¯∥1:=∑i=1n|xi|;L2=∥x¯∥2:=∑i=1nxi2=x¯⊤x¯
Геометрическое место точек, у которых норма равна единице: <b>L<sub class="cdx-sub">1</sub></b> (слева) и <b>L<sub class="cdx-sub">2</sub></b> (справа)
Геометрическое место точек, у которых норма равна единице: L1 (слева) и L2 (справа)

Норма L2(x-y) – это расстояние между векторами x и y. Обе нормы используются в машинном обучении для регуляризации функции потерь: лассо-регуляризация использует L1, регуляризация ТихоноваL2, а эластичная сеть – и ту, и другую.

Косинус угла между двумя векторами x и y линейная алгебра определяет так:

cos(θ)=x¯⊤y¯∥x∥⋅∥y∥

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

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

Разумеется, оценка сходства широко применяется и в моделях кластеризации – например, метод k-Nearest Neighbors размечает кластеры именно по степени сходства элементов друг с другом.

Сингулярное разложение матриц (SVD)

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

A⋅A⊤=I=A⊤⋅AA−1=A⊤

Сингулярное разложение матрицы вводится следующей теоремой линейной алгебры: любую невырожденную прямоугольную матрицу Am*n можно представить в виде произведения трех матриц Um*m, Em*n и Vn*n, где U и V – ортогональные матрицы, а E – прямоугольная матрица, в которой все элементы, кроме диагональных, равны нулю.


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

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

Метод главных компонент (PCA)

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

PCA находит проекцию данных (синие точки) на пространство меньшей размерности (линию)
PCA находит проекцию данных (синие точки) на пространство меньшей размерности (линию)

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

  1. Вычитаем среднее значение, чтобы набор данных имел среднее значение 0. Это сокращает риск возникновения числовых проблем.
  2. Стандартизируем. Делим элементы данных на стандартное отклонение sigmad по каждому измерению d. Теперь данные не имеют единиц измерения, а их дисперсия по каждой оси равна 1, что отмечено на рис. в) голубыми стрелками.
  3. Выполняем спектральное разложение матрицы ковариации. Вычисляем матрицу ковариации данных, ее собственные векторы и собственные значения. На рис. г) собственные векторы масштабированы соответствующими собственными значениями (голубые стрелки), и более длинный вектор соответствует подпространству главных компонент. Матрица ковариации данных изображена в виде эллипса.
  4. Проецируем данные в подпространство. Рисунок е) показывает итоговую проекцию, перенесенную в исходное пространство данных.

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

Метод опорных векторов (SVM)

Один из основных методов построения моделей машинного обучения – это метод опорных векторов (Support Vector Machine). Этот метод основан на построении гиперплоскости, максимально разделяющей объекты разных классов – то есть, обеспечивающей максимальное расстояние между граничными точками. Мы не будем вдаваться в детали его реализации, поскольку они достаточно сложны и выходят за рамки нашей статьи. Метод очень подробно, с примерами кода и анимацией, описан в статье на Хабре, откуда взята следующая иллюстрация:

Иллюстрация метода опорных векторов (опорные векторы отмечены красным цветом)
Иллюстрация метода опорных векторов (опорные векторы отмечены красным цветом)

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

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

Заключение

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

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

***

Если вы хотите наработать необходимую для изучения Data Science математическую базу и подготовиться к углубленным занятиям в «Школе обработки данных» или Computer Science Center, обратите внимание на онлайн-курс «Библиотеки программиста». С помощью опытных преподавателей из МГУ сделать это будет намного проще, чем самостоятельно по книгам. Студенты могут выбрать отдельные разделы (например, линейную алгебру) или оплатить весь курс целиком с существенной скидкой.

15
Фев
2021

📈 Для чего нужен математический анализ в машинном обучении

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

Математический анализ – основа всей высшей математики. Он необходим во многих разделах царицы наук: особенно это относится к производным и интегралам. К запуску авторского «Онлайн-курса по математике в Data Science Pro» мы начинаем публикацию серии статей об использовании математических методов в науке о данных. Сегодня рассмотрим несколько самых очевидных применений матанализа в машинном обучении.

Градиентный спуск

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

Знаки производной в точке экстремума и в ее окрестности
Знаки производной в точке экстремума и в ее окрестности

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

∇L(w1,w2,…wn)=[∂L∂w1,∂L∂w2,…∂L∂wn]

В данном случае L – это функция потерь (Loss) нашей модели машинного обучения, а w1,…wn – внутренние параметры модели, которые должны изменяться в процессе ее обучения (веса). Функция потерь измеряет “качество” модели, она может быть очень разной в зависимости от задачи. Например, для модели, предсказывающей значение одной переменной, это может быть квадрат разности между истинным значением этой переменной и предсказанным.

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

Градиентный спуск по поверхности функции потерь
Градиентный спуск по поверхности функции потерь

Идея метода градиентного спуска очень проста: «если идти все время вниз, то когда-нибудь достигнешь дна». Чтобы узнать, в каком направлении находится “низ”, мы и считаем вектор градиента.

Цепное правило и back-propagation

Изучая математический анализ, вы познакомитесь с цепным правилом вычисления производной – это правило вычисления производной сложной функции:


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

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

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

Такой метод расчета градиента называется обратным распространением ошибки, или просто обратным распространением (back-propagation). Именно этот метод дал старт широкому распространению всех видов нейронных сетей, которые изменили мир. История искусственных нейронных сетей началась еще в 1960-х, но лишь недавно появились вычислительные мощности, позволяющие реализовать обратное распространение.

Плотность распределения вероятности

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

Вероятность в виде интеграла функции плотности распределения
Вероятность в виде интеграла функции плотности распределения

Именно из этой формулы следует знаменитое правило трех сигм – эмпирическое правило, согласно которому 68% значений нормально распределенной случайной величины находятся в пределах одного стандартного отклонения от среднего значения, 95% значений – в пределах двух отклонений, и 99.7% (почти все) – в пределах трех отклонений.

Правило трех сигм
Правило трех сигм

Заключение

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

«Прикладное машинное обучение», в основном, это конструирование признаков.
Эндрю Ын.

Конструирование признаков (feature engineering) – это искусство создания нужных признаков на основе исследовательского анализа данных (exploratory data analysis, EDA). Например, анализ данных может показать квадратичную зависимость целевой переменной от некоторого признака – то есть, можно ввести признак, равный квадратному корню исходного, от которого целевая переменная будет зависеть линейно. Чтобы хотя бы заметить эту квадратичную зависимость, а тем более доказать ее, нужно очень хорошо знать математический анализ.

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

***

Если вы хотите наработать необходимую для изучения Data Science математическую базу, обратите внимание на онлайн-курс «Библиотеки программиста». С помощью опытных преподавателей из МГУ сделать это будет намного проще, чем самостоятельно по книгам. Студенты могут выбрать отдельные разделы (например, матанализ) или оплатить весь курс целиком с существенной скидкой.

12
Фев
2021

🤖 Четыре научные статьи о глубоком обучении, которые стоит прочитать в феврале 2021

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

Текст публикуется в…

11
Фев
2021

📊 Коллекция продвинутой визуализации в Matplotlib и Seaborn с примерами

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

Текст публикуется в переводе, автор оригинальной статьи – Rashida Nasrin Sucky.

***

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

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

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

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

Давайте импортируем необходимые пакеты и набор данных:

        import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import matplotlib as mpl
import seaborn as sns
import warnings
warnings.filterwarnings(action="once")
df = pd.read_csv("nhanes_2015_2016.csv")
    

Этот набор данных довольно велик, и я не могу показать его целиком. Но мы можем посмотреть список столбцов этого набора:

        df.columns
    

Вывод:

        Index(['SEQN', 'ALQ101', 'ALQ110', 'ALQ130', 'SMQ020', 'RIAGENDR', 'RIDAGEYR',
       'RIDRETH1', 'DMDCITZN', 'DMDEDUC2', 'DMDMARTL', 'DMDHHSIZ', 'WTINT2YR',
       'SDMVPSU', 'SDMVSTRA', 'INDFMPIR', 'BPXSY1', 'BPXDI1', 'BPXSY2',
       'BPXDI2', 'BMXWT', 'BMXHT', 'BMXBMI', 'BMXLEG', 'BMXARML', 'BMXARMC',
       'BMXWAIST', 'HIQ210'], dtype='object')
    

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

В наборе данных есть несколько качественных (categorical) столбцов, которые мы будем широко использовать – такие, как пол (RIAGENDR), семейное положение (DMDMARTL) и уровень образования (DMDEDUC2). Я хочу преобразовать их значения в осмысленные вместо каких-то чисел.

        df["RIAGENDRx"] = df.RIAGENDR.replace({1: "Male", 2: "Female"})
df["DMDEDUC2x"] = df.DMDEDUC2.replace({1: "<9", 2: "9-11", 3: "HS/GED", 4: "Some college/AA", 5: "College", 7: "Refused", 9: "Don't know"})
df["DMDMARTLx"] = df.DMDMARTL.replace({1: "Married", 2: "Widowed", 3: "Divorced", 4: "Separated", 5: "Never married", 6: "Living w/partner", 77: "Refused"})
    

Диаграммы рассеяния

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

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

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

        category = df["DMDMARTLx"].unique()
category
    

Вывод:

        array(['Married', 'Divorced', 'Living w/partner', 'Separated',
       'Never married', nan, 'Widowed', 'Refused'], dtype=object)
    

Теперь выберем цвет для каждой категории.

        colors = [plt.cm.tab10(i/float(len(category)-1)) for i in range(len(category))]
colors
    

Вывод:

        [(0.12156862745098039, 0.4666666666666667, 0.7058823529411765, 1.0),
 (1.0, 0.4980392156862745, 0.054901960784313725, 1.0),
 (0.17254901960784313, 0.6274509803921569, 0.17254901960784313, 1.0),
 (0.5803921568627451, 0.403921568627451, 0.7411764705882353, 1.0),
 (0.5490196078431373, 0.33725490196078434, 0.29411764705882354, 1.0),
 (0.4980392156862745, 0.4980392156862745, 0.4980392156862745, 1.0),
 (0.7372549019607844, 0.7411764705882353, 0.13333333333333333, 1.0),
 (0.09019607843137255, 0.7450980392156863, 0.8117647058823529, 1.0)]
    

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

        plt.figure(figsize=(16, 10), dpi=80, facecolor="w", edgecolor="k")
for i, cat in enumerate(category):
    plt.scatter("BPXDI1", "BPXSY1",
               data=df.loc[df.DMDMARTLx == cat, :],
                          s = 20, c=colors[i], label=str(cat))
    
plt.gca().set(xlabel='BPXDI1', ylabel='BPXSY1')
    
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.title("Marital status vs Systolic blood pressure", fontsize=18)
plt.legend(fontsize=12)
plt.show()
    

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

        df["dot_size"] = df.BMXBMI*10
    

Теперь сделаем нашу новую визуализацию:

        fig = plt.figure(figsize=(16, 10), dpi= 80, facecolor='w', edgecolor='k')    
for i, cat in enumerate(category):
    plt.scatter("BPXDI1", "BPXSY1", data=df.loc[df.DMDMARTLx == cat, :], s='dot_size', c=colors[i], label=str(cat), edgecolors='black')
plt.gca().set(xlabel='Diastolic Blood Pressure ', ylabel='Systolic blood Pressure')
plt.xticks(fontsize=12)
plt.yticks(fontsize=12)
plt.legend(fontsize=12)    
plt.show()
    

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

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

В следующей диаграмме я нарисую только первые 500 элементов из набора данных, предполагая, что весь набор организован случайным образом. Но я добавлю к этому набору еще один трюк. Я добавлю еще одну переменную – возраст, поскольку возраст может влиять на давление крови. Здесь я окружу те данные, для которых возраст больше 40. Вот этот код.

        from scipy.spatial import ConvexHull

df2 = df.loc[:500, :]
fig = plt.figure(figsize=(16, 10), dpi= 80, facecolor='w', edgecolor='k')
for i, cat in enumerate(category):
    plt.scatter("BPXDI1", "BPXSY1", data=df2.loc[df2.DMDMARTLx==cat, :], s='dot_size', c=colors[i], label=str(cat), edgecolors='black', alpha = 0.6, linewidths=.5)
    
def encircle(x,y, ax=None, **kw):
    if not ax: ax=plt.gca()
    p = np.c_[x,y]
    hull = ConvexHull(p)
    poly = plt.Polygon(p[hull.vertices,:], **kw)
    ax.add_patch(poly)
    
# Select data where age is more than 40
df_encircle = df2.loc[(df2["RIDAGEYR"] > 40), :].dropna()
# Drawing a polygon surrounding vertices    
encircle(df_encircle.BPXDI1, df_encircle.BPXSY1, ec="k", fc="gold", alpha=0.1)
encircle(df_encircle.BPXDI1, df_encircle.BPXSY1, ec="firebrick", fc="none", linewidth=1.5)

plt.gca().set(xlabel='BPXDI1', ylabel='BPXSY1')
plt.xticks(fontsize=12); plt.yticks(fontsize=12)
plt.title("Bubble Plot with Encircling", fontsize=22)
plt.legend(fontsize=12)    
plt.show()
    

Что мы можем узнать из этой диаграммы?

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

Размер кружков соответствует индексу массы тела – чем больше кружок, тем выше индекс. Я не смогла найти никакой зависимости между давлением крови и индексом массы тела из этой диаграммы.

Цвета показывают различное семейное положение. Видите ли вы доминирование одного цвета в какой-то определенной области? Едва ли. Я тоже не вижу никаких зависимостей между семейным положением и давлением крови.

Точечные диаграммы (stripplot)

Это интересный вид диаграмм. Когда множество точек данных перекрываются, и трудно увидеть все точки, стоит немного “растрясти” несколько точек, чтобы получить шанс ясно увидеть каждую точку. Точечная диаграмма делает именно это.

Для этой демонстрации я нарисую зависимость систолического давления крови от индекса массы тела.

        fig, ax = plt.subplots(figsize=(16, 8), dpi=80)
sns.stripplot(df2.BPXSY1, df2.BMXBMI, jitter=0.45, size=8, ax=ax, linewidth=0.5)
plt.title("Systolic Blood pressure vs Body mass index")
plt.tick_params(axis='x', which='major', labelsize=12, rotation=90)
plt.show()
    

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

        fig, ax = plt.subplots(figsize=(16,10), dpi= 80)    
sns.stripplot(df2.BPXDI1, df2.BPXSY1, s=10, hue = df2.RIDRETH1, ax=ax)
plt.title("Stripplot for Systolic vs Diastolic Blood Pressure", fontsize=20)
plt.tick_params(rotation=90)
plt.show()
    

Точечные диаграммы с «ящиками»

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

        fig, ax = plt.subplots(figsize=(30, 12))
ax = sns.boxplot(x="BPXDI1", y = "BPXSY1", data=df)
ax.tick_params(rotation=90, labelsize=18)
ax = sns.stripplot(x = "BPXDI1", y = "BPXSY1", data=df)
    

Вы можете увидеть медиану, минимум и максимум, диапазон, межквартильное расстояние и выбросы для каждого индивидуального значения. Разве это не прекрасно?

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

Точечные диаграммы со скрипичными

Мы выведем зависимость семейного положения (DMDMARTLx) от возраста (RIDAGEYR). Сначала посмотрим, как она выглядит, а потом сможем поговорить о ней дальше.

        fig, ax = plt.subplots(figsize=(30, 12))
ax = sns.violinplot(x= "DMDMARTLx", y="RIDAGEYR", data=df, inner=None, color="0.4")
ax = sns.stripplot(x= "DMDMARTLx", y="RIDAGEYR", data=df)
ax.tick_params(rotation=90, labelsize=28)
    

Эта диаграмма показывает семейное положение для каждого диапазона возраста. Посмотрите на скрипичную диаграмму для “Married” (женаты) – она почти одинаковой толщины независимо от возраста, с небольшими утолщениями. “Living with partner” («Живу с партнером») имеет максимальную толщину для возрастов около 30, а после 40 становится намного тоньше. Таким же образом вы можете сделать выводы и из других скрипичных диаграмм.

Скрипичные диаграммы, разделенные по полу

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

        fig = plt.figure(figsize=(16, 8), dpi=80)
grid=plt.GridSpec(4, 4, hspace=0.5, wspace=0.2)

ax_main = fig.add_subplot(grid[:, :-1])
ax_right = fig.add_subplot(grid[:, -1], xticklabels=[], yticklabels=[])

sns.violinplot(x= "DMDMARTLx", y = "BPXDI1", hue = "RIAGENDRx", data = df, color= "0.2", ax=ax_main)
sns.stripplot(x= "DMDMARTLx", y = "BPXDI1", data = df, ax=ax_main)

ax_right.hist(df.BPXDI1, histtype='stepfilled', orientation='horizontal', color='grey')
ax_main.title.set_fontsize(14)
ax_main.tick_params(rotation=10, labelsize=14)

plt.show()
    

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

Диаграммы с линией линейной регрессии

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

        g = sns.lmplot(x='BMXHT', y='BMXWT', hue = 'RIAGENDRx', data = df2,
              aspect = 1.5, robust=True, palette='tab10',
              scatter_kws=dict(s=60, linewidths=.7, edgecolors='black'))
plt.title("Height vs weight with line of best fit grouped by Gender", fontsize=20)
plt.show()
    

В этой диаграмме можно увидеть разделение на мужчин и женщин, выполняемое параметром ‘hue’. Из этого рисунка очевидно, что рост и вес мужской популяции в среднем выше, чем женской. Как для мужчин, так и для женщин выведены линии линейной регрессии.

Индивидуальные диаграммы с линией регрессии

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

В этом пункте мы нарисуем lmplot‘ы в различных диаграммах. Рост и вес могут быть разными для различного этнического происхождения (RIDRETH1). Вместо пола мы выведем рост и вес для каждой этнической группы в разных диаграммах.

        fig = plt.figure(figsize=(20, 8), dpi=80)
g = sns.lmplot(x='BMXHT', y='BMXWT', data = df2, robust = True,
              palette="Set1", col="RIDRETH1",
              scatter_kws=dict(s=60, linewidths=0.7, edgecolors="black"))
plt.xticks(fontsize=12, )
plt.yticks(fontsize=12)
plt.show()
    

Парные диаграммы

Парные диаграммы очень популярны при исследовательском анализе данных (exploratory data analysis, EDA). Парная диаграмма показывает зависимость каждой переменной от любой другой. Для примера я нарисую парную диаграмму для роста, веса, индекса массы тела и размеров по талии, разделенные по этнической группе. Я беру только первую 1000 элементов, поскольку это может сделать диаграмму немного более понятной.

        df3 = df.loc[:1000, :]
plt.figure(figsize=(10,8), dpi= 80)
sns.pairplot(df3[['BMXWT', 'BMXHT', 'BMXBMI', 'BMXWAIST', "RIDRETH1"]], kind="scatter", hue="RIDRETH1", plot_kws=dict(s=30))
plt.show()
    

Расходящиеся столбики

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

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

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

        x = df.loc[:, "BPXSY1"]
df["BPXSY1_n"] = (x - x.mean())/x.std()
df['colors'] = ['red' if i < 0 else 'blue' for i in df["BPXSY1_n"]]
df.sort_values("BPXSY1_n", inplace=True)
df.reset_index(inplace=True)
plt.figure(figsize=(16, 10), dpi=80)
plt.hlines(y = df.DMDHHSIZ, xmin=0, xmax = df.BPXSY1_n, color=df.colors, linewidth=3)
plt.gca().set(ylabel="DMDHHSIZ", xlabel = "BPXSY1_n")
plt.yticks(df.DMDHHSIZ, fontsize=14)
plt.grid(linestyle='--', alpha=0.5)
plt.show()
    

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

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

        x = df.loc[:, "BPXSY1"]
df['colors'] = ['coral' if i < 0 else 'lightgreen' for i in df["BPXSY1_n"]]
y_ticks = np.arange(16, 82, 8)
plt.figure(figsize=(16, 10), dpi=80)
plt.hlines(y = df.RIDAGEYR, xmin=0, xmax = df.BPXSY1_n, color=df.colors, linewidth=3)
plt.gca().set(ylabel="RIDAGEYR", xlabel = "BPXSY1")
plt.yticks(y_ticks, fontsize=14)
plt.grid(linestyle='--', alpha=0.5)
plt.show()
    

Этот вариант диаграммы выглядит таким очевидным. Систолическое давление крови в целом растет с возрастом. Не правда ли?

Заключение

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

04
Фев
2021

📊 Ваша повседневная шпаргалка по Matplotlib

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

Matplotlib – наиболее широко используемый инструмент на Python. Он имеет отличную поддержку множеством сред, таких, как веб-серверы приложений, графические библиотеки пользовательского интерфейса, Jupiter Notebook, iPython Notebook и оболочка iPython.

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

Архитектура Matplotlib

Matplotlib имеет три основных слоя: слой нижнего уровня (backend), слой рисунков и слой скриптов. Слой нижнего уровня содержит три интерфейсных класса: канва рисунка (figure canvas), определяющая область рисунка, прорисовщик (renderer), умеющий рисовать на этой канве, и событие (event), обрабатывающее ввод пользователя вроде щелчков мыши. Слой рисунков знает, как рисовать с помощью Renderer’а и рисовать на канве. Все, что находится на рисунке Matplotlib, является экземпляром слоя рисунка (artist). Засечки, заголовок, метки – все это индивидуальные объекты слоя рисунков. Слой скриптов – это облегченный интерфейс, который очень полезен для ежедневного применения. Все примеры, приведенные в этой статье, используют слой скриптов и среду Jupiter Notebook.

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

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

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

От переводчика
Для импорта файла xlsx нужно установить пакет xlrd, однако новые версии этого пакета перестали читать файлы xlsx по соображениям безопасности. Чтобы прочитать файл, установите старую версию xlrd командой pip install xlrd==1.2.0.

        import numpy as np  
import pandas as pd
df = pd.read_excel('https://s3-api.us-geo.objectstorage.softlayer.net/cf-courses-data/CognitiveClass/DV0101EN/labs/Data_Files/Canada.xlsx',
                       sheet_name='Canada by Citizenship',
                       skiprows=range(20),
                       skipfooter=2)
df.head()
    

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

        df.columns
# Вывод:
# Index([    'Type', 'Coverage',   'OdName',     'AREA', 'AreaName',      'REG',
#        'RegName',      'DEV',  'DevName',       1980,       1981,       1982,
#             1983,       1984,       1985,       1986,       1987,       1988,
#             1989,       1990,       1991,       1992,       1993,       1994,
#             1995,       1996,       1997,       1998,       1999,       2000,
#             2001,       2002,       2003,       2004,       2005,       2006,
#             2007,       2008,       2009,       2010,       2011,       2012,
#             2013],
#      dtype='object')
    

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

        df.drop(['AREA','REG','DEV','Type','Coverage'], axis=1, inplace=True)
df.head()
    

Посмотрите на эти столбцы. Столбец ‘OdName’ – на самом деле название страны, ‘AreaName’ – континент, а ‘RegName’ – регион на этом континенте. Переименуем эти столбцы, чтобы их имена стали более понятными.

        df.rename(columns={'OdName':'Country', 'AreaName':'Continent', 'RegName':'Region'}, inplace=True)
df.columns
# Вывод:
# Index([  'Country', 'Continent',    'Region',   'DevName',        1980,
#              1981,        1982,        1983,        1984,        1985,
#              1986,        1987,        1988,        1989,        1990,
#              1991,        1992,        1993,        1994,        1995,
#              1996,        1997,        1998,        1999,        2000,
#              2001,        2002,        2003,        2004,        2005,
#              2006,        2007,        2008,        2009,        2010,
#              2011,        2012,        2013],
#      dtype='object')
    

Теперь наш набор данных стал более простым для понимания. У нас есть Country, Continent, Region, а DevName указывает, является ли страна развитой или развивающейся. Все столбцы с годами содержат количество иммигрантов в Канаду из соответствующей страны за указанный год. Теперь добавим столбец ‘Total’ (‘Всего’), в котором будет содержаться общее количество иммигрантов из этой страны с 1980-го до 2013-го.

Посмотрите, в конце добавился новый столбец 'Total'.
Посмотрите, в конце добавился новый столбец ‘Total’.

Проверим, есть ли в наборе какие-либо значения null.

        df.isnull().sum()
    

Результат показывает 0 во всех столбцах, то есть в наборе нет пропусков. Я люблю задавать в качестве индекса значащий столбец, а не какие-то цифры, поэтому установим столбец ‘Country’ в качестве индекса.

        df = df.set_index('Country')
    

Теперь набор данных достаточно чист и красив, чтобы начать работать с ним, поэтому больше чистить мы не станем. Если нам потребуется что-то еще, мы сделаем это по мере необходимости.

Упражнения по рисованию диаграмм

В этой статье мы попробуем несколько различных типов диаграмм – таких, как линейная диаграмма (line plot), диаграмма с областями (area plot), секторная диаграмма (pie plot), диаграмма рассеяния (scatter plot), гистограмма, столбчатая диаграмма (bar graph). Сначала импортируем необходимые пакеты.

        %matplotlib inline
import matplotlib.pyplot as plt
import matplotlib as mpl
    

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

        plt.style.available
# Вывод:
# ['bmh',
#  'classic',
#  'dark_background',
#  'fast',
#  'fivethirtyeight',
#  'ggplot',
#  'grayscale',
#  'seaborn-bright',
#  'seaborn-colorblind',
#  'seaborn-dark-palette',
#  'seaborn-dark',
#  'seaborn-darkgrid',
#  'seaborn-deep',
#  'seaborn-muted',
#  'seaborn-notebook',
#  'seaborn-paper',
#  'seaborn-pastel',
#  'seaborn-poster',
#  'seaborn-talk',
#  'seaborn-ticks',
#  'seaborn-white',
#  'seaborn-whitegrid',
#  'seaborn',
#  'Solarize_Light2',
#  'tableau-colorblind10',
#  '_classic_test']
    

Я буду использовать стиль ‘ggplot’. Вы можете взять любой другой стиль по своему вкусу.

        mpl.style.use(['ggplot'])
    

Линейная диаграмма

Будет полезным увидеть график изменений иммиграции в Канаду для одной страны. Создадим список лет с 1980-го до 2013-го:

        years = list(range(1980, 2014))
    

Я выбрала для этой демонстрации Швейцарию. Приготовим иммиграционные данные по нашим годам для этой страны.

        df.loc['Switzerland', years]
    
Данные по иммиграции из Швейцарии (часть)
Данные по иммиграции из Швейцарии (часть)

Настало время нарисовать диаграмму. Это очень просто: достаточно вызвать функцию plot для приготовленных нами данных. Затем добавим заголовок и метки для осей x и y.

        df.loc['Switzerland', years].plot()
plt.title('Immigration from Switzerland')
plt.ylabel('Number of immigrants')
plt.xlabel('Years')
plt.show()
    

Что, если мы хотим вывести графики иммиграции для нескольких стран сразу, чтобы сравнить тенденции иммиграции из этих стран в Канаду? Это делается почти так же, как и в прошлом примере. Нарисуем диаграмму иммиграции из трех южно-азиатских стран: Индии, Пакистана и Бангладеш по годам.

        ind_pak_ban = df.loc[['India', 'Pakistan', 'Bangladesh'], years]
ind_pak_ban.head()
    

Посмотрите на формат этих данных – он отличается от данных по Швейцарии, использованных прежде. Если мы вызовем функцию plot для этого DataFrame (ind_pak_ban), она выведет количество иммигрантов в каждой стране по оси x и годы по оси y. Нам нужно изменить формат данных:

        ind_pak_ban.T
    

Это не весь набор данных, а только его часть. Видите, теперь формат данных изменился. Теперь годы будут выводиться по оси x, а количество иммигрантов из каждой страны по оси y.

        ind_pak_ban.T.plot()
    

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

Секторная диаграмма

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

        cont = df.groupby('Continent', axis=0).sum()
    

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

        cont['Total'].plot(kind='pie', figsize=(7,7),
                  autopct='%1.1f%%',
                  shadow=True)
# plt.title('Immigration By Continenets')
plt.axis('equal')
plt.show()
    

Заметьте, что мне пришлось использовать параметр ‘kind’. Все виды диаграмм, кроме линейной, в функции plot нужно указывать явно. Я ввожу новый параметр ‘figsize’, определяющий размеры диаграммы.

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

        colors = ['lightgreen', 'lightblue', 'pink', 'purple', 'grey', 'gold']
explode=[0.1, 0, 0, 0, 0.1, 0.1]
cont['Total'].plot(kind='pie', figsize=(17, 10),
                  autopct = '%1.1f%%', startangle=90,
                  shadow=True, labels=None, pctdistance=1.12, colors=colors, explode = explode)
plt.axis('equal')
plt.legend(labels=cont.index, loc='upper right', fontsize=14)
plt.show()
    
Разве эта диаграмма не лучше? Мне она нравится больше
Разве эта диаграмма не лучше? Мне она нравится больше

Ящик с усами (boxplot)

Сначала мы построим “ящик с усами” для количества иммигрантов из Китая.

        china = df.loc[['China'], years].T
    

Вот наши данные. А вот диаграмма, построенная по этим данным.

        china.plot(kind='box', figsize=(8, 6))
plt.title('Box plot of Chinese Immigrants')
plt.ylabel('Number of Immigrants')
plt.show()
    

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

Мы можем нарисовать несколько ящиков с усами в одной диаграмме. Используем DataFrame ind_pak_ban и нарисуем ящики для количества иммигрантов из Индии, Пакистана и Бангладеш.

        ind_pak_ban.T.plot(kind='box', figsize=(8, 7))
plt.title('Box plots of Inian, Pakistan and Bangladesh Immigrants')
plt.ylabel('Number of Immigrants')
    

Диаграмма рассеяния

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

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

        totalPerYear = pd.DataFrame(df[years].sum(axis=0))
totalPerYear.head()
    

Нам нужно преобразовать годы в целые числа. Я также хочу немного причесать DataFrame, чтобы сделать его более презентабельным.

        totalPerYear.index = map(int, totalPerYear.index)
totalPerYear.reset_index(inplace=True)
totalPerYear.columns = ['year', 'total']
totalPerYear.head()
    

Осталось задать параметры осей x и y для диаграммы рассеяния.

        totalPerYear.plot(kind='scatter', x = 'year', y='total', figsize=(10, 6), color='darkred')
plt.title('Total Immigration from 1980 - 2013')
plt.xlabel('Year')
plt.ylabel('Number of Immigrants')
plt.show()
    

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

Диаграмма с областями

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

        top = df.loc[['India', 'China', 'Pakistan', 'France'], years]
top = top.T
    

Набор данных готов. Пора сделать из него диаграмму.

        colors = ['black', 'green', 'blue', 'red']
top.plot(kind='area', stacked=False, figsize=(20, 10), color=colors)
plt.title('Immigration trend from Europe')
plt.ylabel('Number of Immigrants')
plt.xlabel('Years')
plt.show()
    

Не забудьте использовать параметр ‘stacked’, если хотите увидеть области для каждой отдельной страны. Если не установить stacked = False, диаграмма будет выглядеть примерно так:

Если диаграмма stacked (по умолчанию), область, соответствующая каждой переменной, соответствует не расстоянию до оси <b>x</b>, а расстоянию до графика предыдущей переменной.
Если диаграмма stacked (по умолчанию), область, соответствующая каждой переменной, соответствует не расстоянию до оси x, а расстоянию до графика предыдущей переменной.

Гистограмма

Гистограмма показывает распределение переменной. Вот ее пример:

        df[2005].plot(kind='hist', figsize=(8,5))
plt.title('Histogram of Immigration from 195 Countries in 2005') # заголовок гистограммы
plt.ylabel('Number of Countries') # y-метка
plt.xlabel('Number of Immigrants') # x-метка
plt.show()
    

Мы построили гистограмму, показывающую распределение иммиграции за 2005 год. Гистограмма показывает, что из большинства стран приехало от 0 до 5000 иммигрантов. Только несколько стран прислали 20 тысяч, и еще пара стран прислала по 40 тысяч иммигрантов.

Давайте используем DataFrame top из предыдущего примера и нарисуем распределение количества иммигрантов из каждой страны в одной и той же гистограмме.

        top.plot.hist()
plt.title('Histogram of Immigration from Some Populous Countries')
plt.ylabel('Number of Years')
plt.xlabel('Number of Immigrants')
plt.show()
    

На предыдущей гистограмме мы видели, что из нескольких стран приехало 20 и 40 тысяч иммигрантов. Похоже, что Китай и Индия среди этих “нескольких”. На этой гистограмме мы не можем четко увидеть границы между столбцами. Давайте улучшим ее.

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

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

        count, bin_edges = np.histogram(top, 15)
top.plot(kind = 'hist', figsize=(14, 6), bins=15, alpha=0.6, 
        xticks=bin_edges, color=colors)
    
Гистограмма с прозрачностью. Теперь мы можем увидеть каждое распределение.
Гистограмма с прозрачностью. Теперь мы можем увидеть каждое распределение.

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

        top.plot(kind='hist',
          figsize=(12, 6), 
          bins=15,
          xticks=bin_edges,
          color=colors,
          stacked=True,
         )
plt.title('Histogram of Immigration from Some Populous Countries')
plt.ylabel('Number of Years')
plt.xlabel('Number of Immigrants')
plt.show()
    

Столбчатая диаграмма

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

        france = df.loc['France', years]
france.plot(kind='bar', figsize = (10, 6))
plt.xlabel('Year') 
plt.ylabel('Number of immigrants') 
plt.title('Immigrants From France')
plt.show()
    

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

        france.plot(kind='bar', figsize = (10, 6))
plt.xlabel('Year') 
plt.ylabel('Number of immigrants') 
plt.title('Immigrants From France')
plt.annotate('Increasing Trend',
            xy = (19, 4500),
            rotation= 23,
            va = 'bottom',
            ha = 'left')
plt.annotate('',
            xy=(29, 5500),
            xytext=(17, 3800),
            xycoords='data',
            arrowprops=dict(arrowstyle='->', connectionstyle='arc3', color='black', lw=1.5))
plt.show()
    

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

        france.plot(kind='barh', figsize=(12, 16), color='steelblue')
plt.xlabel('Year') # add to x-label to the plot
plt.ylabel('Number of immigrants') # add y-label to the plot
plt.title('Immigrants From France') # add title to the plot
for index, value in enumerate(france):
    label = format(int(value), ',')
    plt.annotate(label, xy=(value-300, index-0.1), color='white')
    
plt.show()
    

Разве эта диаграмма выглядит не лучше, чем предыдущая?

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

Расширенные методы визуализации описаны в следующих статьях:

02
Фев
2021

📚 С чего начиналась наука о данных: история в лицах и ключевых работах

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

30
Янв
2021

📊 Обучение на Data Scientist: как получить работу, если без опыта никуда не берут?

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

Мы уже писали о выборе специализаци…

27
Янв
2021

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

Сделали подборку чатов программистов в Slack, Telegram и Gitter.
— Читать дальше «Где общаются разработчики: русскоязычные чаты программистов»

22
Янв
2021

Интенсив «Профессия Data Scientist: учимся обработке и анализу данных за 3 дня»

Сможете примерить на себя роль Data Scientist: поработаете с основными инструментами профессии, визуализируете данные, построите формулы и выявите зависимости на Python.
— Читать дальше «Интенсив «Профессия Data Scientist: учимся обработке и анализу да…

19
Янв
2021

📊 Проверьте свои навыки: еще 26 вопросов с собеседований по Data Science с ответами

Статья продолжает тему первой публикации («26 вопросов и ответов с собеседований») и предлагает 26 новых вопросов для проверки навыков в Data Science.

Сможете ли вы ответить на все…

18
Янв
2021

📊 Проверьте свои навыки: 26 вопросов и ответов с собеседований по Data Science

Если вы уже освоили основы профессии, стоит проверить свои шансы на трудоустройство. Публикуем 26 вопросов и ответов с реальных собеседований на позиции в Data Science.

В этой стат…

13
Янв
2021

Базовые знания Data Science: что и где нужно изучить новичку

Область Data Science сейчас популярна и есть везде. Разбираемся, что нужно знать для минимального входа в эту сферу.
— Читать дальше «Базовые знания Data Science: что и где нужно изучить новичку»

12
Янв
2021

Data Science для начинающих: 12 проектов на Python за 3 часа

Если только начинаете путь в Data Science, попробуйте сделать эти проекты для начинающих. Они научат вас собирать и визуализировать данные.
— Читать дальше «Data Science для начинающих: 12 проектов на Python за 3 часа»

10
Янв
2021

📊 Обучение Data Science: 11 необходимых специалисту по анализу данных концепций из статистики

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

Статистика …

31
Дек
2020

📊 ТОП-10 необходимых для специалиста по Big Data навыков

Рассказываем о необходимом наборе технических и карьерных навыков для специалиста по Big Data.

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

Big Data – это термин, используемый для обозначения значительного объема как структурированных, так и неструктурированных данных, который слишком велик для обработки традиционными методами. Аналитик больших данных – это специалист, который выявляет и исследует закономерности в данных с помощью специальных программных средств. Большие данные – перспективное направление в сфере Data Science. По мере того, как компании внедряют соответствующие методы, владеющие ими сотрудники будут становиться все более востребованными.

<a href="https://www.valtira.com/wp-content/uploads/2020/01/analytics.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

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

, <a href="https://www.valtira.com/wp-content/uploads/2020/01/analytics.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
, Источник

Аналитические навыки

Аналитические способности и навыки одни из самых важных для работы с большими данными. Без них нельзя стать экспертом в данной области. Аналитические инструменты необходимы для решения проблем в бизнесе или других сферах, а для глубокого понимания их возможностей необходимо обладать как математическими знаниями, так и методами количественного анализа данных, вроде описательной статистики и статистики умозаключений. Это помогает инженерам Big Data курировать большое количество неструктурированных данных, обобщать их и находить закономерности для прогнозного анализа

Достижения в области технологий за последние пять лет вывели интеллектуальный анализ на ошеломляющие высоты. Профессионалы с релевантным опытом пользуются большим спросом во всех технологических сферах. Получить его можно, изучая инструменты, вроде RapidMiner, KNIME или Apache Mahout.

Машинное обучение и искусственный интеллект

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

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

<a href="https://www.bsebti.com/blog/wp-content/uploads/2020/08/expert-talk-data-science-data-analytics-machine-learning.jpg" target="_blank" rel="noopener noreferrer nofollow">Источник</a>
Источник

Бизнес-аналитика

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

Интерпретация и визуализация данных

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

Данные должны быть четко и ясно представлены для передачи в понятном для широкой публике формате. Важно, чтобы вы хорошо понимали бизнес-среду и предметную область, а также умели четко донести идею до аудитории. Придется развивать навыки коммуникации и презентации. Можно начать с изучения визуализации данных с помощью специальных инструментов и программного обеспечения: Tableau, Data Wrapper, Plotly и т. д.

Навыки программирования

Чтобы стать специалистом по большим данным, необходимо знать основы алгоритмов, структур данных, а также объектно-ориентированных языков программирования. Профессионал должен уметь проводить количественный и статистический анализ. Необходимо изучить основные понятия кодирования и уметь исправлять ошибки в существующем коде, который является частью массивной базы данных. Основные языки, в которые стоит инвестировать свое время включают Python, SQL, Java и C++. Нет никакой необходимости изучать все существующие языки, но если вы не ограничите себя только одним, это значительно повысит шансы на трудоустройство и карьерный рост. Например, знание статистических языков, таких как R и Python, даст кандидату преимущества в области аналитики.

Навыки решения проблем

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


Базы данных SQL и NoSQL

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

  1. Хранящие информацию в виде записей в таблицах и позволяющие использовать для доступа к ней структурированный язык запросов (SQL). SQL формирует основу движения больших данных и занимает центральное место в хранилищах Hadoop Scala.
  1. Подход NoSQL (от англ. not only SQL) становится все более популярным, поэтому специалисты по Big Data должны быть знакомы и с ним. Распределенные базы данных NoSQL, вроде MongoDB, быстро заменяют сболее традиционные аналоги SQL, включая DB2 и Oracle. Зачастую они обеспечивают более эффективные возможности хранения и доступа. Серверы NoSQL работают в полной гармонии с Hadoop, а наличие навыков работы с ними существенно повысит ваши шансы на трудоустройство.

Знакомство с технологиями

Профессионалы в области больших данных должны быть знакомы с целым рядом технологий и инструментов, помогающих проводить анализ и делать выводы. Всегда лучше работать с максимально широким технологическим стеком: Scala, Hadoop, Linux, MatLab, R, SAS, SQL, Excel, SPSS и т.д. Это существенно повысит ваши шансы на трудоустройство и быстрый карьерный рост.

Фреймворки, вроде Hadoop и Apache Spark помогают в потоковой передаче моделей больших данных, а различные компоненты Apache Hadoop (MapReduce, HIVE, HDFS и Pig) пользуются большим спросом у специалистов и работодателей.

Навыки работы с публичными и гибридными облаками

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

Некоторые из общедоступных облаков, которые нужно знать: Amazon Web Services (AWS), Microsoft Azure, Alibaba Cloud. К внутренним облачным технологиям относятся OpenStack, Vagrant, Openshift, Docker, Kubernetes и др.

Практические навыки

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

***

Если вы только начинаете свой путь в профессии, хотите получить диплом и помощь в трудоустройстве, обратите внимание на курс Факультета Аналитики Big Data онлайн-университета GeekBrains. Помимо основ математики, языка Python и систем управления базами данных, в программу включена работа с Apache Hadoop и Apache Spark. Обучение ориентировано на применение навыков машинного обучения в бизнесе и построено по принципу практической работы над проектами с ведущими специалистами отрасли и личным помощником-куратором. Успешно окончившие курс студенты получат диплом о профессиональной подготовке и помощь в трудоустройстве.