Получи случайную криптовалюту за регистрацию!

Data Science Private Sharing

Логотип телеграм канала @ds_private_sharing — Data Science Private Sharing D
Логотип телеграм канала @ds_private_sharing — Data Science Private Sharing
Адрес канала: @ds_private_sharing
Категории: Технологии
Язык: Русский
Количество подписчиков: 956
Описание канала:

Советы и лайфхаки для соревновательного (в основном) дата сайнса, о которых не расскажут на курсах.
Если есть идеи, которыми хотите поделиться, пишите -> @slivka_83
Tags:
#EDA
#Evaluation
#Models
#TimeSeries
#Train
#Preprocessing
#Valid

Рейтинги и Отзывы

3.00

2 отзыва

Оценить канал ds_private_sharing и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

0

3 звезд

0

2 звезд

0

1 звезд

1


Последние сообщения

2022-11-16 14:31:29
#Tip30 #Train

В отличии от других бустингов в LGBM деревья растут асимметрично (по листьям). В то время как в CatBoost и XGBoost рост происходит по уровням. И это декларируется разработчиками LGBM как одно из основных преимуществ.

И тут закралась ловушка: если вы ограничите глубину дерева в LGBM (а для бустингов рекомендуются не глубокие деревья), то вы по сути превратите его в симметричное урезанное дерево!

Именно поэтому по умолчанию в LGBM глубина деревьев (max_depth) = -1 (что значит - бесконечная), а в CatBoost и XGBoost глубина = 6.

Но бесконечно расти тоже не вариант - так мы просто запомним все данные. Поэтому, чтобы ограничить глубину деревьев используйте такие параметры как:
num_leaves — максимальное количество листьев в одном дереве
min_data_in_leaf — минимальное количество данных в одном листе
min_data_in_bin — минимальное количество данных внутри одного бина
min_data_per_group — минимальное количество данных на одно значение категориальной фичи
min_gain_to_split — минимальный прирост, которое дает разделение
min_sum_hessian_in_leaf — минимальная сумма гессиана в одном листе

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

З.Ы. Недавно поведение аналогичное LGBM и XGBoost реализовали в катбусте.
496 viewsedited  11:31
Открыть/Комментировать
2022-11-10 19:55:20
Залил на Хабр статью про библиотеку Voilà (читается "вуаля"), которая позволяет конвертировать ноутбуки в веб-приложения.

https://habr.com/ru/post/698662/
740 viewsedited  16:55
Открыть/Комментировать
2022-11-02 13:50:53
#Tip29 #Train

Случайный лес не переобучается! Но с оговоркой... :)
Лес переобучается, но он не переобучается от увеличения кол-ва деревьев (при прочих разумных условиях).

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

Но если вы зададите для леса глубину скажем 1000, то он конечно же переобучится: просто запомнит данные, вместо того чтобы выучить закономерности.

Интуитивно это можно понять так... Представим себе генеральную совокупность на 10 000 000 экземпляров. Возьмем из нее два случайных экземпляра и посчитаем их среднее. Очевидно, что это среднее будет сильно отличаться от среднего генеральной совокупности. Также и для трех, четыре, пяти... экземпляров. Но если мы возьмем 1 000 000 случайных экземпляров, то среднее будет очень близко к генеральной совокупности. И добавление миллион первого, второго, третьего экземпляра сильно на среднее не повлияет.
Лес точно также усредняет предсказания своих деревьев. И в определенный момент кол-во деревьев становится достаточным, и добавление новых уже ни на что не виляет (если не считать шум).
933 views10:50
Открыть/Комментировать
2022-11-01 15:41:01
Написал туториал про фреймворк Hydra
https://habr.com/ru/post/696820/

Гидра предназначена для управления файлами конфигурации в ML-проектах.
1.0K viewsedited  12:41
Открыть/Комментировать
2022-10-22 15:41:07
#Tip28 #Train

Nested Cross-Validation - самая дорогая из "классических" схем валидации.
Состоит из двух вложенных кросс-валидаций: внешней и внутренней. Внутренняя используется для подбора гипер-параметров/выбора модели, а внешняя - для оценки модели.

При обучении модели вам нужно решить две задачи: подобрать гипер-параметры и оценить модель. Если использовать для них только одну кросс-валидацию, то это может привести к чрезмерно оптимистичной оценке модели. Поскольку одни и те же данные используются и для подбора гипер-параметров и для оценки модели. Обычно в этом случае для финальной оценки выделяют тестовую часть, которая никаким образом в обучении не участвует. Но тогда мы теряем часть данных для обучения. С помощью Nested Cross-Validation можно задействовать все данные для обучения и получить корректную оценку.

Алгоритм такой:
1. Делим весь датасет на фолды
2. Для каждого фолда:
- Делим часть для обучения на свои фолды
- Подбираем гипер-параметры
- Обучаем одну модель на всей тренировочной части на лучших гипер-параметрах
- Оцениваем модель на тестовой части
3. Усредняем скоры по всем внешним фолдам

На выходе, помимо скоров, у нас будут N обученных моделей. Для предсказания используются все три, результаты усредняются.

