Code.Offer.Repeat
47 subscribers
10 photos
2 files
6 links
Пишу про ML/Data Science собеседования и не только
Автор: Дмитрий Булгаков (Middle Data Scientist @ MTS Web Services)
@dm1trybu
Download Telegram
#вопрос_дня
#MLbasics
#теорвер

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

Условие задачи:
Есть две коробки, в первой лежат 3 зеленых шара и 7 красных шаров, а во второй - 6 зеленых и 4 красных. Мы случайно берём шар наугад и он оказывается зелёным. Какая вероятность, что этот зеленый шар был взят из первой коробки?

Решение:
Здесь нужно расписать имеющиеся априорные вероятности и применить теорему Байеса.
1) Выписываем вероятности каждого отдельного события - взять любой шар из первой коробки, взять зеленый шар из первой коробки, взять зеленый шар из второй коробки.
2) Считаем по формуле полной вероятности общую вероятность взять зеленый шар.
3) Считаем по формуле из теоремы Байеса вероятность, что наш зеленый шар был взят из первой коробки.
Ответ: 1/3


Получается, что для решения задачи достаточно знать формулу полной вероятности и теорему Байеса, а расписав ее, остается просто взять нужные данные из условия.

Про то, как легче интерпретировать теорему Байеса поговорим в следующем посте.

Ниже картинка с расписанным решением 🥺
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥4🆒4😎4👏2
👍73🔥3
#MLbasics
#теорвер

В продолжение к задачке из предыдущего поста.

Теорема Байеса — это по сути способ обновлять вероятность гипотезы, когда появляются новые данные.

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

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


Есть крутое видео с визуализацией и геометрической интерпретацией теоремы Байеса: ссылка
6👍5🤓4
#guide
#MLbasics

Поделюсь полезными ссылками на материалы и вопросы для подготовки к теоретическим собесам в DS/MLE.

Англоязычные ресурсы:
- Подборка бесплатных и платных курсов: курсы
- Вопросы для подготовки (самые популярные): вопросы
- Вопросы посложнее (с ответами): посложнее
- Теоретические заметки: справочник
- Материалы для подготовки (+ ресурсы для Quantitative Researchers): материалы

Русскоязычные ресурсы:
- Учебник от Яндекса: учебник
- Недорогой, но полезный курс по classic ML (от преподавателей с ФКН): курс ML
- Недорогой, но полезный курс по базе DL (от преподавателей с ФКН): курс DL
- Немного базовых вопросов: вопросы
🔥43👍2🤓2
#вопрос_дня
#python

Вопрос с собеса на DL Engineer в российский банк: В чем разница между мультипоточностью и мультипроцессорностью в Python?

Начнем с базы!

Процессор (CPU) - это «железка», физическое устройство, которое выполняет вычисления. Современные процессоры состоят из нескольких ядер, каждое из которых может работать с отдельной своей задачей.

Поток (thread) - это последовательность выполнения инструкций внутри одной программы. Один процесс может иметь несколько потоков, которые делят общую память.

Идем дальше.

Мультипоточность - это запуск нескольких потоков внутри одного процесса. Но! В Python есть GIL (Global Interpreter Lock) — штука, которая не даёт реально выполнять код нескольких потоков одновременно. Поэтому многопоточность эффективна только для задач с I/O (ожидание сети, файлов, API).
Пример:
Мы обучаем модель на большом датасете изображений.
Чтобы не ждать, пока данные последовательно подгрузятся с диска, DataLoader из PyTorch может использовать num_workers > 0. В этом случае потоки параллельно читают файлы, подготавливая тензоры.

train_loader = DataLoader(dataset, batch_size=64, shuffle=True, num_workers=4)


Мультипроцессорность - это запуск нескольких процессов, каждый со своим интерпретатором Python и памятью. Здесь GIL не мешает, и это работает круто для CPU-bound задач (численные расчёты, непосредственно ML и т.д.).
Пример:
Мы запускаем несколько моделей (или несколько экспериментов с разными гиперпараметрами) одновременно. Каждый процесс работает независимо, использует своё ядро CPU и не ограничен GIL.

from multiprocessing import Process

def train_model(config):
# CPU-bound training
...

processes = []
for cfg in configs:
p = Process(
target=train_model,
args=(cfg,)
)
p.start()
processes.append(p)

for p in processes:
p.join()


Читай и запоминай, чтобы не завалить собес 👍
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥5🤓4
#guide
#MLSysDesign

Интервью по ML System Design, наверное, самый сложный этап из всех собеседований. Он сильно зависит от ожиданий интервьюера на данный грейд и может как повысить ваш статус кандидата, так и быстро понизить до джуна или стажера :)

Конечно, есть общие паттерны и подходы к проектированию - не просто так Валерий Бабушкин книжку написал: книга.

Здесь я хотел поделиться видосами, которые стоит посмотреть после изучения теории ML дизайна.

- Прикольное видео про system design в предотвращении банковского фрода: видео.

- Подборка видео Karpov x Валерий Бабушкин с мок собесами и разборами:
Первая часть
Вторая часть
Третья часть

Еще одно видео от Валерия по теории: видео.

DataTalks с Валерием Бабушкиным - есть полезные советы по прохождению: видео.

- Большой публичный собес от Авито: видео.

Скоро разберем одну нетривиальную задачку из дизайна, которую неожиданно дали кандидату на собесе в зарубежный финтех 😰


P.S. Если кто-то может купить за границей бумажную книжку «Machine Learning System Design» Валерия Бабушкина - напишите, буду крайне признателен)
Please open Telegram to view this post
VIEW IN TELEGRAM
5👍5🔥4
#money 💰

