File size: 4,450 Bytes
31c5806
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
---
language:
- ru
- en
license: mit
library_name: transformers
pipeline_tag: text-classification
tags:
- text-classification
- bert
- tiny-bert
- rubert-tiny2
- binary-classification
- jobs
- developer-classification
base_model: cointegrated/rubert-tiny2
metrics:
- precision
- recall
- roc_auc
model-index:
- name: dev_roles_1
  results:
  - task:
      type: text-classification
      name: Developer vs Non-Developer Binary Classification
    metrics:
    - type: roc_auc
      value: 0.9964
    - type: precision
      value: 0.9683
    - type: recall
      value: 0.9721
---

# dev_roles_1 — Developer vs Non-Developer Classifier

Бинарный классификатор вакансий: отличает **разработчиков** (`dev`) от **не‑разработчиков** (`non_dev`).
Построен на базе [`cointegrated/rubert-tiny2`](https://huggingface.co/cointegrated/rubert-tiny2) — компактной BERT‑модели для русского/английского языка.

## Описание задачи

Модель предсказывает, относится ли вакансия к роли разработчика. Положительный класс (`dev`) определяется как:

> `role_category ∈ DEV_CLASSES AND team_lead == 0`

`DEV_CLASSES`:
- Backend
- Desktop / Systems
- Embedded
- Frontend
- Fullstack
- ML / AI / Data Scientist
- Mobile

Тимлиды и менеджеры в положительный класс **не входят**.

## Метки

| id | label    |
|----|----------|
| 0  | non_dev  |
| 1  | dev      |

## Метрики (валидация)

| Метрика                 | Значение |
|-------------------------|----------|
| ROC AUC                 | 0.9964   |
| Precision @ threshold   | 0.9683   |
| Recall @ threshold      | 0.9721   |
| Best threshold          | 0.6978   |
| Target recall           | 0.97     |

Лучшая эпоха: **5**. `pos_weight` при обучении: `3.87`.

## Параметры инференса

- `max_length`: **256** токенов
- Текст вакансии формируется как `title + description` (description обрезается до **1200 символов**)
- Решающий порог по вероятности класса `dev`: **0.6978**

## Использование

```python
import torch
from transformers import AutoTokenizer, AutoModelForSequenceClassification

MODEL_ID = "AndreiTolmachev/dev_roles_1"
THRESHOLD = 0.6978

tokenizer = AutoTokenizer.from_pretrained(MODEL_ID)
model = AutoModelForSequenceClassification.from_pretrained(MODEL_ID).eval()

def is_developer(title: str, description: str = "") -> bool:
    text = (title + " " + description[:1200]).strip()
    enc = tokenizer(text, truncation=True, max_length=256, return_tensors="pt")
    with torch.no_grad():
        logits = model(**enc).logits
    prob_dev = torch.softmax(logits, dim=-1)[0, 1].item()
    return prob_dev >= THRESHOLD

print(is_developer("Senior Python Backend Developer",
                   "Разработка микросервисов на FastAPI, PostgreSQL, Kafka..."))
```

## Архитектура

- Модель: `BertForSequenceClassification`
- Слоёв: 3, hidden size: 312, attention heads: 12
- Vocab size: 83 828
- Параметры: ~29M
- `max_position_embeddings`: 2048

## Обучение

- База: `cointegrated/rubert-tiny2`
- Датасет: внутренний датасет вакансий (`titles_descriptions_urls_14_05_classified.csv`), размечен LLM‑пайплайном
- Лосс: cross-entropy с `pos_weight ≈ 3.87` для баланса классов
- Подбор порога по target recall = 0.97

## Ограничения

- Обучен преимущественно на русскоязычных вакансиях IT‑домена; качество на других доменах/языках не гарантируется.
- Тимлид/менеджерские роли относятся к `non_dev` по дизайну — для классических задач "any developer incl. lead" модель не подходит.
- Описание вакансии используется в усечённом виде (1200 символов) — очень длинные требования могут быть обрезаны.

## Лицензия

MIT.