# ML и показатели проектов **Описание вводных** Признаки для задачи * Исполнитель (опционально) * Срок плановый (длительность), возможно по трем или более точкам, * Срок фактический, * Название * Комментарии (опционально) * Фаза (этап проекта) * Стоимость и другие ресурсы (опционально), плановые и фактические * длительность от старта проекта до появления задачи (если она была незапланирована) Признаки для проекта * Пути из задач (суммарная длительность пути) * Критический путь (длительность) * Текстовое описание * Комментарии (опционально) * Все ресурсы * Количество задач и ресурсов по времени на единицу времени (конфликты) * Граф задач проекта (опционально) Целевая величина * фактический срок проекта * фактические ресурсы проекта (стоимость) --- **Baseline** За baseline можно взять линейную регрессию с отбором признаков (таких как количество задач, разброс их сроков, среднее и другие статистики), примешав PolynomialFeatures при желании. ``` project_tasks = pd.DataFrame({ "duration": [...], "time_from_start": [...], "tasks" ... }) project_paths = ... # аналогичный датафрейм x_project = project_paths.describe().join( project_tasks.describe() ) # это признаки одного сэмпла ``` Ну и объединить в большой датасет по всем проектам. Имеет смысл попробовать с логарифмированным таргетом для сроков, частая история для проектов - затягивание окончания (да и мультипликативные модели бывают точнее). > Имеет смысл также и покластеризовать-посмотреть :) --- **Байесовские методы** Байесовские модели позволяют найти распределение на свои параметры. Очень полезно для аналитики. Идея здесь такая: 1. Берем фактический срок как таргет (аналогично baseline), 2. Берем опять же те же признаки, 3. Прогоняем через линейную модель в pymc3 (устойчивую к выбросам). [Пример](https://docs.pymc.io/notebooks/GLM-robust-with-outlier-detection.html) На найденных распределениях параметров навести аналитику. --- **Эмбеддинги** Так как все проекты разные по длине, то эмбеддинги от нейросеток обязаны быть попробованными. Я бы сразу бы пробовал conditional VAE, где condition это таргет. Вопрос, как скормить последовательности каналов (признаков) надо решать через рекуррентные слои, причем размер последовательности придется поискать через grid/random search (долгая история). Таргет тут - длительность куска проекта. Проект в целом надо будет склеивать. [Пример](https://www.tensorflow.org/tutorials/structured_data/time_series) --- **Графовые эмбеддинги** Графовые эмбеддинги бывают для нод, бывают для графов в целом. Главное - представить проект как граф `networkx`, а потом скормить его в `karateclub`. Получим эмбеддинги либо для задач, либо для проекта (в зависимости от метода). В этом методе не учитываются величины, только структура! Поэтому полученные эмбеддинги надо исследовать совместно с описательными статистиками. --- **Рекомендованный Jodie** Штука огонь. Но с регрессией непонятно, сработает или нет. Надо пробовать обязательно. Особый бонус,что формат входных данных хорошо ложится на задачи, если оставить исполнителя как user, а задачу как item, а все остальные фичи тоже скормить. ## Заключение Пробовать имеет смысл все. Каждый метод имеет свои и плюсы и минусы. В идеале, имело бы смысл конкатенировать признаки и с эмбеддингами текстовых описаний задач (после того же `sentence-transformers`). Векторизовывать правда придется много. Но сделать этоможно будет один раз. Удачи!