# Введение в соревновательный анализ данных
<!-- [v2] -->
Гущин Александр, DMIA, осень 2019
[TOC]
---
Соревнования
1. Зачем проводят и участвуют
2. Какие бывают
3. Какое отличие от задач DS на работе
4. Что нужно для участия
5. Как решать
6. Как решать, чтобы потом повторить
7. Как решать в команде
8. Как писать код, чтобы не страдать
<!-- ---
1. Место соревнований в жизни DS, организаторов и коммьюнити
2.
3. Как решать 🗒
4. Как побеждать
5. Воспроизводимость решений 🔄
6. Работа в команде 👩🏼💻😸🤖
7. Код 💻 -->
---
## Зачем нужны соревнования по анализу данных?
[Красивая презентация](https://disk.yandex.ru/d/qFNYL_HoLHLtQw)
<!-- ---
# Зачем нужны соревнования по анализу данных?
Лучше тезисно сюда
# Какие соревнования бывают?
Частично есть в презентации выше, было бы здорово докинуть ещё примеров
-->
---
Соревнования бывают
- По типу сабмита: csv файл или докер образ
- По "игрушечности": Kaggle (баллы, медальки, призы) или Kaggle Inclass
- По времени: соревнование (~неделя и больше) или хакатон (обычно до недели)
---
Обычный формат соревнования
Даны: x_train, y_train
Найти: y_test
- Сабмитим csv файл: x_test можно пощупать
- Сабмитим docker-образ: x_test не пощупать
---
## Работа DS в индустрии
<!-- В чем отличие от тех задач, которыми обычно занимаются DS на своей работе?
-->

https://www.jeremyjordan.me/ml-projects-guide
<!-- ---
Пояснить предыдущий слайд
-->
---
## Что нужно для участия
1. Время!
2. Умение программировать (желание научиться)
3. Машинка (можно арендовать)
---
### Время
- Особенно тогда, когда есть цель занять достойное (для вашего уровня) место на лидерборде.
- Вопрос: сколько времени у DS уходит на решение задачи в индустрии или на проведение ресерча и написание статьи?
---
### Умение или желание программировать
- Bash для некоторых библиотек и работы с машинкой
- Python, R, Matlab, другие языки
- Для Python: ipython, jupyter notebook, numpy, pandas, matplotlib, scikit-learn, lightgbm, многие другие
---
### Машинка
- Удобно решать с ноутбука с 16+ гб RAM, core i5+, SSD
- Можно арендовать сервер на aws, google cloud, microsoft azure, selectel, многие другие
---
- Больше датасеты => требуется больше CPU, RAM и/или SSD
- Больше интенсивных вычислений (фичи и модели) => CPU
- Соревнования с картинками/текстами => нужны GPU и SSD
---
## Как решать
1. Оглядываться на предыдущие этапы :)
2. Изучить задачу и метрику
3. Отправить константный бейзлайн
4. Написать фреймворк
5. Генерировать фичи
6. Тюнить модели
7. Объединять решения
Это - основные темы нашего направления
<!-- - И курса `How to Win DS Competitions` на курсере -->
<!-- https://www.coursera.org/learn/competitive-data-science -->
<!-- Когда-нибудь тут будет ссылка на онлайн DMIA -->
---
Эмпирические советы:
1. Как можно раньше проверьте, что ваша валидация корректна
2. Выписывайте свои идеи
3. Читайте форум
4. Изучайте код других участников
---
## Воспроизводимость решений
Как решать, чтобы потом можно было повторить
1. random_state
2. git
3. submission files
---
### Режимы работы
Сделайте два режима работы своего ноутбука/скрипта: validation и test
Например
```python
X = pd.read_csv('data/train.csv')
y = pd.read_csv('data/y_train.csv')
MODE = 'validation'
if MODE == 'validation':
x_train, x_test, y_train, y_test = train_test_split(X, y, ...)
elif MODE == 'test':
x_train = X
y_train = y
x_test = pd.read_csv('data/test.csv')
```
---
### Random_state
1. `train_test_split(random_state=0)`
2. `RandomForestClassifier(random_state=0)`
3. ```np.random.seed(0); np.random.choice(...)```
---
### Git
Git - инструмент для версионирования изменений кода.
https://git-scm.com/downloads

Сайты, реализующие возможность работы над кодом с помощью утилиты git
  
---
#### Основы Git
```bash
git clone github.com/username/reponame.git
git add README.md
git commit -m 'initial commit'
git push
# подтянуть изменения, которых нет в локальной папке
git pull
```
https://git-scm.com/book/ru/v2
https://try.github.io/
---
### Submissions
1. Организаторы могут попросить воспроизвести финальный сабмит
2. Вам может понадобиться воспроизвести какой-то свой сабмит
3. Вы можете захотеть смешать сделанные вами сабмиты
---
#### Эвристики
1. Удобно хранить код всех сабмитов (git)
2. Удобно хранить файлики с сабмитами (filesystem, git lfs, cloud storage...)
---
#### Git lfs
Git Large File Storage
https://git-lfs.github.com

