drawing
RNA-IONS
Необходимо определить, будет ли данная молекула РНК связана с ионом Mg2+

Ионы магния играют важную роль в формировании пространственной структуры РНК, её стабилизации, а также во взаимодействии РНК с другими молекулами. Большое число работ было проведено для анализа паттернов связывания ионов с отдельными нуклеотидами РНК и даже с отдельными основаниями. Известно, что ион может связываться с любым атомом нуклеотида, в том числе с углеродом. Тем не менее, в настоящий момент не существует надежного способа определить с каким участком данной молекулы РНК будет связан ион. Но при этом можно выделить наиболее вероятные пути связывания: определенный атом, определённый торсионный угол, определенная обработка молекулы. В зависимости от совокупности этих и других факторов нужно спрогнозировать каким образом будет взаимодействовать ион магния с РНК.

Вам предлагается определить наличие или отсутствие связи с Mg2+ (наличие в радиусе 7 ангстрем есть хотя бы одного иона магния). Для этого у вас имеется набор данных, где имеется набор из различных признаков (их более подробное описание описание вы найдете по ссылке) и колонка mg, которая означает наличие или отсутствия связи с магнием - значения 1 и 0 соответственно. Ваша модель машинного обучения должна научиться предсказывать наличие или отсуствие этой связи на новых данных из тестовой выборки (задача бинарной классификации). Как уже было сказано ранее задача предсказания наличии связи с магнием нетривиальна, поэтому не ждите идеально точных предсказаний, главная цель - постараться наиболее точно подобрать кандидатов на наличие такой связи. На практике это может упростить работу исследователей, т.к. провести эксперименты для потенциально интересных ионов, предложенных моделью, быстрее и проще, чем для всех рассматриваемых ионов.

Более подробное описание задачи доступно по ссылке. При наличии вопросов касательно предметной области вы можете задать вопрос организаторам на сайте, по почте или в группе вконтакте, предварительно проверив что этот вопрос не был задан ранее и отсутствует в разделе FAQ.

С чего начать?

В вашем репозитории gitlab будет размещен первоначальный пример модели машинного обучения (так называемый baseline). Данный пример позволит вам начать работать над задачей, даже если вы не были ранее знакомы с машинным обучением. Подробный туториал по отправке решений с картинками вы найдете в соответствующем разделе.

На сайте мы будем публиковать информацию о различных подходах, которые вы можете попробовать, чтобы улучшить этот результат. Также мы будем отвечать на ваши вопросы в процессе соревнования и публиковать ответы на них в разделе FAQ.

Даже если вы не занимались машинным обучением ранее у вас будет четкое понимание какие подходы и идеи вы можете попробовать применить, чтобы улучшить свой начальный результат. Чтобы ваш результат отобразился в таблице, вам необходимо добавить ваш код в gitlab, создать merge request в ветку leaderboard, а потом капитан команды или другой участник принимает его, нажав кнопку accept. После появления кода в ветке leaderboard значение метрики качества посчитается автоматически и в скором времени появится в таблице результатов. Более подробно про работу с gitlab и отправку решений вы можете прочитать здесь с описанием. Приведенные примеры представлены на языке Python3 т.к. он крайне популярен для решения задач машинного обучения.

Если вы хотите использовать другой язык программирования, то можете попросить помощи у организаторов по его интеграции. Также в случае возникновения каких-либо вопросов вы всегда можете обратиться к организаторам, убедившись, что ваш вопрос не был задан ранее и не присутствует в разделе FAQ.

Как оценивается результат и выбирается победитель