Актуальные зарплаты в ML/DS на конец 2025 года в РФ

👶 Junior: ~100 – 200 k → медиана ≈ 130 k
🧑‍💻 Middle: ~150 – 350 k → медиана ≈ 220 k
🧠 Senior: ~200 – 450 k → медиана ≈ 320 k

🔥 ТОП компаний для Middle DS с медианной з/п > 300k:

- Magnit Tech
- Авито
- Cian
- Rutube


*В Москве, оклад в рублях "на руки", октябрь 2025 г.

Источник данных: https://getmatch.ru/salaries/data_science
👍5🤩5🔥4
#MLbasics
#python

Задача на кодинг? 💻

Бывает на собеседованиях в секции решения задач дают совсем не алгос, а что-то МЛное. Это может быть любой базовый алгоритм из классического ML, а может и класс для self-attention.

Как закодить ЛИНЕЙНУЮ РЕГРЕССИЮ

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

Чтобы подобрать оптимальные веса - нам нужна функция потерь. Обычно используется MSE, так как она гладкая и выпуклая -> производная определена во всех точках -> удобно оптимизировать!

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

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

Показал реализацию модели Линейной регрессии и ее оптимизацию градиентным спуском в ноутбуке с комментариями и формулами.

Будет полезно разобраться в коде для собесов в classic ML и даже в DL, так как часто спрашивают, как устроен Adam (модификация градиентного спуска).

Пиши в комментариях, что бы еще добавил в такую реализацию
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥95👍5
#leetcode
#guide


5 типичных ошибок при решении задач с LeetCode


🧠 LeetCode — это не про знание языка программирования. Это тренировка мышления, но почти все совершают одинаковые ошибки, из-за которых прогресс стопорится. Разберём их.

1. Решать задачи "вслепую" без анализа
Написали код, он прошёл тесты — и сразу дальше.
Ошибка: не разобрали, почему решение работает и как его улучшить.
Разбор после каждой задачи: оценка сложности, поиск альтернатив и "что было бы, если...".

2. Фармить количество задач
Многие решают 10 задач в день, чтобы "набить статистику".
Это даёт только иллюзию прогресса.
Лучше 1-2 задачи в день, но с полным пониманием алгоритма (DFS/BFS, two pointers, dynamic programming и т.д.).

3. Игнорировать категории задач
Решать всё подряд - значит не учиться системно.
Работайте по темам: сначала массивы → строки → хеш-таблицы → рекурсия → графы.
С каждой темой учимся узнавать знакомые паттерны.

4. Не объяснять свои решения "вслух"
На собеседовании важен не код, а ход мыслей.
Привыкайте комментировать процесс: "я начинаю с O(n²) решения, а теперь попробую оптимизировать…".

5. Сразу лезть в сложные задачи
Перескакивать с Easy на Hard - путь к выгоранию.
Делайте постепенно: 10 Easy → 5 Medium → 1 Hard.
Фокус на стабильности, а не сложности.

💡 LeetCode - не про количество, а про осознанность.
5👍3🔥3
#MLbasics
#metrics
#python

Пишем метрики ручками Часть 1

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

Прежде чем разбираться в моделях, важно понимать, как мы вообще оцениваем их качество.
Метрики регрессии — это линейка, которой мы измеряем, насколько близко модель предсказывает к реальности.
Ниже — шесть базовых метрик регрессии, которые стоит уметь не только интерпретировать, но и написать с нуля.

1. Root Mean Squared Error (RMSE)

📏 Измеряет насколько сильно в среднем предсказания отличаются от реальных значений, при этом большие ошибки наказываются сильнее.

💡 Особенно подходит, если важно штрафовать крупные промахи, например, при прогнозе цен или спроса.

2. Mean Absolute Error (MAE)

📏 Измеряет среднее отклонение предсказаний от реальных значений, в тех же единицах, что и исходные данные.

💡 Удобно, когда все ошибки одинаково важны — не нужно наказывать большие ошибки сильнее, чем маленькие.

3. Mean Absolute Percentage Error (MAPE)

📏 Измеряет средний процент ошибки относительно истинного значения.

⚠️ Плохо работает, если реальные значения близки к нулю (деление на маленькие числа → огромные проценты). Также она несимметрично оценивает перепрогноз и недопрогноз -> можно посмотреть на SMAPE.

💡 Полезно, когда важно понимать ошибку в процентах, например, «на сколько процентов промахнулся прогноз продаж».

4. Mean Squared Logarithmic Error (MSLE)

📏 Измеряет насколько близки логарифмы предсказаний и реальных значений.

💡 Подходит, когда важна относительная ошибка (во сколько раз промахнулся), а не абсолютная. Например, прогнозы роста, трафика, количества пользователей.

5. R^2(коэффициент детерминации)

📏 Измеряет насколько хорошо модель объясняет изменчивость данных. Грубо говоря, насколько лучше модель, чем просто “среднее значение”.

💡 Хороша, когда хочешь оценить долю объяснённой моделью дисперсии — то есть, насколько хорошо модель “понимает” зависимость между X и Y.

6. Adjusted R^2 (скорректированный коэффициент детерминации)

📏 Измеряет то же, что и R², но с поправкой на количество признаков (фич).

💡 Можно использовать при сравнении моделей с разным числом признаков. Помогает понять, стоит ли усложнение модели своих результатов.

🧭 Главное — не просто подставлять метрику, а понимать, что именно она показывает и в каких единицах измеряет ошибку. Это позволит выбирать правильную метрику под конкретную задачу, а не просто смотреть на все и теряться.


*Картинка взята с сайта loginom.ru
👍43🔥3