---
## Работа в команде
Плюсы:
- Быстрее всего учиться новому у других или вместе с другими
- Больше людей => больше шансов выиграть
Минусы:
- Члены команды могут перестать что-то делать
- Могут возникнуть другие разногласия
Note: Удалять участников из команды на kaggle нельзя
---
Что нужно для успешной работы в команде
1. Планировать работу
2. Обмениваться идеями
3. Обмениваться кодом (git)
4. Обмениваться сабмитами (git lfs / cloud storage) и смешивать ваши решения
---
Как обычно идет работа в команде
1. Формируется общая валидационная выборка
2. Все готовят свои решения: по-своему обрабатывают данные, генерят фичи и учат модели
3. Решения участников регулярно смешиваются
---
### Планирование работы и обмен идеями
1. Планировать заранее - правильно
2. Нужно регулярно синхронизироваться
3. Созвоны - для синков, чат - для обсуждений
5. Нужно быть готовым объединять ваши решения
6. Кто-то должен (нести ответственность за работу команды)
---
### Обмен кодом
1. Заведите приватный репозиторий и дайте доступы
2. Комитьте туда код регулярно
---
### Регулярные коммиты
В конце вашего ноутбука...
```python
COMPETITION = 'kaggle.com/...'
```
```python
FILE = 'submissions/_LGBM_NN.csv'
MESSAGE = 'LGBM-super-stacked + NN averaged 10 fold'
submit.to_csv(FILE)
```
```bash
%%bash
git pull
git add StackingLGBM.ipynb
git commit -m '{MESSAGE}'
git push
kaggle competitions submit \
-c {COMPETITION} -f {FILE} -m {MESSAGE}
```
https://www.kaggle.com/docs/api
---
### Смешивание решений
1. Выделите валидационную выборку вначале! (и перепроверьте)
2. Напишите скрипт/ноутбук, который будет смешивать предсказания
3. Делайте это регулярно, чтобы понимать ваш прогресс
---
#### Проверка валидационной выборки
День 1:
```
A: сделал валидацию, train_test_split(test_size=0.2, random_state=1)
B: отлично, го
```
День 31:
```
А: Перепроверь, у тебя test_ids [5821, 2440, 2143, ...]?
Б: [1734, 2314, 4325, ...]
А: :'(
```
Частые причины:
1. Разные версии python и библиотек
2. Разный порядок строк в разбиваемом датафрейме
---
#### Смешивание решений
- Напишите скрипт/ноутбук, который может подобрать по валидационной выборке способ смешивания ваших моделей.
- Чтобы смешивать не об лидерборд, вам нужно сохранять прогнозы для (1) валидации, (2)
- Внизу ноутбука - тот код, который делает коммит и сабмит.
---
Шаги по усложнению:
1. Усреднение
2. Усреднение с весами (== блендинг линейной моделью)
3. Стекинг
Делайте смешивание регулярно
1. Чтобы понимать, есть ли от этого толк
2. Чтобы тратить время более перспективно
---
## Пишем код
Соревнования - это не про продакшн код.
Но про корректный и понятный.
---
### Six steps to more professional data science code
📦 Modular
✔️ Correct
📖 Readable
💅 Stylish
🛠️ Versatile
💡 Creative
https://www.kaggle.com/rtatman/six-steps-to-more-professional-data-science-code
---
📦 Modular: Code is broken into small, independent parts (like functions) that each do one thing. Code you’re reusing lives in a single central place.
---
✔️ Correct: Your code does what you say/think it does.
---
📖 Readable: It’s easy to read the code and understand what it does. Variable names are informative and code has up-to-date comments and docstrings.
---
💅 Stylish: Code follows a single, consistent style (e.g. the Tidyverse style guide for R, PEP 8 for Python code)
---
🛠️ Versatile: Solves a problem that will happen more than once and anticipates variation in the data.
---
💡 Creative: Solves a problem that hasn’t already been solved or is a clear improvement over an existing solution.
---
Соревнования
1. Зачем проводят и участвуют
2. Какие бывают
3. Какое отличие от задач DS на работе
4. Что нужно для участия
5. Как решать
6. Как решать, чтобы потом повторить
7. Как решать в команде
8. Как писать код, чтобы не страдать
---
Соревнования не только про ML. Ещё про то, как
1. Заставить код работать
2. Распарсить данные в непонятных форматах
3. Работать с датасетом, который не влезает в память
4. Найти в данных баг, который пропустили организаторы
---
6. Использовать алгоритмы, которые вы не понимаете
7. Как ускорить ваши вычисления
8. Просмотреть глазками большое количество данных
Но и реальная жизнь тоже!
---
<!-- .slide: data-background="https://cdn.pixabay.com/photo/2018/10/03/08/47/competition-3720732_1280.jpg" -->
<div style="color: #ddd;">
1. Dont cheat
2. Apply yourself
3. Have fun!
</div>
.
.
.
.
<!-- В конце концов, опыт важнее денег -->
<!--  -->
<!-- 
 -->
{"metaMigratedAt":"2023-06-15T00:33:02.696Z","metaMigratedFrom":"YAML","title":"Введение в соревновательный анализ данных","breaks":true,"slideOptions":"{\"theme\":\"white\",\"transition\":\"slide\"}","contributors":"[{\"id\":\"e0bc91de-98f7-46f8-a3a9-852912833a93\",\"add\":10887,\"del\":946}]"}