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

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

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

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

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

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

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

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

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

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

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