← документы задачи · mind map ТЗ · роудмап развития
Шпаргалка scikit-learn для задачи 04
Официальная схема выбора алгоритма scikit-learn, перерисованная интерактивно. Нажмите на алгоритм или решение: справа — используется ли он у нас и насколько перспективен для контроля качества денситометрии. Сейчас стенд работает на правилах без scikit-learn, поэтому оценки — про следующую версию с обучением.
на телефоне схему можно листать вбок
Нейросети для снимков (не scikit-learn)
U-Net или лёгкая CNN на PyTorch для сегментации позвонков, подвздошных костей, вертелов и ROI — закрывают Th12, ротацию и поля ROI. Нужна разметка контуров или точек хотя бы на сотне снимков; инференс локально в контейнере укладывается в требования ТЗ.
Что работает сейчас
Правила на numpy: профиль яркости вдоль оси, порог Отсу, скользящая медиана, центры позвонков и угол оси, яркость в углах кадра, поиск очень ярких объектов. Итог по позвоночнику F1 0,45 на обучающем наборе.
Рекомендуемый следующий шаг
Признаки, которые уже считает анализ, плюс HistGradientBoostingClassifier и LogisticRegression по типам нарушений с GroupKFold по исследованиям, class_weight и калибровкой вероятностей: даст ROC-AUC и честные ДИ; порог по F1 подбирать на валидации, а не на всех данных.
Все алгоритмы схемы
| Алгоритм | Область | Классы scikit-learn | У нас | Перспективность для задачи 04 |
|---|---|---|---|---|
| SVC · Ensemble Classifiers SVM с ядром и ансамбли |
классификация | SVC(kernel='rbf')RandomForestClassifierHistGradientBoostingClassifier |
Нет. | высокая
Лучший кандидат для версии с обучением: бустинг и лес работают на сотнях примеров, ловят нелинейность (охват зависит от угла и ширины кадра), дают вероятности для ROC-AUC и важность признаков для объяснения. Отдельная модель на каждый тип нарушения, class_weight, валидация GroupKFold по исследованиям, бутстреп ДИ. |
| KMeans k-средних |
кластеризация | KMeans |
Нет. Кость от мягких тканей отделяет порог Отсу по гистограмме. | средняя
Два применения: KMeans по яркости пикселей как замена порогу Отсу для кости, и группировка снимков по признакам — найти нетипичные кадры, другой аппарат или протокол для отказа «не DXA». |
| Linear SVC Линейный SVM |
классификация | LinearSVCLogisticRegression |
Нет. Сейчас класс выносят пороги на признаках: угол оси, яркость подвздошных углов, число ярких пикселей. | средняя
Хороший первый шаг на наших признаках снимка вместо ручных порогов: подбирает веса по экспертным меткам. LogisticRegression из той же ветки сразу даёт вероятность — это ROC-AUC из ТЗ. Нужны class_weight='balanced' (32 нарушения из 99) и разбиение по исследованиям. |
| Randomized PCA PCA (рандомизированный) |
снижение размерности | PCA(svd_solver='randomized') |
Нет. | средняя
PCA по уменьшенным снимкам 64×64 даёт карту набора и простой детектор аномалий: кадр далеко от облака DXA — кандидат в отказ «не денситометрия». Компоненты можно добавить в признаки классификатора. |
| SVR(kernel='rbf') · EnsembleRegressors SVR с ядром и ансамбли регрессоров |
регрессия | SVR(kernel='rbf')GradientBoostingRegressorRandomForestRegressor |
Нет. | средняя
Перспективно для координат ориентиров — верх Th12, малый вертел, края ROI бедра — по дескрипторам профилей, если организатор или команда разметят точки хотя бы на сотне снимков. Тогда закроются «охват сверху» и ротация бедра. |
| Spectral Clustering · GMM Спектральная кластеризация и GMM |
кластеризация | GaussianMixtureSpectralClustering |
Нет. | средняя
GaussianMixture на гистограмме яркости даёт мягкий порог кость/фон с вероятностью — устойчивее Отсу на тёмных кадрах и помогает оценке уверенности. Спектральная кластеризация здесь избыточна. |
| ElasticNet · Lasso ElasticNet и Lasso |
регрессия | LassoElasticNet |
Нет. | низкая
Регрессия как таковая нам почти не нужна; L1 полезна для отбора признаков перед классификатором — но то же даёт LogisticRegression(penalty='l1'). |
| Isomap · Spectral Embedding Isomap и спектральное вложение |
снижение размерности | IsomapSpectralEmbedding |
Нет. | низкая
Красивая картинка набора для презентации, но на 252 снимках выигрыша над PCA для решения не даст. |
| KNeighbors Classifier k ближайших соседей |
классификация | KNeighborsClassifier |
Нет. | низкая
На 99 исследованиях с дисбалансом голосование соседей неустойчиво и чувствительно к масштабу признаков. Плюс — объяснение «похоже на исследования N» для врача, но это можно получить и без классификатора. |
| LLE Локально-линейное вложение |
снижение размерности | LocallyLinearEmbedding |
Нет. | низкая
То же, что Isomap, и чувствительнее к шуму. |
| MeanShift · VBGMM MeanShift и вариационная GMM |
кластеризация | MeanShiftBayesianGaussianMixture |
Нет. | низкая
Можно сегментировать яркостные области без числа кластеров, но области снимка DXA известны заранее, а MeanShift медленный на пикселях. |
| Naive Bayes Наивный Байес |
классификация | GaussianNBMultinomialNB |
Нет. | низкая
Наши признаки сильно связаны (угол, положение оси, яркость краёв), предположение независимости ломается. Годится разве что как контрольный базис. |
| RidgeRegression · SVR(kernel='linear') Ridge и линейный SVR |
регрессия | RidgeSVR(kernel='linear') |
Нет. | низкая
Могла бы предсказывать, например, поправку положения Th12 по профилю яркости, но без разметки точек учить не на чем; геометрия нагляднее. |
| MiniBatch KMeans MiniBatch k-средних |
кластеризация | MiniBatchKMeans |
Нет. | не нужна
Для пикселей одного снимка и сотен снимков хватает обычного KMeans. |
| SGD Classifier Классификатор на SGD |
классификация | SGDClassifier |
Нет. | не нужна
Данных в тысячи раз меньше порога этой ветки; обычные LinearSVC и LogisticRegression решат то же точнее. |
| SGD Regressor Регрессор на SGD |
регрессия | SGDRegressor |
Нет. | не нужна
Не наш масштаб данных. |
| kernel approximation Аппроксимация ядра |
классификация | NystroemRBFSampler |
Нет. | не нужна
Нужна, когда SVC с ядром не помещается в память; на 252 снимках SVC считается напрямую. |
| kernel approximation Аппроксимация ядра |
снижение размерности | NystroemRBFSampler |
Нет. | не нужна
Не наш масштаб данных. |