видимо мозг, возможно нейронка, очевидно не оригинальное изображение
видимо мозг, возможно нейронка, очевидно не оригинальное изображение

Привет, Хабр! Небольшая заметка про скромный первый опыт на Kaggle и извлеченные уроки. Без технических подробностей. Скорее про мотивацию и организацию процесса. Матерым DS будет скучно. Но если только планируете заглянуть на соревнование, то в самый раз. Спасибо ????


AMP®-Parkinson's Disease Progression Prediction

Использование данных о протеинах и пептидах у пациентов с болезнью Паркинсона для прогнозирования прогрессирования заболевания.

Команда:  2 человека
Опыт на Kaggle: отсутсвует
Создано рабочих блокнотов: 242
Создано моделей: 53
Отправлено сабмишенов: 91
Результат по баллам: TOP 6.94%
Результат по PB: TOP 15% (262 место)
Скор команды победителя по метрике соревнования (SMAPE): 60.042
Средний скор в PB: 72.278
Скор нашей команды: 69.759
До бронзы не хватило: 0.008% 
До серебра не хватило: 0.0105%
До золота не хватило: 4.39%

Кто мы? 

2 человека, без опыта участия в соревнованиях на Kaggle. 

Что использовали?

TensorFLow,CatBoost, LightGBM, XGBoost, UMAP, T-SNE, Gaussian Process Regressor, Orthogonal Matching Pursuit, Huber, Denoising Autoencoder, Tabular DAE, PyCaret, ElasticNet

Особенности соревнования

Цель этого конкурса - предсказать показатели MDS-UPDRS, которые измеряют прогрессирование симптомов у пациентов с болезнью Паркинсона. Единая шкала оценки болезни Паркинсона (MDS-UPDRS) представляет собой комплексную оценку как двигательных, так и немоторных симптомов. Модели предлагалось обучать на основе данных об уровнях белка и пептидов с течением времени у пациентов с болезнью Паркинсона по сравнению с контрольными испытуемыми нормального возраста.

Чем дальше мы двигались в своих исследованиях, тем сильнее росло ощущение, что цель соревнования построить эффективную модель предсказывающую состояние пациента через протеины и пептиды не будет достигнута. И дело скорее не в отсутствии связи протеинов и болезни Паркинсона, а в самих данных и дизайне соревнования. Во-первых, в данных отсутствовал альфа-синуклеиен, с которым в последние годы связаны большинство перспективных исследований. Во-вторых, в совсем небольшой выборке и так страдающей от проклятия размерности, была представлена контрольная группа здоровых пациентов. В третьих, организаторы соревнования не поставили в условие обязательное использование протеинов и пептидов в решениях участников. Все три фактора были на грани фола. Уверен, у организаторов были убедительные причины предоставить сообществу именно такой датасет. Искренне надеюсь, что исследователи получили ответы на свои вопросы в решениях сообщества и эти ответы сделали человечество еще на шаг ближе к пониманию болезни Паркинсона и поиску эффективных подходов к его профилактике и лечению. 

20 уроков 

1. Эффективные решения могут быть простыми. 

2. Бесценно научиться исключать избыточные данные и найти ответы в своих бейзлайнах и публичных решениях.

3. Соревновательный DS займет все твое свободное время. 

4. Будьте готовы к тому, что дерево гипотез и вариантов будет расти бесконечно. Код будет сниться. С мыслью о соревновании будешь засыпать и просыпаться. 

5, Очень скоро потребуется система учета результатов экспериментов и лог изменений.

6. Скорее всего будет потрачено очень много времени на идеи, которые не дадут результата. Но это будет бесценным опытом.

7. Изучи метрику соревнования. Сначала вдоль, затем поперек.

8. Поищи похожие соревнования в прошлом. Изучи победные техники.

9. Не полагайся на чужие EDA и автоматические пакеты для анализа данных. 

10. Задай все и даже самые дикие вопросы о данных и о теме соревнования. Найди свои ответы на них. Дергай экспертов в области, читай arxiv.org и тематические публикации. 

11. Расскажи о своей задаче и подходах людям далеким от DS. В простых вопросах и объяснениях часто можно встретить ценные идеи. 

12. Заведите базу знаний. Общего чата команды может не хватить. 

13. Лидерборд может не отражать реального положения дел. 

14. Если соревнование содержит API для отправки сабмишенов, то будь готов к битве в слепую. Доводка готового решения до принятого сабмишена через API может занять больше времени чем ты думаешь. В нашем случае половина времени ушло на поиск незадокументированных багов.

15. Не сдавайся. Демотивация будет. Просто не сдавайся и иди до конца. 

16. Доверяй локальному скору. Следи за публичным скором и сообщениями на форуме от  лидеров рейтинга.

17. Команда это классно. Разделить свои страдания, находки и радость с тиммейтами - бесценно.

18. Возможно, не все в окружении оценят уровень вовлеченности в соревнование. Вам действительно потребуется много времени и внимания.

19. Соревнование - это сперва про учебу и опыт, потом про победы над самим собой и лишь потом про победы над другими. Ни одна работа, курс или пет-проект не дадут тебе столько опыта и набора техник за такой короткий промежуток времени, сколько ты получишь соревнуясь на Kaggle. 

20. Соревнование закончится лишь тогда, когда поймешь решения победителей.

Комментарии (2)


  1. folal
    24.05.2023 03:53

    Полезные уроки, конечно, но есть вопрос по уроку №7 - что именно изучать в метриках и как воспользоваться результатами изучения?


    1. koch Автор
      24.05.2023 03:53

      Как пример, что сделала победившая команда (Дмитрий Гордеев и Константин Яковлев) с метрикой SMAPE+1 в соревновании по Паркинсону. Оригинал сообщения на англ тут

      SMAPE1P:

      MAPE / SMAPE / SMAPE1P очень хитрая метрика для GBT:

      • Требуется кастом лосс или трансформация через L1 (а L1 в свою очередь никогда не бывает оптимальным выбором для GBT)

      • Мультимодальность

      • Zero inflation https://en.wikipedia.org/wiki/Zero-inflated_model

      • ….

      Парни сделали такой хак, который забустил метрику SMAPE1P:

      Step 1: Multiclass Classification

      params = { 'boosting_type': 'gbdt', 'objective': 'multiclass', ... }

      Step 2: Train model (could be xgboost catboost lgbm)

      estimator.train(...)

      Step 3: Predict probabilities:

      probas = estimator.predict(...)

      Step 4: Make direct SMAPE1P optimization from probabilities

      def single_smape1p(preds, tgt):
      x = np.tile(np.arange(preds.shape[1]), (preds.shape[0], 1))
      x = np.abs(x - tgt) / (2 + x + tgt)
      return (x * preds).sum(axis=1)

      def opt_smape1p(preds):
      x = np.hstack([single_smape1p(preds, i).reshape(-1,1) for i in range(preds.shape[1])])
      return x.argmin(axis=1)

      final_predictions = opt_smape1p(probas)


      По моему гениально...