---
# System prepended metadata

title: ML и показатели проектов

---

# 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`).

Векторизовывать правда придется много. Но сделать этоможно будет один раз.

Удачи!