В таком типе задач есть два основных класса задач: задача регрессии, когда нужно прогнозировать показатель с непрерывной шкалой (например, деньги, вероятность); а также задача классификации, когда нужно понять, к какому классу принадлежит объект (есть ли на фотографии люди, человек болен или нет, кто изображен на фотографии). Есть еще ряд задач, связанных с переводом текста, распознаванием речи, геопозиционированием, которые получили большое распространение благодаря глубоким нейронным сетям.
Понятие «регрессия» возникло, когда сэр Френсис Гамильтон познакомился с книгой Дарвина «Происхождение видов». Он решил изучить, как рост детей зависит от роста родителей. В процессе исследования он выяснил, что дети очень высоких и очень низких родителей в среднем имеют менее высокий и, соответственно, менее низкий рост. Это движение роста назад в направлении к среднему Ф. Гамильтон назвал регрессией (to regress – двигаться в обратном направлении) [51]. В 1885 году он издал работу «Регрессия в направлении к общему среднему размеру при наследовании роста», через некоторое время это понятие стало применяться ко всем задачам с односторонней стохастической зависимостью.
Обучение без учителя (unsupervised learning) подразумевает, что в данных есть закономерность, но вы не знаете какая (нет зависимой переменной). Это может быть задача разделения датасета на кластеры (кластерный анализ), поиск аномалий, автоэнкодеры (например, для уменьшения размерности пространства фич), метод главных компонент (Principal Component Analysis), коллаборативная фильтрация (рекомендательные системы).
Обучение с подкреплением (reinforcement learning) – модель учится через взаимодействие со средой. Это частный случай модели с учителем, где учителем является не датасет, а реакция среды на какое-то действие, которое мы произвели. Часто применяется при разработке ботов для игр (не только стрелялки, но и шахматы), управлении роботами. В отличие от классического машинного обучения, датасета здесь нет. Агент (например, робот) производит какое-либо действие в среде, получает обратную связь, которая транслируется в награду (reward). Агент учится совершать такие действия, которые максимизируют его награду. Так, например, можно научить робота ходить или играть в шахматы.
Для каждого типа задач классического ML есть соответствующий алгоритм. Например шпаргалка (cheat sheet, рис. 8.2) (https://topdatalab.ru/ref?link=117) для очень популярной библиотеки scikit learn выглядит так:
Рис. 8.2. Шпаргалка методов ML (https://scikit-learn.org/stable/tutorial/machine_learning_map/index.html)
В зависимости от задачи и данных, предлагается вариант модели, которая, скорее всего, будет успешной. Именно с этой библиотеки я начал свое изучение ML-моделей в Python, когда участвовал в соревнованиях на Kaggle.
Метрики ML-задач
Если в данных есть неслучайная закономерность, выбрана соответствующая задаче модель и есть достаточный набор данных, то обучение ML-модели не выглядит чем-то сложным. Самый первый шаг – понять, как измерить эффективность модели. Это очень важно: если мы делаем модель, которая будет помогать в реальной жизни, у нее должно быть четкое определение цели. А цель уже выражается метрикой. Например, если нужно, чтобы она прогнозировала спрос на товары, то цель – уменьшить процент расхождения с реальностью (ошибка прогноза). Если по фотографии нужно определить, есть ли там изображение собаки, то цель – увеличить процент правильно угаданных фотографий. В любых задачах на Kaggle есть метрика, по которой выбирают победителя.
Этот шаг новички – и не только они – часто игнорируют или выполняют невнимательно. По опыту работы в Retail Rocket скажу, что ошибка в выборе правильной метрики может стоить очень дорого. Это фундамент всего ML. Сделать это не так просто, как кажется на первый взгляд. К примеру, есть несколько систем тестирования COVID-19 через мазок из горла. Одна из них дает больше ложноположительных результатов (больной на самом деле не болен), вторая – больше ложноотрицательных (пропускает больных, которые заразны). Какую систему выбрать? Если первую, то вы запрете дома много здоровых людей, это повлияет на экономику. Если вторую – то пропущенные больные будут распространять вирус. Такой выбор – это баланс плюсов и минусов. Аналогичные проблемы есть в разработке систем рекомендаций: пусть первый алгоритм выдает более логичные с точки зрения пользователя рекомендации, а второй дает магазину больший доход. (Это означает, что машина обучалась на слабых, но важных сигналах, которые кажутся нам нелогичными, и ее рекомендации приводят к росту продаж, хотя это и невозможно объяснить логикой в силу ограниченности человеческого ума.) Какой алгоритм выбрать? С точки зрения бизнеса – второй, но когда такую систему продают и показывают менеджерам, принимающим решение о покупке, им часто нравится первый вариант. Их можно понять, ведь сайт – это витрина, и она должна выглядеть привлекательно. В итоге приходится трансформировать работающий первый алгоритм, стараясь зафиксировать высокие финансовые показатели, но сделать так, чтобы рекомендации выглядели более логично. Фокус на нескольких метриках сильно усложняет разработку новых алгоритмов.
Любая метрика считается как разность между тем, что прогнозирует модель по входным данным (независимые переменные, или фичи), и тем, что есть на самом деле (зависимая переменная, или outcome). Существует много нюансов расчета метрик, но суть всегда именно в этой разнице. Типовые метрики ML-задач зависят от их класса.
Для регрессии – это среднеквадратичная ошибка (Mean Squared Error, MSE). Считается как сумма квадратов разностей прогнозируемого и действительного значений из датасета, деленное на число примеров в датасете:
Есть еще ряд популярных метрик, таких как RMSE, MAE, R2.
Для задач классификации самые популярные метрики можно легко получить из матрицы ошибок классификации (misclassification или confusion matrix). Когда я собеседую кандидата на должность аналитика, то часто прошу нарисовать эту матрицу (табл. 8.2) и вывести из нее метрики.
Представьте, что вам нужно решить задачу классификации – определить, простужен человек или нет. У вас есть датасет со следующими фичами: температура тела, болит ли горло, есть ли насморк, чихание, светобоязнь. Для каждого примера у вас есть идентификатор: 1, или True, – человек болен простудой, 0, или False, – нет. Вы строите модель, которая для каждого примера дает результат: 1 для больного, 0 для здорового. Чтобы понять ошибку вашей модели, нужно сравнить ее вывод и правильные значения. Допустим, мы это сделали и теперь можем составить такую матрицу ошибок классификации. В строках мы отметим предсказанные значения, в столбцах – действительные. В ячейках таблицы можем написать количество случаев для каждого класса (0 и 1) – когда прогноз совпал, а когда нет. Я заполнил таблицу, к примеру, 100 примеров, когда мы верно угадали единицу.