Т.к. такая схема очень дорогая по времени, то применять ее следует в двух случаях:
1. У вас очень маленький датасет.
2. У вас есть своя майнинг-ферма :)

З.Ы. Для временного CV все аналогично просто оба цикла будут со сдвигом.
1.0K viewsedited  12:41
Открыть/Комментировать
2022-10-17 06:04:13
#Tip27 #Train

При K-fold валидации прогнозы делаются на тестовых частях, которые не участвуют в обучении и эти прогнозы называются Out-of-Fold (OOF) Predictions.

Обычно они используются по прямому назначению - оценки модели.
Но можно их задействовать и более интересным способом - для стэкинга.

Стэкинг это способ построения ансамбля моделей, в котором есть базовые модели и есть мета модель.
Базовые модели обучаются на исходных данных, а мета-модель на предсказаниях базовых моделей.
Обычно для построения стекинга исходный датасет делится на несколько крупных частей из-за чего все модели увидят меньше данных. Но благодаря Out-of-Fold Predictions можно реализовать обучение на всех (почти) данных.

В соревновательном DS алгоритм в целом такой:
1. Разбиваем датасет с метками на трейн и эвал + у нас уже есть тестовый датасет от организаторов.
2. Трейн разбиваем на фолды.
3. Для каждого фолда:
- Обучаем модель на тренировочной части.
- Выполняем предсказание для тестовой части фолда и сохраняем предсказание в отдельный вектор, каждый элемент которого соответствует строке тренировочного датасета.
- Выполняем предсказание для валидационного датасета.
- Выполняем предсказание для тестового датасета.
4. Собранные предсказания на фолдах передаем в мета-модель как фичу.
5. Усредняем предсказания полученные для валидационного и тестового датасета.
6. С помощью мета-модели делаем предсказание для усредненных значений валидационного и тестового датасета.
7. Значения полученные для валидационного датасета используем для оценки, а значения полученные для тестового датасета заворачиваем в сабмит.

Реализуется данный алгоритм обычно вручную.

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

Для большей эффективности ансамбля для базовых и мета-модели стараются задействовать разные алгоритмы (линейные/KNN/деревья).
886 viewsedited  03:04
Открыть/Комментировать
2022-10-09 19:38:41
Ловите еще одну статью :)
На этот раз посвященную Evidently - библиотеке для мониторинга качества данных и моделей в проде.

https://habr.com/ru/post/692272/

Лайки приветствуются :)
923 viewsedited  16:38
Открыть/Комментировать
2022-10-03 21:24:52
Написал на Хабре еще один туториал (в рамках курса ML System Design).
На этот раз посвященный ClearML - системе трекинга Ml-экспериментов.

https://habr.com/ru/post/691314/

Заходим, читаем и не забываем ставить лайки :)
1.2K views18:24
Открыть/Комментировать
2022-09-27 12:14:57
Написал на Хабре туториал про Dagster - оркестратор предназначенный для организации конвейеров обработки данных: ETL, проведение тестов, формирование отчетов, обучение ML-моделей.

https://habr.com/ru/post/690342/

Заходим, не стесняемся, лайкаем :)

З.Ы. Туториал написан в рамках прохождения курса ML System Design (можете еще присоединиться): https://ods.ai/tracks/ml-system-design-22
1.4K views09:14
Открыть/Комментировать
2022-09-10 16:35:21
#Tip26.1 #EDA
Для понимания как строится PDP попробуем построить его в ручную.
Алгоритм такой:
- Выбираем какую-нибудь фичу
- Вычисляем все ее уникальные значения (для непрерывной фичи можно взять сколько-то квантильных значений)
- Проходимся по каждому из них и:
- В исходном датасете для нашей фичи заменяем все значения на одно - текущее
- Делаем предсказание
- Усредняем полученные предсказания
И так для каждого уникального значения. В итоге получаем набор пар: (уникальное значение - средний предикт)
По смыслу мы как бы спрашиваем модель: а что если бы фича принимала бы только одно значение из возможного диапазона (при этом другие фичи не трогаем) - какими тогда стали бы предсказания?
- Выводим их на графике.

З.Ы. Также для демонстрации влияния на отдельные примеры выведем случайные 50 записей. Такой график уже будет называться Individual Conditional Expectation (ICE). Он позволяет увидеть какие-либо аномалии - как отдельные записи отклоняются от среднего значения.

# Считаем PDP
col = 'grade'
uniq_values = sorted(X[col].unique())
preds = {}
for v in uniq_values:
X_copy = X.copy()
X_copy[col] = v
preds[v] = model.predict(X_copy)
preds = pd.DataFrame(preds)
pdp = preds.mean()

# Выбираем случайные 50 записей
samp = preds.sample(50).copy()
samp = samp.reset_index().melt('index', var_name='cols', value_name='vals')

# Строим графики
plt.figure(figsize=(13,6))
sns.lineplot(data=samp, x='cols', y='vals', hue='index', legend=False, palette='GnBu', alpha=0.2)
sns.lineplot(x=pdp.index, y=pdp, color='red', linewidth=2)
plt.xlabel(col)
plt.ylabel('PDP');
1.3K viewsedited  13:35
Открыть/Комментировать