Data Science

Вообразите, что вам только что удалось заполучить набор данных клинических испытаний. Превосходно! Чтобы помочь вам войти в роль, я подготовила следующие данные:

Расписание лечения

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

#Данные:
(1,28)  (2,17)  (3,92)  (4,41)  (5,9)   (6,87)  (7,54) (8,3)   (9,78)  (10,67) (11,1)  (12,67) (13,78) (14,3) (15,55) (16,86) (17,8)  (18,42) (19,92) (20,17) (21,29) (22,94) (23,28) (24,18) (25,93) (26,40) (27,9)  (28,87) (29,53) (30,3)  (31,79) (32,66) (33,1)  (34,68) (35,77) (36,3)  (37,56) (38,86) (39,8)  (40,43) (41,92) (42,16) (43,30) (44,94) (45,27) (46,19) (47,93) (48,39) (49,10) (50,88) (51,53) (52,4)  (53,80) (54,65) (55,1)  (56,69) (57,77) (58,3)  (59,57) (60,86) ...

А теперь представьте, что вы лечите пациента и сегодня день 2. Какую дозировку вы предлагаете использовать?

Я искренне надеюсь, что вы ответили “17мг”, поскольку это не был вопрос с подвохом. А что насчёт дня 4? 41мг? Всё верно.

Теперь, как бы вы создали ПО для вывода верной дозировки для дней с 1 по 5? Попытались бы вы использовать МО? Иначе говоря, попытались бы вы найти в этих данных паттерны и попробовать преобразовать их в инструкцию (“модель”) для получения выходных данных из входных?

Нет, конечно, вы бы не стали. Вы бы запрограммировали ПО получать данные тем же путём, которым получаете их сами, т.е. из таблицы. Таким образом, вы бы получали правильный результат в 100% случаев для всех 60 дней. Для этого не потребовались бы паттерны и машинное обучение. 

Так в каких же ситуациях нам оно необходимо?

Как насчёт дня 61? Каким будет верный ответ?

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

При определённых условиях, да.

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

Нужно найти пригодный паттерн

Но если паттерн существует и если (большое если) мы смогли его найти, тогда мы бы могли применить его ко дню 61, чтобы попытаться получить прогноз/отгадку правильного ответа. Здесь машинное обучение уже может нам помочь.

Паттерн должен обобщать

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

Нестационарные вселенные

Необходимо усвоить следующее: если ваши данные оказываются неподходящим окном в завтрашний мир — вероятно, потому что пандемия изменила весь порядок вещей — тогда неважно насколько хороша эта ваша информация была вчера. Если вы живёте в нестабильном углу вселенной, то вам будет тяжело обосновывать то, что мы называем эргодичностью и предположениями стационарности. Грубо эти понятия можно перевести так: “Я верю, что правила не изменились.”

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

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

Возможно, вам повезёт

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

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

Когда использовать машинное обучение

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

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

Какова ваша миссия? Создать решение, которое успешно обобщает (или завершить проект). 

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

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

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

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

Подходит ли в вашей ситуации машинное обучение?

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

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

Так был ли там пригодный паттерн?

Вам ещё интересно узнать про день 61? В данном случае в представленных мной данных нужный паттерн присутствует. Мне это известно, потому что я его туда и заложила. Я могу даже пообещать, что он способен проводить обобщение вплоть до огромного числа, какое вы можете выдумать, плюс один, потому что в эти абсолютно “нестационарные” времена меня очень утешает работа с данными, легко поддающимися изменению.

#The data:
(1,28)  (2,17)  (3,92)  (4,41)  (5,9)   (6,87)  (7,54) (8,3)   (9,78)  (10,67) (11,1)  (12,67) (13,78) (14,3) (15,55) (16,86) (17,8)  (18,42) (19,92) (20,17) (21,29) (22,94) (23,28) (24,18) (25,93) (26,40) (27,9)  (28,87) (29,53) (30,3)  (31,79) (32,66) (33,1)  (34,68) (35,77) (36,3)  (37,56) (38,86) (39,8)  (40,43) (41,92) (42,16) (43,30) (44,94) (45,27) (46,19) (47,93) (48,39) (49,10) (50,88) (51,53) (52,4)  (53,80) (54,65) (55,1)  (56,69) (57,77) (58,3)  (59,57) (60,86) ...

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

Примечание

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

# Вот код, который я применила для генерации данных:
doseFun <- Vectorize(function(x) {r <- round(93 * cos(x) ^ 2 + sqrt(exp(x/100))); return(r)})

# Выходные данные для 61 дня:
print(doseFun(61))

# Построение функции:
plot(x = 1:60, y = doseFun(1:60))

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

Осторожно!

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

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

Те же, кто чертил график/производил обучение всего набора данных, на этот раз могли отделаться и так. Единственная причина, по которой вы не потерпели неудачу от этого выдуманного примера, заключается в том, что лежащий в его основе паттерн очень прост и его можно было легко извлечь из данных. На практике же такое случается редко, поскольку ваши коллеги в этой области наверняка уже давно посрывали все “низко висящие плоды”. Если вы попытаетесь разобраться с реальным примером данных из жизни таким же способом, то столкнётесь со сложностями.

Читайте также:

Читайте нас в Telegram, VK и Яндекс.Дзен


Перевод статьи Cassie Kozyrkov: When not to use machine learning or AI

Предыдущая статьяСоздаем краткое содержание текста с помощью Python без NLP
Следующая статьяPython 3.9