{"id":28200011,"url":"https://github.com/exp98/diploma_holland","last_synced_at":"2026-04-30T13:33:02.859Z","repository":{"id":292765116,"uuid":"876434101","full_name":"ExP98/Diploma_Holland","owner":"ExP98","description":"Predicting the Holland RIASEC Code for a master's thesis (diploma)","archived":false,"fork":false,"pushed_at":"2025-05-29T21:01:27.000Z","size":5168,"stargazers_count":1,"open_issues_count":0,"forks_count":0,"subscribers_count":1,"default_branch":"master","last_synced_at":"2025-05-29T22:18:36.679Z","etag":null,"topics":["holland-test","ml","r","riasec"],"latest_commit_sha":null,"homepage":"","language":"R","has_issues":false,"has_wiki":null,"has_pages":null,"mirror_url":null,"source_name":null,"license":"apache-2.0","status":null,"scm":"git","pull_requests_enabled":true,"icon_url":"https://github.com/ExP98.png","metadata":{"files":{"readme":"README.md","changelog":null,"contributing":null,"funding":null,"license":"LICENSE","code_of_conduct":null,"threat_model":null,"audit":null,"citation":null,"codeowners":null,"security":null,"support":null,"governance":null,"roadmap":null,"authors":null,"dei":null,"publiccode":null,"codemeta":null,"zenodo":null}},"created_at":"2024-10-22T00:49:43.000Z","updated_at":"2025-05-29T21:01:30.000Z","dependencies_parsed_at":null,"dependency_job_id":"9bdbb8b5-566f-40c0-801a-288dfdd4328b","html_url":"https://github.com/ExP98/Diploma_Holland","commit_stats":null,"previous_names":["exp98/diploma_holland"],"tags_count":0,"template":false,"template_full_name":null,"repository_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExP98%2FDiploma_Holland","tags_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExP98%2FDiploma_Holland/tags","releases_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExP98%2FDiploma_Holland/releases","manifests_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExP98%2FDiploma_Holland/manifests","owner_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners/ExP98","download_url":"https://codeload.github.com/ExP98/Diploma_Holland/tar.gz/refs/heads/master","sbom_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories/ExP98%2FDiploma_Holland/sbom","host":{"name":"GitHub","url":"https://github.com","kind":"github","repositories_count":259162729,"owners_count":22815002,"icon_url":"https://github.com/github.png","version":null,"created_at":"2022-05-30T11:31:42.601Z","updated_at":"2022-07-04T15:15:14.044Z","host_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub","repositories_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repositories","repository_names_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/repository_names","owners_url":"https://repos.ecosyste.ms/api/v1/hosts/GitHub/owners"}},"keywords":["holland-test","ml","r","riasec"],"created_at":"2025-05-16T20:10:16.683Z","updated_at":"2026-04-30T13:33:02.853Z","avatar_url":"https://github.com/ExP98.png","language":"R","funding_links":[],"categories":[],"sub_categories":[],"readme":"[![License: Apache 2.0](https://img.shields.io/badge/license-Apache--2.0-blue.svg)](https://opensource.org/licenses/Apache-2.0)\n![Under Review](https://img.shields.io/badge/status-under_review-orange)\n![Main language: R](https://img.shields.io/badge/main_language-R-276DC3?logo=r)\n![Also uses: Python](https://img.shields.io/badge/also%20uses-Python-3776AB?logo=python)\n![Research](https://img.shields.io/badge/type-academic%20research-blueviolet)\n![Commits](https://img.shields.io/github/commit-activity/y/ExP98/Diploma_Holland)\n[![](https://img.shields.io/badge/Shiny-shinyapps.io-blue?style=flat\u0026labelColor=black\u0026logo=RStudio\u0026logoColor=blue)](https://exp98.shinyapps.io/diploma_holland/)\n\n# Предсказание кода Голланда (RIASEC) по результатам психометрических тестов на основе ML\n\n## Краткое описание\n\nВыполнено в рамках магистерской ВКР по теме **\"Определение кода Голланда по результатам психометрических тестов личности на основе методов машинного обучения в условиях неполноты информации\"**.  \n\nПроект посвящён анализу данных психометрических тестов и построению моделей машинного обучения для предсказания индивидуальных характеристик пользователей. Разработано Shiny-приложение для интерактивного взаимодействия с результатами.\n\nВыполнил **Глушков Егор Александрович**, группа 23.М04-мм, программа \"Математическое обеспечение и администрирование информационных систем\"\n\n## Описание структуры проекта\n\n- `0. Data/` — исходные данные\n- `1. R/` — скрипты на R -- основные расчетные модули и эксперименты\n- `2. Python/` — модели на Python: нейросетевые модели, ранжирование\n- `3. Shiny_app/`, app.R — код и вспомогательные файлы интерактивного веб-приложения\n- `4. Output/` — графики и результаты\n- `5. Sources_TeX_n_Docs/` — исходники-материалы текста и презентации, готовые файлы и документы\n- `rsconnect/` — конфигурация публикации приложения\n\n## Как запустить проект\n\n1. Положите данные в папку `0. Data`\n2. Откройте среду разработки для R (RStudio, VS Code), установите R (4.4.2) и необходимые пакеты\n3. Запустите `00. Source_all.R`\n4. Для проверки регрессионных моделей проведите тесты из файла `06. Regression_models.Rmd`\n5. Для проверки классификационных моделей проведите тесты из файла `07. Classification_models.Rmd`\n6. Для проверки моделей ранжирования и регрессионных моделей на основе нейронных сетей:\n  - Установите Python 3.12.3, PyTorch 12.8\n  - регрессия: `01.multitarget_regression.qmd`\n  - ранжирование: `02.learn_to_rank.qmd`\n7. Для проверки моделей и подходов, не вошедших в итоговый анализ:\n  - `09. Non_standard_models.Rmd`\n  - `03.classification_to_cluster_relations.qmd`\n8. Для запуска приложения app.R: ```r shiny::runApp()```\n\n## Дисклеймер\n\nДанные для настоящего научного исследования были предоставлены сторонней организацией, обладающей заинтересованностью в его результатах, и являются её собственностью. В рамках достигнутых соглашений о неразглашении конфиденциальной информации исходные материалы были оставлены в закрытом доступе.\n\nВ случае заинтересованности во внесении вклада в исследования или ознакомлении с используемыми данными просьба направить соответствующий запрос автору работы. Автор, в свою очередь, организует взаимодействие со сторонней организацией — владельцем данных.\n\n## Обратная связь\n\nАвтор открыт к предложениям, идеям и сотрудничеству по теме научной работы: egorglushkov2014 [at] yandex [dot] ru\n\n# Краткая техническая записка\n\n## Цель и суть задачи\n\nЦель работы — автоматизация процесса профориентации с помощью методов машинного обучения.  \nЗадача состояла в том, чтобы предсказать **код Голланда (RIASEC)** по неполным результатам других психометрических тестов.  \nПрофиль личности рассматривался как **вектор из шести числовых оценок**, каждая из которых отражает выраженность соответствующего типа личности, либо как **упорядоченный набор из шести меток**, отсортированных по степени выраженности.  \n\nТест Голланда широко используется в профориентации, но чувствителен к социально-культурным факторам и не всегда стабилен. В работе предлагается определять код Голланда по данным других, более надёжных тестов — Леонгарда, Айзенка, Кеттелла, Шварца и «Большой пятёрки».  \n\nВ исследовании использовались анонимизированные данные **1278 пользователей** мини-приложения **«Психологические тесты» ВКонтакте**, разработанного лабораторией прикладного искусственного интеллекта СПб ФИЦ РАН.  \nРезультаты работы применяются в этой лаборатории: найденный лучший пайплайн и обученная модель используются при анализе новых данных пользователей.\n\n---\n\n## Метрики качества\n\nДля оценки точности и сопоставления разных типов алгоритмов применялись специализированные метрики:  \n\n- **C-индекс** — профильная метрика предметной области, мера **сходства профессиональных профилей**, применявшаяся как основная при сравнении всех моделей и подходов.  \n- **Регрессия** — среднеквадратичная ошибка (**RMSE**) по шести выходным переменным\n- **Классификация** — показатели **Hits≥K@3** ($K = 1..3$), отражающие долю случаев, когда истинный код присутствует в числе первых 1–3 предсказаний\n- **Ранжирование** — метрика **NDCG@3 (Normalized Discounted Cumulative Gain)**, оценивающая качество порядка первых трёх элементов предсказанного списка\n\nВсе модели и ансамбли сравнивались именно по значению C-индекса, как универсальной метрике качества в данной предметной области, также позволяющей сравнивать между собой и различные подходы.\n\n---\n\n## Подходы к постановке задачи\n\n### Многоцелевая регрессия\n\nРассматривались три способа решения задачи прогнозирования шести факторов RIASEC:\n\n- **Multioutput** — обучение шести независимых моделей, каждая из которых предсказывает один из факторов\n- **Regressor chain** — последовательность моделей, где выходы предыдущих используются как признаки для следующих, что позволяет учитывать зависимости между факторами  \n- **Модели со встроенной поддержкой мульти-выхода** — CatBoost, LightGBM, Random Forest и ExtraTrees, которые способны предсказывать несколько выходов одновременно\n\n---\n\n### Классификация\n\nБыли реализованы три постановки задачи:\n\n- **Multiclass** — классификация на шесть классов, каждому объекту соответствует один основной тип; итоговая тройка формируется по трём наибольшим вероятностям\n- **Multilabel** — шесть независимых бинарных классификаторов, определяющих, входит ли код в «топ-3»; финальная тройка кодов выбирается по наибольшим вероятностям принадлежности\n- **Label powerset** — классификация на множество комбинаций трёх кодов Голланда, при этом внутри тройки порядок не учитывается. Модель фактически предсказывает тройку кодов, совпадающую с набором наиболее выраженных типов\n\n---\n\n### Списочное ранжирование\n\nВ рамках подхода ранжирования задача формулировалась как предсказание **полного упорядоченного списка шести кодов Голланда**.  \nИспользовались три архитектуры моделей:\n\n- **Многослойный перцептрон (MLP)**\n- **Deep \u0026 Cross Network**\n- **Трансформер**\n\nДля обучения применялись функции потерь:\n\n- **ApproxNDCG** — приближённая оптимизация метрики NDCG\n- **LambdaRank** — градиентная оптимизация парных сравнений\n- **ListNet@1** и **ListNet@3** — вероятностные функции потерь, минимизирующие различие между распределениями ранговых позиций \n\nМетрика качества — **NDCG@3**, отражающая точность порядка трёх наиболее выраженных типов личности.\n\n---\n\n## Восстановление неполных данных\n\nВ работе реализованы и сравнены четыре подхода:\n\n- **MICE (Multivariate Imputation by Chained Equations)**  \n  • Плюсы: учитывает взаимозависимости признаков, выполняет итеративную множественную импутацию\n  • Минусы: вычислительно сложен, возможны проблемы со сходимостью при высокой корреляции признаков\n\n- **Soft Impute**  \n  • Плюсы: основан на регуляризованном сингулярном разложении (SVD), устойчив и хорошо масштабируется \n  • Минусы: описывает преимущественно линейные зависимости\n\n- **Маски пропусков**  \n  • Плюсы: простота реализации, не создаёт синтетических значений\n  • Минусы: модель должна самостоятельно учитывать наличие или отсутствие значения как информативный признак\n\n- **Ансамбли по комбинациям тестов**  \n  • Плюсы: адаптируется к конкретным комбинациям заполненных тестов\n  • Минусы: требует большого числа моделей и усложняет сопровождение\n\nНаилучший результат показал метод **Soft Impute** в сочетании с ансамблем регрессоров, где веса подбирались методом роя частиц.\n\n---\n\n## Взвешенное ансамблирование (блендинг)\n\nДля объединения результатов базовых моделей использовалось **взвешенное ансамблирование (blending)** — линейная комбинация предсказаний с оптимизацией весов по целевой метрике.  \nРассматривались шесть способов подбора весов:\n\n- **Равные веса** — базовый способ без оптимизации\n- **Вектор Шэпли** — стохастическая аппроксимация вклада каждой модели на основе оценок важности\n- **Grid search** — перебор весов по равномерной сетке с шагом 0.05–0.1 и выбор комбинации, максимизирующей метрику\n- **Квадратичная оптимизация (Quadratic programming)** — минимизация квадратичной ошибки ансамбля при ограничении суммы весов\n- **Генетический алгоритм (Genetic algorithm)** — эволюционная оптимизация: случайная инициализация, операции скрещивания и мутации, отбор лучших комбинаций по метрике\n- **Метод роя частиц (Particle swarm optimization, PSO)** — оптимизация в пространстве весов с использованием популяции частиц, каждая из которых обновляет положение под действием собственной инерции и притяжения к лучшим решениям. Такой подход обеспечивает эффективный поиск глобального оптимума и устойчивость ансамбля к переобучению\n\nМетод роя частиц показал наилучшие результаты по C-индексу и устойчивости ансамблей.\n\n---\n\n## Объём и глубина исследования\n\nРазработан вычислительный конвейер, включающий все этапы — от восстановления пропусков и снижения размерности до обучения моделей и построения ансамблей.  \nКомбинация параметров всех модулей (способ восстановления данных, применение PCA, тип постановки задачи, вариант подхода, набор базовых моделей, их гиперпараметры и метод ансамблирования) образует **до 63 000 возможных конфигураций**.  \n\nПредложен способ автоматизированного перебора конфигураций, позволяющий протестировать большое число вариантов без полного перебора всех комбинаций.  \nПодбор гиперпараметров для каждой модели осуществлялся с помощью **Grid search** по заданным диапазонам параметров и выполнялся в составе единого вычислительного эксперимента.\n\n---\n\n## Результаты вычислительного эксперимента\n\n| Категория задачи | Лучшая модель | Метрика (C-индекс) |\n|------------------|----------------|--------------------|\n| Регрессия (multioutput) | Lasso (L1) | 11.175 |\n| Классификация (multilabel) | kNN | 10.838 |\n| Ранжирование | MLP с функцией потерь ListNet@3 | 10.788 |\n| Ансамбль регрессоров (multioutput, PSO) | Lasso + Stepwise + CatBoost + ExtraTrees | **11.663** |\n| Ансамбль классификаторов (multilabel, PSO) | kNN + SVM + Logistic L1 + XGBoost + LightGBM | **11.625** |\n| Восстановленные данные (Soft Impute + PSO) | Ансамбль регрессоров | 10.740 |\n\n**Выводы:**\n- Ансамблевые методы обеспечивают устойчивое повышение точности по сравнению с одиночными моделями\n- Классические ML-модели (Lasso, ExtraTrees, LightGBM) показали более высокие результаты, чем нейросетевые, что связано с ограниченным объёмом данных\n- Использование Soft Impute и методов оптимизации весов (PSO) позволило добиться лучших показателей при работе с неполными данными\n- Итоговые значения C-индекса 11.6–11.7 превосходят результаты аналогичных исследований (≈ 11.0)\n\n---\n\n## Технологический стек\n\n- **R 4.4.2** — основной язык реализации вычислительного конвейера (предобработка, восстановление данных, обучение, ансамблирование, эксперименты)\n- **Python 3.12.3** — реализация нейросетевых и ранжирующих моделей\n- **Shiny** — веб-интерфейс прототипа инструмента профориентации\n- Использовались специализированные библиотеки для статистического анализа, машинного обучения и визуализации данных\n\n---\n\n## Прототип и внедрение\n\nСоздан прототип инструмента профориентации на платформе **R Shiny**.  \nПользователь вводит частичные результаты тестов, система выполняет их валидацию, восстанавливает пропуски методом Soft Impute, применяет обученный ансамбль моделей и отображает предсказанный код Голланда с пояснением.  \nПриложение развернуто в открытом доступе и используется в рамках лабораторных исследований СПб ФИЦ РАН.\n\n---\n\n## Итоговые результаты\n\n- Реализованы четыре метода восстановления данных, три подхода к постановке задачи и шесть алгоритмов ансамблирования\n- Проведён вычислительный эксперимент с автоматизированным перебором до 63 000 конфигураций моделей\n- Лучшая модель — **взвешенный ансамбль регрессоров с оптимизацией весов методом роя частиц (PSO)** — достигла **C-индекса = 11.663**\n- Разработан программный прототип и проведена оценка качества на неполных данных (C-индекс = 10.74)\n- Результаты внедрены в научно-исследовательские работы СПб ФИЦ РАН и представлены на конференции SCM 2025\n","project_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexp98%2Fdiploma_holland","html_url":"https://awesome.ecosyste.ms/projects/github.com%2Fexp98%2Fdiploma_holland","lists_url":"https://awesome.ecosyste.ms/api/v1/projects/github.com%2Fexp98%2Fdiploma_holland/lists"}