Введение

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

Инструменты и библиотеки

Я использовал несколько библиотек Python, таких как pandas для обработки данных, запросы для запросов API, scikit-learn для классификатора случайного леса и matplotlib для визуализации. Данные были собраны из RescueTime API.

Сбор данных

Первым шагом был сбор данных. Я собрал данные о производительности за 2020, 2021 и 2022 годы из RescueTime, службы, которая помогает отслеживать использование компьютера и классифицировать его по различным уровням производительности. За 2023 год мне не удалось получить никаких достоверных данных по отслеживанию времени.

Я использовал библиотеку requests, чтобы получить почасовую информацию об использовании любого приложения, которое я использовал на своем ноутбуке, и сохранил данные в CSV-файлах. Это дало мне в общей сложности 150 678 записей, которые я мог проанализировать. Ознакомьтесь с кодом, чтобы узнать больше о том, как я это сделал.

Предварительная обработка данных

После сбора данных следующим шагом была их очистка и подготовка к модели машинного обучения.

Я удалил ненужные столбцы из данных, такие как «Количество людей» и «Активность».

Столбец «Производительность» — это то, что мне нужно, чтобы модель предсказывала. Я хотел, чтобы он выводил 1, если он считает, что я буду продуктивным в течение часа, который я ему предоставляю, -1, если он считает, что я не буду продуктивным, или 0, если он ни (т.е. я сплю). Моя «производительность» рассчитывается путем умножения «Затраченного времени (в секундах)» и «Производительности» и получения суммы этих значений за данный час. Например, если в 8:00 определенного дня я потратил 300 секунд на выполнение задачи с продуктивностью 1 и 400 секунд на задачу с оценкой продуктивности -1, то моя оценка продуктивности будет 1*300 + (-1)*400 = -100. Затем я округляю этот результат до значения -1, что означает, что это непродуктивный час.

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

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

Создание модели

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

Данные были разделены на обучающий набор (70%) и тестовый набор (30%). Затем модель обучалась на тренировочном наборе.

Оценка модели и прогнозы

После того, как модель была обучена, я использовал ее, чтобы делать прогнозы на тестовом наборе и сравнивал эти прогнозы с фактическими значениями. Точность модели составила 70 %, что довольно неплохо, учитывая, как мало признаков я смог извлечь из данных.

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

График показывает, что модель может правильно определить некоторые основные тенденции в моей производительности, такие как время простоя в нерабочее время между 12 и 8 часами утра и снижение общей производительности по вечерам. Однако дискретный характер выходных данных модели снижает объем информации, которую она предоставляет — едва продуктивный час рассматривается так же, как очень продуктивный час.

Как работает классификатор

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

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

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

Улучшения

Альтернативные модели.Моя текущая модель – это RandomForest, и это хороший выбор, но мне любопытно посмотреть, как другие модели могут работать с такими данными временных рядов. Такая модель, как ARIMA (авторегрессивная интегрированная скользящая средняя), которая была построена специально для этого типа данных, могла бы изменить правила игры для моих прогнозов производительности.

Глубокое обучение. Я много читал о моделях глубокого обучения, особенно о LSTM (долгосрочная кратковременная память) и GRU (закрытые рекуррентные единицы), и о том, как они могут быть невероятно эффективными с данными временных рядов. Возможно, пришло время погрузиться и изучить эти модели для себя.

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

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

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

Выводы

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

Код можно найти здесь: Github. Предоставляются инструкции, чтобы вы могли самостоятельно запускать Jupyter Notebooks и прогнозировать свою производительность :)