--- 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.