Разработать решение для кластеризации названий компаний по идентичности обозначаемой компании. Данные:
conda create -n compclust python=3.7
conda activate compclust
pip3 install -r requirements.txt
Минимально рекомендуемое оборудование для single-thread инференса:
1 vCPU, 4 Gb RAM
Скорость инференса на single-thread Ryzen 5600h:
~90 строк в секунду
Для повышения производительности инференса на больших объемах данных рекомендуется использовать многоядерный процессор и установить параметр n_estimators для RandomForest в соотвествии с числом потоков, для инференса нескольких деревьев в параллели.
Решение можно масштабировать: обернуть демо-скрипт в воркер celery+redis+fastapi, затем создать оркестр воркеров с помощью, например, kubernetes
Наша основная метрика это f1-score.
Она отражает две метрики: recall и precision. В отличие от accuracy позволяет отразить наиболее
приближенно к реальности результаты при дисбалансе классов, который у нас есть.
Accuracy стабильно высока из-за перевеса класса '1' в соотношении более, чем 99 к 1.
В результате эксперимнтов выбрана модель RandomForestClassifier как модель с лучшей метрикой f1-score
Лог экспериментов представлен ниже
- Векторизация текстовых данных с помощью tf-idf
- Train test split 80 / 20
Обучение классификатора дерево принятия решений DecisionTree
Обучение классификатора случайный лес RandomForest
Обучение классификатора логистическая регрессия LogisticRegression
- Векторизация текстовых данных с помощью tf-idf
- Train test split: train - is_duplicate == 0, test - is_duplicate == 1
- Оптимизация гиперпараметров - поиск по сетке (GridSearch)
Обучение кластеризатора MiniBatchKMeans
accuracy 0.563
Обучение кластеризатора MiniBatchKMeans и оптимизация гиперпараметров
accuracy 0.745
Подобранные параметры:
{'init': 'k-means++', 'max_iter': 200, 'n_clusters': 5}
Language-agnostic BERT Sentence Embedding (LaBSE)
- С помощью LaBSE извлекаем вектора признаков (эмбеддинги) предложений с помощью модели LaBSE
- Извлекаем меры схожести пар векторов (пар названий компаний) - евклидово и косинусное расстояния
- Train test split 80/20
- Оптимизация гиперпараметров - Hyperopt
Обучение классификатора случайный лес RandomForest
Обучение классификатора логистическая регрессия LogisticRegression
Обучение и оптимизация гиперпараметров классификатора случайный лес
Upsamling данных, обучение RandomForest
Upsamling данных, обучение LogisticRegression
Upsampling данных, обучение и оптимизация гиперпараметров RandomForest
Обучение классификатора случайный лес RandomForest
Обучение классификатора логистическая регрессия LogisticRegression
Обучение и оптимизация гиперпараметров классификатора случайный лес