Разработчик Тайлер ЛУНд – счастливый отец двух 4-месячных сыновей-близнецов. Но как и многие родители грудных младенцев, Тайлер мечтает наконец выспаться. Чтобы вычислить, как увеличить продолжительность сна у детей, Тайлер задействовал алгоритмы машинного обучения и рассказал о своем опыте в блоге.
Около месяца тому я попробовал провести A/B-тестирование, чтобы проверить, как различные приемы или же вводные параметры могут влиять на сон наших близнецов-сыновей и опосредованно – на наш сон. Таким образом я выяснил, что паттерны сна были довольно беспорядочными и не нашел ничего, что бы сильно коррелировало с увеличением длительности сна. Затем дети естественным путем сами стали спать больше.
Сейчас, когда им четыре месяца, они вошли в довольно распространенную, но редко обсуждаемую фазу уменьшения длины сна. Я опять понял, что отчаянно не высыпаюсь. Так что я попробовал еще одну компьютерную технику, чтобы вычислить паттерн – машинное обучение.
Машинное обучение – это дисциплина компьютерных наук, которая разрабатывает методы “обучения” компьютеров или программ без того, чтобы предоставлять им конкретные инструкции. В обычном программировании я бы задал компьютеру последовательность команд для исполнения, опираясь на логику принятия решений о вычислениях исходя из вводных данных, но программа никогда бы не смогла сойти с этих четко определенных рельс.
И хотя такое описание по звучанию больше напоминает мотивы из “Терминатора”, чем правду, машинное обучение позволяет взять множество “обучающих” данных и использовать их как базу для прогнозирования. Оно наращивает популярность в технологической отрасли, но в большинстве случаев его используют для предсказаний покупательского поведения и рекомендаций, искусственного интеллекта, и самое интересное – для категоризации и распознавания картинок и картин – в частности, это делал Google.
Мне не доводилось видеть, чтобы его использовали в помощь родителям.
Благодаря бухгалтерскому образованию моей жены и нашим личностям типа А мы детально документируем все нюансы приема пищи и сна у детей. Помните эту таблицу?
Используя эти данные, я вознамерился отыскать оптимальную комбинацию вводных параметров. В этом случае я анализировал пищу за день, время последнего кормления, количество еды, съеденной в последнее кормление, чтобы определить, что именно приводит к более длительному сну наших мальчиков.
И самое прекрасное – всю сложную работу за меня выполнил компьютер. Плюс у нас было вдвое больше данных по этим паттернам, поскольку детей-то тоже двое.
Существует несколько шикарных библиотек по машинному обучению, доступных на различных языках программирования. И хотя я в основном использую в работе Java и Javascript, я выбрал sklearn – библиотеку на Python. Я знаком с этим языком, его гибкость казалась идеальным инструментом для решения данной задачи. По этой библиотеке есть множество мануалов и хорошей документации.
Мой код по этой задаче вы можете посмотреть на GitHub.
Экспортируя данные, которые мы собирали в таблицу выше, я извлек точки данных только за последний месяц. Из-за быстрого роста и развития младенцев я решил, что именно такого объема данных хватит для прогнозирования, при этом они будут сбалансированы с точки зрения свежести и количества.
Собираю данные, пишу программу
Я также принял во внимание некоторую интересную статистику. К примеру, в среднем мы давали мальчикам 27,5 унций (примерно 780 г) еды в день, чаще всего укладывали их в 7:25, перед сном они получали 5,22 унций (около 148 г) еды, спали в среднем по 9 часов. Также оказалось, что дети спали в среднем более 10 часов в 75% случаев. Неплохо, совсем неплохо. Но я знал, что немного исследований – и мы сможем улучшить результат.
Используя эти данные, я отметил каждый параметр в сравнение со временем сна.
Можно видеть, что здесь нет очевидной корреляции, по крайней мере – линейной. Ближайшее к этому соотношение – зависимость между общим объемом еды и часами сна. Как ни странно, потребление большего объема еды приводит к сокращению сна.
Существует множество различных алгоритмов машинного обучения. Их в основном разделяют на линейные и нелинейные типы. Я скормил данные шести самым распространенным алгоритмам, чтобы проверить, насколько точным окажется каждый из них. Вот результаты.
Вот те же результаты, но в более графической форме:
Как видно, лучше всего справился метод опорных векторов (Support Vector Machine, SVM), хотя, конечно, разброс очень широк, а точность не достигает 50%, что достаточно плохо для прогнозирования. Это полностью объясняется псевдослучайной природой данных. Даже с подобными результатами я решил пытаться дальше, надеясь получить хоть какую-то идею.
Используя SVM, я обучил алгоритм на входящих данных. Сейчас с его использованием я мог предсказывать, сколько будут спать младенцы, основываясь на объеме потребленной еды за день, перед сном и времени отхода ко сну. К примеру, если давать им в день 28 унций (794 г), укладывать спать в 19:00 и при последнем приеме пищи давать им по 6 унций (170 г), это приведет к 8-часовому сну.
Выводы
С обученным алгоритмом я мог более точно предсказывать, сколько времени будут спать младенцы. Что еще важнее, я мог наблюдать за кривыми трендов по этим показателям и понимать, какой тип поведения приведет к увеличению периода сна. Как ни странно, если мальчики засыпали раньше, и кушали меньше, это вело к более длительному сну. Это может объясняться множеством факторов, моя теория – в том, что меньше еды приводит к меньшему содержанию газа в кишечнике, меньшему сокращению желудка в голодном состоянии, а значит – к более спокойному сну. Вспомните, сколько раз вы объедались на ночь, а затем просыпались посреди ночи и желудок сводило от голода?
К сожалению, как и в случае с A/B-тестами, оказалось, что ни один из отдельных параметров не оказывает прямое сильное влияние на сон. Предполагаю, что в таком случае кто-то уже открыл бы его и заработал миллионы.
Метод машинного обучения может помочь найти некоторые из подобных трендов и зависимости между переменными, что приводит к более точным результатам, чем A/B-тесты или метод проб и ошибок. Но результаты все еще далеки от идеальных. Максимум, который я смог выжать из этих данных – 41% точность прогнозов. Иными словами, они ошибаются чаще, чем не ошибаются. Возможно, помог бы больший объем данных, но мы пока не планируем заводить тройню.
Все же, эти результаты лучше, чем ничего, и демонстрируют потенциал машинного обучения и data science. Я, к примеру, предпочитаю принимать решения, исходя из данных, а не интуиции. И если эти данные подтверждают мои догадки, я меньше переживаю о нашем подходе к родительству.