Целевой метрикой, по которой мы будем оценивать, является F1. Почему нами выбранна именно F мера? Самой популярной и простой для понимания метрикой является точность классификации (accuracy) - доля правильных ответов. Но, тем не менее, в данной задаче она не позволяет нам адекватно судить о качестве модели. В наборе данных наблюдается сильный дисбаланс классов и ионов с наличием связи с магнием на порядок меньше, чем без такой связи. Следовательно, классификатор, всегда предсказывающий класс ноль (отсутствие связи с магнием), может иметь точность 90% (т.к. 90% датасета имеют метки класса ноль), но не иметь абсолютно никакой практической ценности для исследователей: модель, которая всегда предсказывает отсутствие связи с магнием, вряд ли поможет найти новые примеры такой связи). Поэтому вместо общей точности классификации оценим отдельно два параметра:

  1. Precision: какая доля ионов, которые наша модель пометила потенциально имеющими связь с магнием, реально имеют такую связь (мы предложили 100 ионов, а из них только 30 имеют связь с магнием - значит precision равен 0.3).
  2. Recall - какова доля правиьно угаданных ионов со связью с магнием относительно всех ионов с магнием, показывает какую часть ионов со связью мы нашли, а какую упустили. (наша модель предложила, что некоторые 100 ионов имеют связь с магнием, 30 из них реально имеют эту связь, при этом в данной выборке было всего 60 ионов с наличием этой связи, а мы правильно обнаружили только 50 из них, тем самым получаем recall, равный 30/60 = 0.5.

Метрика F1 является средним гармоническим от precision и recall и вычисляется по формуле:

Для модели, которая предсказывает всегда нулевой класс (отсутствие связи), F1 будет равен нулю, что отлично демонстрирует бесполезность такого подхода (всегда говорить нет) для задачи поиска кандидатов на наличие связи с магнием. От вас не требуется запоминать эту формулу, она будет считаться автоматически и отображаться в таблице результатов. Также в таблице при нажатии на ваш результат мы можете увидеть более подробный отчет с дополнительной полезной информацией о результатах классификации. Более подробно про F1, accuracy и другие метрики вы можете прочитать здесь. Победитель выбирается согласно самому высокому значению метрики F1 на private test выборке

Что такое train, public test и private test?

Все данные разделены на три части:

  1. Тренировочная выборка (train) в файле train.csv содержит данные и разметку предсказываемой величины (имеет ион связь с магнием или нет), на которой вы можете тренировать ваши модели.
  2. Открытая тестовая выборка (public test) находится в файле test.csv и не содержит разметки предсказываемых значений. На ней вы осуществляете предсказания и получаете значение метрики F1, которое отображается в таблице результатов. Благодаря этому вы можете оценить свою позицию относительно других участников во время соревнования.
  3. Закрытая тестовая выборка (private test) используется для определения победителей. В конце соревнований, когда приём решений будет закрыт, последняя версия вашей модели из ветки leaderboard будет запущена на закрытой части тестовых данных. Метрики качества модели на закрытых данных будут обновлены, опубликованы, и именно благодаря им все участники будут ранжированы окончательно. Это делается для того, чтобы оценить обобщающую способность моделей на новых данных, которые они не видели ранее, т.к. на доступной открытой части можно добиться эффекта переобучения или же поднять свой рейтинг путем посылки огромного количества решений, пытаясь подобрать верные ответы. На закрытой части запускается только финальное решение и только 1 раз, это помогает исключить подобные нечестные ходы.


При наличии вопросов касательно постановки задачи, метрики качества и прочих нюансов вы можете задать вопрос организаторам на сайте, по почте или в группе вконтакте, предварительно проверив что этот вопрос не был задан ранее и отсутствует в разделе FAQ.

Данные

Датасет состоит из двух файлов:

Имя файла Описание Размер данных
train.csv содержит тренировочные данные, описания признаков можно найти по ссылке выше 237969 x 386
test.csv содержит тестовые данные, по которым необходимо сделать предсказания 2831 x 385
#
Δ
Команда
Результат
Попытки
Дата
1
3
0.4250
208
неделю
2
1
0.4228
110
неделю
3
1
0.4206
56
неделю
4
2
0.4192
172
неделю
5
2
0.4122
60
неделю
6
1
0.4076
30
неделю
8
0.3918
21
неделю
9
1
0.3586
46
неделю
10
13
0.3371
2
неделю
11
2
0.2998
31
2 н.
12
1
0.2948
5
2 н.
13
1
0.2779
B
2 н.
14
1
0.2779
B
2 н.
15
1
0.2779
B
2 н.
16
1
0.2779
B
2 н.
17
1
0.2779
B
2 н.
18
1
0.2779
2
2 н.
19
1
0.2779
4
2 н.
20
1
0.2779
B
2 н.
21
1
0.2779
B
2 н.
22
1
0.2779
B
2 н.
23
1
0.2779
27
2 н.
24
0.2779
B
неделю
#
Команда
Результат
Попытки
1
0.4250
208
2
0.4228
110
3
0.4206
56
5
0.4122
60
6
0.4076
30
8
0.3918
21
9
0.3586
46
10
0.3371
2
11
0.2998
31
12
0.2948
5
13
0.2779
B
14
0.2779
B
16
0.2779
B
17
0.2779
B
18
0.2779
2
19
0.2779
4
20
0.2779
B
21
0.2779
B
22
0.2779
B
23
0.2779
27
24
0.2779
B
#
Δ
Команда
Результат
Попытки
1
0.3953
2
2
4
0.3951
2
3
0.3819
2
5
3
0.3806
2
6
4
0.3745
2
7
2
0.3716
2
9
1
0.3491
2
10
1
0.3065
2
11
2
0.2838
2
12
0.2838
2
13
1
0.2838
2
14
3
0.2838
2
15
1
0.2838
1
16
1
0.2838
1
17
1
0.2838
1
18
1
0.2838
1
19
1
0.2838
1
20
1
0.2838
1
21
6
0.2838
1
22
0.2838
1
23
0.2838
1
24
0.2838
1
#
Команда
Результат
Попытки
1
0.3953
2
2
0.3951
2
3
0.3819
2
5
0.3806
2
6
0.3745
2
7
0.3716
2
9
0.3491
2
10
0.3065
2
11
0.2838
2
12
0.2838
2
13
0.2838
2
14
0.2838
2
15
0.2838
1
16
0.2838
1
17
0.2838
1
19
0.2838
1
20
0.2838
1
21
0.2838
1
22
0.2838
1
23
0.2838
1
24
0.2838
1

Отправка решений

Для отправки решений вам необходимо добавить ваши изменения в gitlab репозиторий

Работа с git

Если вы ранее не работали с git, то мы рекомендуем воспользоваться программой смартгит по этой ссылке и соответствующей инструкцией (до раздела слияние веток, т.к. слияние делается через встроенный в gitlab механизм merge requests, описанный ниже). Организаторы соревнования создадут для вас репозиторий и выдадут вам доступ. В вашем репозитории будет создано две ветки: master и leaderboard . Ветка leaderboard является защищенной (protected) и добавлять туда изменения вы можете только посредством механизма merge request. Примеры подобной практики вы можете найти во многих компаниях и проектах, использование merge request (pull request на других платформах, таких, как github, bitbucket и т.п.) позволяет проводить code review перед добавлением кода в ветку и иметь в ветке leaderboard только 100% проверенные рабочие решения. Также protected ветки в gitlab защищены от изменения истории коммитов, что увеличивает прозрачность и честность соревнования.

Как отправить решение через gitlab:

  1. Сделайте коммит (git commit) в ветку master или в любую другую ветку кроме leaderboard и отправьте коммит на сервер (git push).
  2. Зайдите в раздел merge request в вашем репозитории и создайте merge request из ветки master в ветку leaderboard (или из другой вашей ветки если вы захотите назвать её по-другому).
  3. Отправьте ссылку на merge request товарищам по команде, послушайте их комментарии, внесите дополнительные изменения если это необходимо и нажмите кнопку merge. Тем самым вы примете merge request в ветку leaderboard и в разделе CI/CD в gitlab появится запись с вашим коммитом. Там вы можете наблюдать за процессом работы решения, по его окончанию результат появится в таблице на сайте board.devbattle.ru

Подробный туториал с картинками (раскрыть спойлер)

Вы сделали коммит с вашим кодом в репозиторий в ветку master и теперь хотите создать merge request.

Ссылка на раздел merge request находится в левом меню:

После этого вам надо нажать кнопку New merge request:

Затем в разделе source branch вы выбираете master, а в target branch выбираете leaderboard. После этого нажимаете compare branches and continue:

После данного шага у вас откроется страница на которой будет кнопка submit merge request. Нажимаете на нее:

После этого ваш merge request будет открыт и находиться в общем списке. Вы можете обсудить изменения кода с товарищами по команде в комментариях если захотите. После этого нажимайте кнопку Merge. После её нажатия merge request перейдет в раздел merged в общем списке, а ваше решение отправится на сервер и в скором времени появится в таблице результатов. Подробнее за статусом отправки можно следить в разделе CI/CD.

Если у вас уже был опыт работы с git или другими системами контроля версий, то данные шаги не должны составить для вас проблем. Если же нет, то это отличный способ разобраться в данном вопросе, т.к. системы контроля версий используются повсеместно и этот опыт вам будет крайне полезен практически в любой IT компании.

Пример Baseline

Для работы с нашей системой ваше решение должно удовлетворять трем простым требованиям: скрипт запуска должен быть назван main.py, принимать на вход два csv файла train.csv и test.csv и сохранять результат предсказаний в predictions.csv В вашем репозитории вы найдете базовый пример модели, удовлетворяющей всем описанным требованиям. В дальнейшем вы можете отталкиваться от этого примера.

Подробное описание требований

Требования к вашему решению очень просты, они описаны выше и сопровождаются baseline примером их реализации. Тем не менее, ниже мы предоставляем более подробное описание каждого из пунктов

1. Имя файла

Переименуйте главный скрипт, который отвечает за тренировку и предсказания в main.py

2. Чтение датасета

Настройте main.py, так, чтобы он мог читать dataset из CSV-файлов (вы можете воспользоваться готовым примером из репозитория).

2.1 Если у вас скрипт на python

Настройте чтение аргументов командной строки при запуске скрипта таким образом, чтобы он принимал 3 аргумента: первый -- это путь к csv файлу с тренировочной выборкой, второй -- путь к CSV-файлу с тестовой выборкой, третий -- путь для сохранения результатов предсказания. Пример корректного вызова:

python3 main.py data/train.csv data/test.csv predictions.csv

Пример настройки файла main.py:

...
import sys
train_csv_path, test_csv_path, predictions_csv_path = sys.argv[1:4]

Так же можно воспользоваться библиотекой fire от Google. Пример:

import fire
def main(train_csv_path='data/train.csv',
         test_csv_path='data/test.csv',
         predictions_csv_path='predictions.csv'):
    ...
if __name__ == '__main__':
    fire.Fire(main)

2.2 Если вы используете Jupyter

С начала необходимо экспортировать Ваш код из Jupyter. Сделать это можно через File -> Download as -> Python:

В случае, если Ваш файл является сохраненным из Jupyter, заведите две переменные с путями к csv-файлам в коде. Заметьте, в данном случае важно, чтобы файлы читались из папки data которая находится в той же директории, что и скрипт, т.е. путь файла должен быть относительным и начинаться с data/. Имена файлов должны быть в точности train.csv для тренировочной выборки и test.csv -- для тестовой.

Пример настройки файла main.py:

...
train_csv_path = 'data/train.csv'
test_csv_path = 'data/test.csv'
predictions_csv_path = 'predictions.csv'

3. Сохранение результатов

Результаты предсказания должны сохраняться в виде CSV-файла с именем predictions.csv в ту же директорию, из которой исполняется скрипт. Предполагая, что Вы используете Pandas, процесс сохранения результатов предсказания должен выглядеть так:

import pandas as pd
pd.DataFrame(results).to_csv(predictions_csv_path, index=False)

При этом predictions_csv_path Вы уже задали в пункте 2.

Дополнительная информация

В вашем репозитории вы найдете файл .gitlab-ci.yml. Он уже настроен, чтобы отправлять ваши решения в таблицу результатов. Важно: не меняйте содержимое .gitlab-ci.yml файла. Если вы считаете, что по какой-то причине вам необходимо это сделать, то свяжитесь с организаторами.

Если вам необходимо установить дополнительные python пакеты (pip пакеты), то добавьте их в текстовый документ requirements.txt. Пример как это можно сделать можно найти здесь. Если вам необходимо установить дополнительные apt пакеты, то добавьте их в документ apt-packages.txt. Скорее всего во время соревнования вам пригодится только установка pip пакетов. Если вы корректно выполнили все требования выше, сделайте коммит в репозиторий, откройте GitLab и в нём вкладку "CI/CD". Если вы видите строку со своей веткой и коммитом, то всё было сделано верно.

Для просмотра результатов откройте Leaderboard и найдите свой результат в списке на главной странице или найдите себя в поисковой строке по имени на GitLab. Если результат не виден, значит что-то пошло не так: либо вы неверно настроили CI в своей ветке либо во время тренировки/предсказания произошла ошибка и результат не был получен и отправлен в Leaderboard.

Правила

Соревнование проходит с 23 ноября по 1 декабря. Результаты будут обновлены 2 декабря на конференции. Для отправки результатов используется gitlab. После добавления изменений в ветку leaderboard разработанная нами система в автоматическом режиме запустит тренировку вашей модели и оценит её качество на открытой тестовой выборке, вам лишь необходимо поддержать в коде один из двух сценариев:

  • принимать аргументами командной строки пути к train.csv, test.csv для ввода данных и predictions.csv для результатов предсказания
  • вбить константами значения путей "train.csv", "test.csv" и "predictions.csv" соответственно - данный вариант может быть полезен при использовании Jupyter. Результирующий файл для запуска должен main.py. Если вы используете Jupyter, то воспользуйтесь кнопкой экспортирования кода в .py файл. Более подробно про отправку решений и работу с gitlab вы можете прочитать здесь

Ограничение на время работы вашего решения составляет 5 часов (для запуска выделены виртуальные машины с 4 ядрами процессора Intel Xeon на каждой). Этого времени более, чем достаточно, если вы разрабатываете модель ориентируясь на использование её в production модели и рассчитываете в том числе и на адекватную скорость тренировки и предсказания. Если вам по каким-то причинам не хватило данного времени, то обратитесь к организаторам. Мы постараемся либо помочь в него уложиться не теряя в качестве решения либо рассмотрим вопрос о повышении лимита для всех участников.

Для определения победителей используется значение метрики F1 на приватной тестовой выборке (private test). Более подробно про метрику F1 и разбиение на выборки вы можете прочитать в пунктах ниже.

Описание метрики F1

Целевой метрикой, по которой мы будем оценивать, является F1. Почему нами выбранна именно F мера? Самой популярной и простой для понимания метрикой является точность классификации (accuracy) - доля правильных ответов. Но, тем не менее, в данной задаче она не позволяет нам адекватно судить о качестве модели. В наборе данных наблюдается сильный дисбаланс классов и ионов с наличием связи с магнием на порядок меньше, чем без такой связи. Следовательно, классификатор, всегда предсказывающий класс ноль (отсутствие связи с магнием), может иметь точность 90% (т.к. 90% датасета имеют метки класса ноль), но не иметь абсолютно никакой практической ценности для исследователей: модель, которая всегда предсказывает отсутствие связи с магнием, вряд ли поможет найти новые примеры такой связи). Поэтому вместо общей точности классификации оценим отдельно два параметра:

  1. Precision: какая доля ионов, которые наша модель пометила потенциально имеющими связь с магнием, реально имеют такую связь (мы предложили 100 ионов, а из них только 30 имеют связь с магнием - значит precision равен 0.3).
  2. Recall - какова доля правиьно угаданных ионов со связью с магнием относительно всех ионов с магнием, показывает какую часть ионов со связью мы нашли, а какую упустили. (наша модель предложила, что некоторые 100 ионов имеют связь с магнием, 30 из них реально имеют эту связь, при этом в данной выборке было всего 60 ионов с наличием этой связи, а мы правильно обнаружили только 50 из них, тем самым получаем recall, равный 30/60 = 0.5.

Метрика F1 является средним гармоническим от precision и recall и вычисляется по формуле:

Для модели, которая предсказывает всегда нулевой класс (отсутствие связи), F1 будет равен нулю, что отлично демонстрирует бесполезность такого подхода (всегда говорить нет) для задачи поиска кандидатов на наличие связи с магнием. От вас не требуется запоминать эту формулу, она будет считаться автоматически и отображаться в таблице результатов. Также в таблице при нажатии на ваш результат мы можете увидеть более подробный отчет с дополнительной полезной информацией о результатах классификации. Более подробно про F1, accuracy и другие метрики вы можете прочитать здесь. Победитель выбирается согласно самому высокому значению метрики F1 на private test выборке

Что такое train, public test и private test?

Все данные разделены на три части:

  1. Тренировочная выборка (train) в файле train.csv содержит данные и разметку предсказываемой величины (имеет ион связь с магнием или нет), на которой вы можете тренировать ваши модели.
  2. Открытая тестовая выборка (public test) находится в файле test.csv и не содержит разметки предсказываемых значений. На ней вы осуществляете предсказания и получаете значение метрики F1, которое отображается в таблице результатов. Благодаря этому вы можете оценить свою позицию относительно других участников во время соревнования.
  3. Закрытая тестовая выборка (private test) используется для определения победителей. В конце соревнований, когда приём решений будет закрыт, последняя версия вашей модели из ветки leaderboard будет запущена на закрытой части тестовых данных. Метрики качества модели на закрытых данных будут обновлены, опубликованы, и именно благодаря им все участники будут ранжированы окончательно. Это делается для того, чтобы оценить обобщающую способность моделей на новых данных, которые они не видели ранее, т.к. на доступной открытой части можно добиться эффекта переобучения или же поднять свой рейтинг путем посылки огромного количества решений, пытаясь подобрать верные ответы. На закрытой части запускается только финальное решение и только 1 раз, это помогает исключить подобные нечестные ходы.


При наличии вопросов касательно постановки задачи, метрики качества и прочих нюансов вы можете задать вопрос организаторам на сайте, по почте или в группе вконтакте, предварительно проверив что этот вопрос не был задан ранее и отсутствует в разделе FAQ.

Ответы на часто задаваемые вопросы

Организационные вопросы

Q: Каковы сроки проведения?

A: Онлайн соревнование с 23 ноября по 1 декабря. Подведение итогов на конференции 2 декабря.

Q: Как определяется победитель?

A: Правила подробно описаны здесь.

Q: Как зарегистрироваться на соревнование?

A: Перейдите по ссылке devbattle.ru/dday и выберите пункт регистрация на соревнование

Q: Как зарегистрироваться на конференцию?

A: Если вы зарегистрированы на соревнование, то на конференцию мы регистрируем вас автоматически. Если вы хотите прийти только на конференцию, то зарегистрируйтесь на неё отдельно.

Q: Можно ли будет зарегистрироваться после начала соревнования?

A: Да, регистрация открыта и во время соревнования.

Q: Я хочу присоединиться к какой-либо команде чтобы решать вместе с ними.

A: Обратитесь к организаторам.

Q: Я не смогу прийти на вручение призов, но хочу участвовать в соревновании

A: Если придет хотя бы один человек из команды, то этого будет достаточно для награждения. В противном случае обратитесь к организаторам чтобы мы знали как передать вам призы.

Технические вопросы

Q: Как получить доступ к репозиторию?

A: Если вы зарегистрировались, то организаторы сами создадут и выдадут вам доступ к репозиторию, после этого он будет доступен в списке на сайте gitlab.com. В случае каких-либо проблем обратитесь к организаторам.

Q: Как отправить решение?

A: Подробное описание вы найдете здесь.

A: Почему при повторной отправке того же кода результат изменился?

Q: Скорее всего вы используйте генератор псевдослучайных чисел в своем коде. Укажите любую числовую константу в качестве значения random_state для классификаторов и любых участков кода, где его можно задать. Именно таким образом в baseline примере для классификатора RandomForest указано значение random_state=42. Перезапустите ваше решение несколько раз у себя на компьютере перед отправкой и убедитесь в повторяемости результатов.

Q: Когда результат появится в таблице?

A: Статус выполнения после отправки можно найти в разделе CI/CD в gitlab. Время работы зависит от времени тренировки и предсказания вашего решения.

Q: Что делать, если в разделе CI/CD стоит статус Done, но решение в таблице не появилось?

A: Проверьте вывод в разделе jobs на предмет ошибок. Если ошибок нет и скрипт отработал, но решения нет в таблице, то такая ситуация нетипична и могла возникнуть только в случае сетевых сбоев или проблем с оборудованием. В таком случае вы можете перезапустить задачу либо если не хотите ждать окончания перезапуска прислать организаторам название вашей команды и идентификатор коммита.

Q: Как установить пакеты для Python (pip пакеты)?

A: В репозитории есть файл requirements.txt, добавляйте список пакетов в него стандартным способом, например так. Большинство популярных библиотек машинного обучения и обрабокти данных уже будут добавлены нами в этот файл перед началом соревнования.

Q: В каком окружении будет развернуто решение?

A: Docker образ на основе Ubuntu 16.04

Q: Как установить apt пакеты?

A: Добавьте их в файл apt-packages.txt по одному названию на каждую строку.

Q: Я хочу установить сложную зависимость или использовать другой язык программирования вместо Python3, что мне делать?

A: Если вы можете поставить все необходимое используя apt и pip пакеты, то действуйте по инструкции выше и оберните точку входа вашей программы в python скрипт main.py с соответствующими аргументами. В случае каких-либо проблем или дополнительных вопросов обратитесь к организаторам.

Q: Можно ли отправить предобученную модель?

A: Да, хоть ваш файл main.py и должен принимать путь к train.csv на вход для правильной работы системы, но вы можете проигнорировать тренировочные данные и подгрузить предобученную модель из файла.

С чего начать и куда двигаться дальше?

Q: С чего начать?

A: Зайдите в gitlab и в вашем репозитории вы увидете пример файла main.py где будет написан код загрузки данных из файла, тренировки модели Random Forest и код сохранения результатов предсказания. Вы можете отталкиваться от этого решения и модифицировать его для своего кода.

Q: Как проверить качество модели локально, без отправки на сервер?

A: Воспользуйтесь техникой кросс-валидации. Мы рекомендуем использовать Stratified K-Fold. Подробнее про кросс-валидацию можно прочитать здесь.

Пример кода для локальной кросс-валидации

# Не забудьте импортировать необходимые библиотеки
import numpy as np
from sklearn.ensemble import RandomForestClassifier
from sklearn.model_selection import cross_val_score, StratifiedKFold

# Допустим вы уже прочитали X_train и y_train из файла как в baseline примере в main.py в вашем репозитории

# Укажем классификатор для кросс-валидации
clf = RandomForestClassifier(n_jobs=-1, random_state=42, n_estimators=100, max_depth=10, class_weight="balanced")
# Будем использовать валидацию с разбиением на 5 частей (фолдов) с тренировкой на 4ех из них и замером качества на 5ой
cv = StratifiedKFold(n_splits=5) # Stratified K-Fold сохраняет одинаковый дисбаланс классов между фолдами
# Замеряем f1 на каждом фолде и выводим средний результат
scores = cross_val_score(clf, X_train, y_train, cv=cv, scoring="f1")
print("Mean f1 score is %.3f, fold scores: %s" % (np.mean(scores), ", ".join([str(score) for score in scores])))
# Данный скрипт поможет локально оценить качество вашего решения без отправки на сервер. 
# Для отправки решений на сервер ориентируйтесь на baseline пример в main.py в вашем репозитории

Q: Как работать с csv файлами при помощи Pandas?

A: Примеры популярных операций представлены в этой статье.

Q: Как можно предобработать данные для различных типов признаков?

A: Описание и примеры вы найдете в этой статье. Обратите особое внимание на раздел Преобразования признаков (Feature transformations).

Q: Как мне проверить насколько хорошо работает моя модель?

A: Воспользуйтесь техникой кросс-валидации, разбив тренировочные данные из train.csv на две части: на одной обучите модель, на другой выполните предсказание и оцените результат. Также может быть крайне полезна техника под названием K-Fold. Более подробно с примерами кода об этом можно прочитать здесь.

Q: Какие еще модели можно попробовать?

A: Воспользуйтесь любыми доступными классификаторами из библиотеки sklearn из этого примера или из полного списка. Не забудьте указывать параметр random_state=42 или любому другому числу для воспроизводимости результатов если такой параметр есть у модели. Для ускорения тренировки можно использовать параметр n_jobs=-1 чтобы использовать все ядра процессора. Также вы можете попробовать другие библиотеки, например XGBoost, LightGBM или CatBoost. Большинство из них устанавливается добавлением строчки с названием библиотеки в requirements.txt на сервере и командой pip3 install xgboost (либо другое название библиотеки) локально на компьютере. Если вы используете Windows, то возможно вам понадобится команда python -m pip install xgboost или её аналоги для других библиотек.

Q: Как настроить параметры модели?

A: Перебирайте различные комбинации параметров на кросс-валидации и выберите ту, которая дает наибольшее значение метрики F1. Пример кода можно найти здесь или [здесь] (https://scikit-learn.org/stable/auto_examples/model_selection/plot_grid_search_digits.html#sphx-glr-auto-examples-model-selection-plot-grid-search-digits-py).

Q: Каким образом можно бороться с дисбалансом классов?

A: У многих моделей есть параметр class_weight, который позволяет неравномерно задать веса разным классам, тем самым сгладить дисбаланс. В baseline примере показано его использования. Также вам могут помочь техники генерации дополнительных данных (Data Augmentation), например из библиотеки imbalanced-learn. Она позволяет генерировать синтетические данные, увеличивая размер датасета. Тем не менее, синтетические данные могут отличаться от реальных, поэтому проверьте, какой объем синтетических данных дает вам наибольшый прирост качества.

Q: Как еще можно улучшить свой результат?

A: Внимательно изучите набор признаков и предметную область. Попробуйте подумать, какие дополнительные признаки могут помочь вам для решения задачи и добавьте их. Этот подход называется feature engineering и он может быть крайне полезен в подобных соревнованиях. Подробнее про него можно прочитать здесь и здесь, Также вам может помочь визуализация данных и примеры из этой статьи. Кроме того, для визуализации многомерных данных могут быть полезны T-SNE или другие алгоритмы снижения размерности. Конкретно в данном соревновании вам может быть полезна визуализация цепочек РНК. Изучение различных материалов и статей по машинному обучению и ML соревнованиям в частности также могут вам сильно помочь.

Q: Можно какой-нибудь чек-лист что стоит попробовать?

A: Да, конечно:

  1. Ознакомиться с подробным описанием признаков. Посмотреть больше информации о задаче и предметной области в интернете.
  2. Попытаться придумать новые признаки (feature engineering), обнаружить интересные взаимосвязи исходя из описания.
  3. Грамотно обработать текстовые признаки (pdb_chain и DSSR). Учесть, что эти признаки состоят из нескольких частей
  4. Обработать NaN значения. Попробовать убирать, заполнять, etc. Сравнить разные комбинации предобработок.
  5. Попробовать различные классификаторы из scikit-learn. Попробовать XGBoost, LightGBM, CatBoost и другие библиотеки. Попробовать ансамбли из нескольких классификаторов.
  6. Попробовать подобрать гиперпараметры для классификаторов. Не забывать, что коэффициент весов классов для борьбы с дисбалансом - тоже параметр и его тоже можно тюнить. Перебирать параметры можно локально на кросс-валидации (K-Fold либо отложенная выборка в виде некоторой части тренировочной выборки, f1 на которой более-менее коррелирует с тестовоой выборкой). Не забывать при этом периодически отправлять решение на сервер, т.к. на кросс-валидации и на тесте эффект может быть разный.
  7. Попробовать различные варианты работы с дисбалансом классов. Кроме уже упомянутых параметров весов классов можно испоьзовать библиотеку imbalanced-learn. Она может генерировать синтетические данные для класса с меньшим количеством примеров. Важно: аккуратнее с кросс-валидацией, не меряйте качество по синтетическим данным, оно будет сильно выше, убедитесь, что предсказываете класс только для реальных данных. Также не забывайте, что кроме oversampling есть и undersampling и можно попробовать грамотно уменьшить количество записей в классе где их больше.
  8. Пробовать комбинации различных подходов. Добавлять изменения по одному. Вы можете добавить 3 изменения, одно из них улучшило бы скор на 0.1, другое уменьшило бы на 0.01, а третья уменьшила бы на 0.3. В результате вместо улучшения метрики можно получит ухудшение и упустить интересный подход, давший повышение f1.
  9. Попробовать визуализировать данные. Можно визуализировать как и исходные данные, так и после снижения размерности. Можно использовать визуализацию, специфичную для предметной области.
  10. Читать статьи и другие материалы про опыт участия соревнованиях по Data Science в интернете