# 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`).
Векторизовывать правда придется много. Но сделать этоможно будет один раз.
Удачи!