В соревнованиях по машинному обучению прокачиваются навыки практического использования ML и создания фич на базе датасета. Там может поучаствовать каждый зарегистрировавшийся и получить очень хороший опыт. Все выглядит отлично, не правда ли? Но в них есть другая сторона эти решения нельзя использовать в лоб, можно взять оттуда лишь некоторые идеи. Например, сам Netflix заявил [65], что алгоритм ансамбль победителей состоял из 107 субалгоритмов, из которых только два дали самый значимый результат: факторизация матриц (SVD) и ограниченная машина Больцмана (RBM). В компании не без труда внедрили эти два алгоритма в рабочую систему. Сработало правило Парето: 20 % усилий (2 алгоритма) дали 80 % результата. Отмечу еще раз: они не стали внедрять всего монстра целиком, а взяли всего лишь два его элемента. Победивший алгоритм невозможно внедрить, он очень ресурсоемкий и сложный. Его поддержка стоила бы космических денег.
Это и есть основной недостаток решений, полученных на таких соревнованиях, нет ограничений на вычисления и простоту результата. Такие решения часто будут нежизнеспособными конструктами. И тем не менее я все равно призываю вас участвовать в соревнованиях, это полезно. Подсматривайте решения на форумах и повторяйте их, учитесь делать фичи это непросто, но в них заключено искусство ML. Не нужно занимать топовые места, достаточно, чтобы метрики ваших решений были процентов на пять хуже лидера. Даже если вы просто окажетесь выше медианы оценок уже хорошо. Так вы научитесь многому.
Если бы у меня был выбор между двумя кандидатами: первый занимает призовые места на Kaggle и имеет за плечами десятки моделей, а второй реализовал всего две, но придумал задачу, решил, внедрил ее и доказал метриками, что она зарабатывает деньги для компании, я бы предпочел второго. Даже если ему не придется повторять на новом месте все эти этапы, я могу сделать вывод, что он способен видеть картину целиком, а значит, сможет говорить на одном языке с людьми, которые будут внедрять продукт его труда, без проблем будет понимать ограничения и требования смежных департаментов.
Искусственный интеллект
Искусственный интеллект (AI) очень модный термин, и я его ни разу не использовал в моей книге, хотя занимаюсь именно им. Словосочетание data mining я услышал еще в начале двухтысячных, когда работал в StatSoft. За этим маркетинговым термином кроется обычный анализ данных, сделанный из нескольких компонент. Мы с коллегами шутили, что весь этот data mining настоящие спецы делают на коленке. Через некоторое время возник новый термин машинное обучение, он гораздо лучше зашел у специалистов, потому что действительно описывал новую область. Третий термин большие данные, хайп вокруг которых сейчас уже поутих. Просто технология не оправдала слишком больших надежд, которые были на нее возложены. Я не помню, чтобы на конференциях ACM RecSys хоть раз слышал выражение big data, хотя часть игроков, которые там участвуют, обладают очень большими данными (Amazon, Google, Netflix). Компании используют их только для брендинга и продаж своих услуг, чтобы показать, что они в тренде. Иначе их обойдут конкуренты.
Об AI широко заговорили с появлением нейронных сетей глубокого обучения (Deep Learning). Принцип работы нейрона как строительной единицы нейронной сети был заимствован из биологии. Но согласитесь, это еще не повод считать нейронную сеть интеллектом, близким хотя бы к интеллекту насекомых. Пока те операции, которые реализуются нейронными сетями, очень примитивны по сравнению с тем, на что способны даже самые примитивные живые существа (например, синтезировать новую жизнь, не говоря уже о полностью самостоятельном принятии решений). По моему мнению, человечество сможет приблизиться к созданию интеллекта, близкого к интеллекту животного, лишь тогда, когда сумеет синтезировать и обучать биологические нейронные сети, не полностью электронные.
Вместо абстрактного искусственного интеллекта я предпочитаю использовать более конкретные термины, например компьютерное зрение. Благодаря нейронным сетям именно в этой области произошел самый большой прорыв. Сейчас компьютерное зрение используется везде от тегирования людей в мобильных телефонах и соцсетях до самоуправляемых автомобилей. Его используют и государства для выполнения полицейских функций, и коммерческие организации для решения своих задач. Мне лично нравятся примеры, когда дружба железа и софта приносит практическую пользу. Например, есть робот Stingray, который уничтожает вшей искусственно выращиваемого лосося с помощью компьютерного зрения и лазера [73]. Этот паразит является причиной массовой гибели рыбы при искусственном разведении. Например, компания «Русская аквакультура», крупнейший российский производитель искусственно выращенного лосося, в 2015 году потеряла больше 70 % рыбы, которая погибла из-за вспышки лососевой вши. Потери из-за мора компания оценивала в 1 млрд руб. [74]. А вот подводный робот позволяет решать проблему заметив паразита на теле рыбы, он уничтожает его с помощью лазера.
Второе направление большого прорыва роботизация. Здесь все не ограничивается только компьютерным зрением. Когда я был в музее MIT в Бостоне, то обратил внимание, что проект Boston Dynamics уходит корнями в 80-е, в лаборатории MIT. Уже тогда ученые этого лучшего университета мира занимались компьютерным зрением и управлением роботов. В те годы у них уже был прыгающий на одной палке робот, который не падал. Boston Dynamics выделились из MIT в 1992 году. Сейчас компания известна своими роботами, которые давно стали героями YouTube и бьют рекорды просмотров. Недавно Boston Dynamics купила корейская Hyundai за 1 миллиард долларов. Если честно, в такие моменты я не понимаю наших сверхбогатых соотечественников мне кажется, гораздо интереснее вкладывать деньги в такие проекты с перспективой стать вторым Илоном Маском, чем в футбольные клубы. Несмотря на то что новаторские проекты вроде Boston Dynamics пока плохо коммерциализированы, их время еще придет ведь туда идет человечество.
Заменит ли AI людей? Думаю, что да. И это сделает бизнес. Сам по себе бизнес подчиняется жадным алгоритмам: если есть возможность сэкономить это будет сделано. Когда-то с целью экономии многие западные компании начали размещать производства в Юго-Восточной Азии, где труд рабочих стоил намного дешевле. С внедрением роботизации число рабочих на единицу продукции уменьшается, логистические расходы в какой-то момент становятся выше трудовых, и тогда становится выгоднее производить товар в стране, где осуществляются продажи. Как пример создание роботизированных фабрик Speedfactory компании Adidas. Были открыты две фабрики в Германии и США в 2016 и 2017 годах [74]. Целью было сделать производство ближе к покупателю. В 2019 году компания приняла решение закрыть эти фабрики. Несмотря на эту неудачу тенденция налицо роботизация производства будет заменять все больше людей.
Необходимые преобразования данных
Перед тем как скармливать данные моделям ML, нужно провести над ними несколько важных преобразований:
стандартизацию данных (приведение к единой шкале);
удаление выбросов;
подготовку категориальных переменных;
работу с пропущенными данными (missing data);
сэмплинг несбалансированных классов.
Для линейных моделей можно нормализовать данные, так как часто сами данные представлены на разных шкалах. Например, в датасете есть две фичи: цена квартиры (2 000 000100 000 000 рублей) и ее площадь (20500 квадратных метров). Диапазон значений очень разный, поэтому коэффициенты модели теряют физический смысл. Будет невозможно сравнить влияние той или иной переменной на модель. Если использовать регуляризацию, также возникнет проблема ненужная пессимизация коэффициентов. Есть разные варианты стандартизации, один из них вычесть среднее и разделить на стандартное отклонение переменной. На выходе получится переменная со средним, равным нулю, и стандартным отклонением, равным 1. На ошибку линейной модели стандартизация не влияет (если без регуляризации), но есть некоторые типы методов, которые чувствительны к шкалам переменных, например метод главных компонент (PCA, о котором я рассказал в прошлой главе).
Выбросы также могут вносить существенную ошибку в модель. Прямая линейной регрессии пройдет по-другому, если удалить выбросы, что особенно важно, когда данных мало. Удаление выбросов непростая задача. Самый простой способ удалить данные, которые лежат вне какого-либо перцентиля, например 99-го. На графике (рис. 9.1) представлен пример, как выброс изменил прямую, пунктиром показана прямая линейной регрессии для данных с выбросов, сплошной без выброса. Видно, что точка выброса «поворачивает» прямую в свою сторону.
Категориальные переменные мы уже обсуждали в главе о данных. В их использовании есть нюансы. Обычно нет никаких проблем с бинарными переменными (да/нет, 0/1), нужно лишь свести их к значениям 0 и 1 (dummy variable), если работаете с линейными моделями. Сама операция называется label encoding. Что касается
Рис. 9.1. Выброс меняет поведение
деревьев решений, нужно смотреть документацию конкретного метода в каком виде представить категориальные переменные. Когда идет работа с категориальной переменной, у которой три и более значений, в большинстве случаев требуется ее разбить на несколько бинарных. Например, если есть переменная c тремя значениями: Да/Нет/Не знаю, то ее нужно разбить на три переменные (по числу значений). Можно назвать эти переменные по названию значений: Да, Нет, Не знаю. Каждая переменная будет принимать значение 0 или 1. Например, если у исходной переменной было значение «Да», то эти переменные примут следующие значения: Да = 1, Нет = 0, Не знаю = 0. Эта операция кодирования называется one-hot encoding. Выполнять ее необходимо потому что, в отличие от непрерывных числовых переменных, взаимоотношения между значениями переменных (больше или меньше) не определены, а значит, операция сравнения значений невозможна. Некоторые методы поддерживают категориальные переменные со множеством значений, например, catBoost от Яндекса. Есть еще один вариант кодирования динамичных категориальных значений, например слов текста, метод называется hashing trick. Он нужен, чтобы не заводить огромное количество переменных, когда число значений очень велико.