bootg.com »
United States »
Библиотека собеса по Data Science | вопросы с собеседований » Telegram Web
⚠️ В машинном обучении, как в любви: слишком идеальные предсказания – это подозрительно!
Когда модель слишком прилипчива к тренировочным данным, результат оказывается… ну, как в отношениях, когда всё кажется идеальным, но реальность ломает сердце.
❌ Оверфиттинг (Overfitting) – модель так хорошо запомнила тренировочные данные, что на реальных данных начинает путаться.
💔 В любви: «Я выбрал идеального партнёра по профилю, а в жизни выяснилось, что его «идеальность» – всего лишь иллюзия!»
❌ Андерфиттинг (Underfitting) – модель обучена настолько поверхностно, что предсказывает мэтчи случайным образом.
💔 В любви: «Мне нравятся только люди с именем Александр, а всех остальных я даже не замечаю – бедный фильтр!»
❌ Неправильный выбор фичей (Feature Selection Fail) – если модель опирается на неважные признаки, она предсказывает мэтчи хуже случайности.
💔 В любви: «Ты любишь авокадо? Значит, мы созданы друг для друга!» – а потом оказывается, что это вовсе не про важное.
🎯 На вебинаре мы разобрали, как избежать этих ошибок и создать работающую модель для speed dating, которая на самом деле помогает находить любовь! Вчера мы не просто говорили о любви – мы её предсказывали!
🔥 Спасибо всем, кто был с нами и участвовал!
💘 Как же это было?
Если ты пропустил вебинар или хочешь пересмотреть запись – просто перейди по [ссылке] и получи видео 😉
Когда модель слишком прилипчива к тренировочным данным, результат оказывается… ну, как в отношениях, когда всё кажется идеальным, но реальность ломает сердце.
❌ Оверфиттинг (Overfitting) – модель так хорошо запомнила тренировочные данные, что на реальных данных начинает путаться.
💔 В любви: «Я выбрал идеального партнёра по профилю, а в жизни выяснилось, что его «идеальность» – всего лишь иллюзия!»
❌ Андерфиттинг (Underfitting) – модель обучена настолько поверхностно, что предсказывает мэтчи случайным образом.
💔 В любви: «Мне нравятся только люди с именем Александр, а всех остальных я даже не замечаю – бедный фильтр!»
❌ Неправильный выбор фичей (Feature Selection Fail) – если модель опирается на неважные признаки, она предсказывает мэтчи хуже случайности.
💔 В любви: «Ты любишь авокадо? Значит, мы созданы друг для друга!» – а потом оказывается, что это вовсе не про важное.
🎯 На вебинаре мы разобрали, как избежать этих ошибок и создать работающую модель для speed dating, которая на самом деле помогает находить любовь! Вчера мы не просто говорили о любви – мы её предсказывали!
🔥 Спасибо всем, кто был с нами и участвовал!
💘 Как же это было?
Если ты пропустил вебинар или хочешь пересмотреть запись – просто перейди по [ссылке] и получи видео 😉
Почему RMSE и MAE могут давать разную оценку качества модели
RMSE (Root Mean Squared Error) и MAE (Mean Absolute Error) — это две популярные метрики регрессии, но они ведут себя по-разному при наличии выбросов.
🔹 MAE — это средняя абсолютная ошибка, измеряет среднее отклонение предсказаний от истинных значений. Она линейно реагирует на ошибки, то есть один большой выброс не окажет значительного влияния.
🔹 RMSE — это корень из среднеквадратичной ошибки, которая квадратично увеличивает вклад больших ошибок. Это значит, что RMSE сильнее наказывает за крупные выбросы, чем MAE.
📊 Пример:
Если у вас есть предсказания: [2, 3, 4, 5, 100] при истинных значениях [2, 3, 4, 5, 6],
то MAE ≈ 18, а RMSE ≈ 40. RMSE выросло сильнее из-за большого выброса в 100.
RMSE (Root Mean Squared Error) и MAE (Mean Absolute Error) — это две популярные метрики регрессии, но они ведут себя по-разному при наличии выбросов.
🔹 MAE — это средняя абсолютная ошибка, измеряет среднее отклонение предсказаний от истинных значений. Она линейно реагирует на ошибки, то есть один большой выброс не окажет значительного влияния.
🔹 RMSE — это корень из среднеквадратичной ошибки, которая квадратично увеличивает вклад больших ошибок. Это значит, что RMSE сильнее наказывает за крупные выбросы, чем MAE.
📊 Пример:
Если у вас есть предсказания: [2, 3, 4, 5, 100] при истинных значениях [2, 3, 4, 5, 6],
то MAE ≈ 18, а RMSE ≈ 40. RMSE выросло сильнее из-за большого выброса в 100.
❤6
Как работает градиентный бустинг, и в чем его преимущества перед классическим бустингом
Ответ:
Градиентный бустинг (Gradient Boosting) — это ансамблевый метод, в котором слабые модели (обычно деревья решений) обучаются последовательно, и каждая следующая модель корректирует ошибки предыдущей. В отличие от классического бустинга (AdaBoost), градиентный бустинг минимизирует функцию потерь с помощью градиентного спуска.
Как работает:
▪️ Первая модель обучается на исходных данных.
▪️ Далее вычисляется остаточная ошибка (разница между предсказанными и реальными значениями).
▪️ Следующая модель обучается на этой ошибке, пытаясь её минимизировать.
▪️ Процесс повторяется, и все модели комбинируются для финального предсказания.
Ответ:
Градиентный бустинг (Gradient Boosting) — это ансамблевый метод, в котором слабые модели (обычно деревья решений) обучаются последовательно, и каждая следующая модель корректирует ошибки предыдущей. В отличие от классического бустинга (AdaBoost), градиентный бустинг минимизирует функцию потерь с помощью градиентного спуска.
Как работает:
▪️ Первая модель обучается на исходных данных.
▪️ Далее вычисляется остаточная ошибка (разница между предсказанными и реальными значениями).
▪️ Следующая модель обучается на этой ошибке, пытаясь её минимизировать.
▪️ Процесс повторяется, и все модели комбинируются для финального предсказания.
👍5
Что такое трансформеры (Transformers) в машинном обучении, и чем они отличаются от рекуррентных нейронных сетей (RNN)
✔️ Трансформеры — это архитектура нейросетей, основанная на механизме само внимания (self-attention), которая эффективно обрабатывает последовательности данных, такие как текст. Они стали основой моделей NLP, включая BERT и GPT.
Отличия от RNN:
1. Параллелизм — в отличие от RNN, трансформеры могут обрабатывать все токены одновременно, а не последовательно, что ускоряет обучение.
2. Долгосрочные зависимости — механизм само внимания позволяет учитывать контекст из любых частей последовательности, тогда как RNN страдают от проблемы затухающих градиентов.
✔️ Трансформеры — это архитектура нейросетей, основанная на механизме само внимания (self-attention), которая эффективно обрабатывает последовательности данных, такие как текст. Они стали основой моделей NLP, включая BERT и GPT.
Отличия от RNN:
1. Параллелизм — в отличие от RNN, трансформеры могут обрабатывать все токены одновременно, а не последовательно, что ускоряет обучение.
2. Долгосрочные зависимости — механизм само внимания позволяет учитывать контекст из любых частей последовательности, тогда как RNN страдают от проблемы затухающих градиентов.
❤4👍1
Если увеличить объем обучающих данных, всегда ли модель машинного обучения будет работать лучше
Хотя увеличение данных часто улучшает обобщающую способность модели, есть несколько случаев, когда это не дает ожидаемого эффекта:
❗ Шумные или нерелевантные данные — если в новый набор включены некорректные, повторяющиеся или нерелевантные примеры, модель может запутаться и работать хуже.
❗ Неправильная архитектура — если модель недостаточно сложна (например, линейная при нелинейных зависимостях), даже большой объем данных не поможет.
❗ Выборка сдвинута — если новые данные не отражают реальные распределения (например, изображения кошек в наборе данных для собак), модель не улучшится.
Хотя увеличение данных часто улучшает обобщающую способность модели, есть несколько случаев, когда это не дает ожидаемого эффекта:
❗ Шумные или нерелевантные данные — если в новый набор включены некорректные, повторяющиеся или нерелевантные примеры, модель может запутаться и работать хуже.
❗ Неправильная архитектура — если модель недостаточно сложна (например, линейная при нелинейных зависимостях), даже большой объем данных не поможет.
❗ Выборка сдвинута — если новые данные не отражают реальные распределения (например, изображения кошек в наборе данных для собак), модель не улучшится.
😁5❤1
❗Eсли данные для обучения модели нормализованы, всегда ли это улучшит её производительность
Хотя нормализация может помочь многим алгоритмам, особенно тем, которые чувствительны к масштабам данных (например, линейной регрессии или нейросетям), она не всегда приведет к улучшению результатов.
В некоторых случаях, например, когда данные уже находятся в подходящем диапазоне или используются модели, не чувствительные к масштабу (например, деревья решений), нормализация может быть излишней и не улучшит производительность.
Хотя нормализация может помочь многим алгоритмам, особенно тем, которые чувствительны к масштабам данных (например, линейной регрессии или нейросетям), она не всегда приведет к улучшению результатов.
В некоторых случаях, например, когда данные уже находятся в подходящем диапазоне или используются модели, не чувствительные к масштабу (например, деревья решений), нормализация может быть излишней и не улучшит производительность.
❤4
Media is too big
VIEW IN TELEGRAM
Proglib рассказывает про задачу с Литкода в формате рилса
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5😁3❤1
⚠️ Почему метрика Silhouette Score не всегда подходит для оценки кластеризации с кластерами разного размера
Silhouette Score может не давать точную оценку, если кластеры сильно различаются по размеру или форме. Это связано с тем, что метрика предполагает сферическую форму кластеров и одинаковый размер. В случае сильно несбалансированных кластеров или выбросов, она может давать ложные результаты, указывая на хорошую кластеризацию, когда это не так.
👍 Альтернатива: Для таких случаев лучше использовать Davies-Bouldin Index или Adjusted Rand Index (ARI).
Silhouette Score может не давать точную оценку, если кластеры сильно различаются по размеру или форме. Это связано с тем, что метрика предполагает сферическую форму кластеров и одинаковый размер. В случае сильно несбалансированных кластеров или выбросов, она может давать ложные результаты, указывая на хорошую кластеризацию, когда это не так.
👍 Альтернатива: Для таких случаев лучше использовать Davies-Bouldin Index или Adjusted Rand Index (ARI).
❤5
❗Вакансии «Библиотеки программиста» — ждем вас в команде!
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
Мы постоянно растем и развиваемся, поэтому создали отдельную страницу, на которой будут размещены наши актуальные вакансии. Сейчас мы ищем:
👉контент-менеджеров для ведения телеграм-каналов
Подробности тут
Мы предлагаем частичную занятость и полностью удаленный формат работы — можно совмещать с основной и находиться в любом месте🌴
Ждем ваших откликов 👾
job.proglib.io
Вакансии в медиа «Библиотека программиста»
Количество проектов в редакции постоянно растет, так что нам всегда нужны специалисты
Вычисление важности признаков: когда она вводит в заблуждение
Вычисление важности признаков (Permutation Feature Importance) — популярный метод оценки вклада признаков в модель. Однако при наличии коррелированных признаков он может давать искаженные результаты.
🔸 Разделение важности: если два признака (A и B) сильно коррелируют, перестановка одного из них не снизит качество модели, так как второй содержит ту же информацию. Итог — заниженная важность.
🔸 Ложная высокая важность: малозначимый, но коррелированный с важным признак может получить высокий вклад просто из-за связи с важным признаком.
Что делать?
✅ Использовать SHAP, который корректно распределяет вклад.
✅ Применять PCA или регуляризацию (Lasso) для снижения корреляции.
✅ Проверять важность через drop-column importance.
Вычисление важности признаков (Permutation Feature Importance) — популярный метод оценки вклада признаков в модель. Однако при наличии коррелированных признаков он может давать искаженные результаты.
🔸 Разделение важности: если два признака (A и B) сильно коррелируют, перестановка одного из них не снизит качество модели, так как второй содержит ту же информацию. Итог — заниженная важность.
🔸 Ложная высокая важность: малозначимый, но коррелированный с важным признак может получить высокий вклад просто из-за связи с важным признаком.
Что делать?
✅ Использовать SHAP, который корректно распределяет вклад.
✅ Применять PCA или регуляризацию (Lasso) для снижения корреляции.
✅ Проверять важность через drop-column importance.
👍3❤1
Совет на 2025-й — будьте осторожнее с выбором работы.
IT-рынок штормит: массовые сокращения, заморозка найма, снижение зарплат. В такое время особенно важно отличать стоящие офферы от проходных.
Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦♂️
Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:
— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер
Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.
Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
IT-рынок штормит: массовые сокращения, заморозка найма, снижение зарплат. В такое время особенно важно отличать стоящие офферы от проходных.
Знакомо? Открываешь вакансию, а там: «Ищем middle-разработчика с опытом 10 лет, знанием 15 языков и готовностью работать за печеньки. Офис в Челябинске, релокация за ваш счет» 🤦♂️
Чтобы не тратить время на сотни сомнительных предложений, подпишитесь на IT Job Hub. Там мы отфильтровываем весь мусор и публикуем только избранные вакансии в стабильных компаниях:
— Зарплаты на уровне рынка, а не на уровне голодного студента
— Никаких «мы молодая и дружная семья» — только адекватные условия
— Проверенные работодатели, а не стартапы из сомнительных сфер
Вакансии удобно разбиты по тегам: #python #java #go #data #devops и по другим направлениям. Без воды и лишнего спама — только проверенные вакансии в знакомых компаниях.
Подписывайтесь, если не хотите упустить работу мечты → @proglib_jobs
❤1😁1
Forwarded from Proglib.academy | IT-курсы
Big Data и Data Science применяются не только в IT-гигантах, но и в некоммерческом секторе, где технологии анализа данных помогают оптимизировать работу организаций, собирать средства и оказывать помощь эффективнее.
▪️ Как некоммерческие организации используют Data Science.
▪️ Оптимизация фондов и финансирования с помощью аналитики.
▪️ Роль прогнозных моделей в благотворительности.
▪️ Кейсы Amnesty International, Khan Academy и DataKind.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤1
Градиентный бустинг: почему слишком много деревьев ухудшает модель
🔸 Переобучение (overfitting) — каждое новое дерево минимизирует ошибку, но если деревьев слишком много, модель начинает подстраиваться под шум данных, теряя обобщающую способность.
🔸 Снижение прироста качества — на первых итерациях каждое дерево значительно улучшает предсказания. Однако после определенного количества итераций добавление новых деревьев практически не влияет на качество.
🔸 Рост вычислительной сложности — больше деревьев → выше время инференса и потребление памяти.
🔸 Переобучение (overfitting) — каждое новое дерево минимизирует ошибку, но если деревьев слишком много, модель начинает подстраиваться под шум данных, теряя обобщающую способность.
🔸 Снижение прироста качества — на первых итерациях каждое дерево значительно улучшает предсказания. Однако после определенного количества итераций добавление новых деревьев практически не влияет на качество.
🔸 Рост вычислительной сложности — больше деревьев → выше время инференса и потребление памяти.
❤5👍1
Проверьте свои знания, ответив на 8 вопросов – https://proglib.io/w/b72093d4
🧐 Кому подойдет?
Разработчикам, которые знают любой объектно-ориентированный язык программирования и хотят углубиться в архитектурные паттерны.
🎮 Как проходит обучение?
В течение всего интенсива вы будете создавать игру «Звездные войны» и применять ключевые архитектурные паттерны. В процессе изучите:
– Как строить гибкую архитектуру, которая не замедляет разработку
– Как применять IoC-контейнеры и писать модульные тесты
– Как использовать SOLID за пределами ООП
– Как внедрять CI/CD и снижать технический долг
👉 Подробная программа обучения
А по промокоду
Please open Telegram to view this post
VIEW IN TELEGRAM
Почему AUC-ROC может вводить в заблуждение при несбалансированных данных
🔸 Не учитывает реальное соотношение классов — AUC-ROC показывает, насколько хорошо модель различает классы, но не отражает точность предсказаний для каждого из них. Если 99% данных — класс 0, модель может почти всегда предсказывать 0 и все равно получить высокий AUC.
🔸 Проблемы с интерпретацией — высокая AUC-ROC не всегда означает, что модель полезна. Например, если интересен именно редкий класс, важно понимать precision, recall и F1-score.
🔸 Не учитывает реальное соотношение классов — AUC-ROC показывает, насколько хорошо модель различает классы, но не отражает точность предсказаний для каждого из них. Если 99% данных — класс 0, модель может почти всегда предсказывать 0 и все равно получить высокий AUC.
🔸 Проблемы с интерпретацией — высокая AUC-ROC не всегда означает, что модель полезна. Например, если интересен именно редкий класс, важно понимать precision, recall и F1-score.
❤6❤🔥1😢1
Как улучшить производительность модели с помощью отбора признаков
Отбор признаков (feature selection) — это процесс выбора наиболее значимых признаков для построения модели. Это помогает улучшить её производительность и снизить сложность.
❗ Слишком много признаков может привести к переобучению и увеличению времени обучения.
❗ Неинформативные или шумные признаки могут ухудшить результаты модели.
🔧 Методы отбора признаков:
- Использование методов фильтрации (например, корреляция, тесты на значимость).
- Применение методов обертывания (например, рекурсивный отбор признаков).
- Использование методов вложений (например, Lasso или дерево решений).
Отбор признаков (feature selection) — это процесс выбора наиболее значимых признаков для построения модели. Это помогает улучшить её производительность и снизить сложность.
❗ Слишком много признаков может привести к переобучению и увеличению времени обучения.
❗ Неинформативные или шумные признаки могут ухудшить результаты модели.
🔧 Методы отбора признаков:
- Использование методов фильтрации (например, корреляция, тесты на значимость).
- Применение методов обертывания (например, рекурсивный отбор признаков).
- Использование методов вложений (например, Lasso или дерево решений).
❤2👍1
Почему корреляция не означает причинно-следственную связь
В анализе данных часто встречаются коррелирующие признаки, но это не значит, что один из них вызывает другой.
⚠️ Пример ловушки:
В жаркие дни продажи мороженого и количество утоплений растут одновременно. Их корреляция может быть высокой, но одно не вызывает другое — причиной является погода.
🔍 Как проверить причинность?
✅ Использовать эксперименты (A/B-тестирование).
✅ Применять каузальный анализ (например, метод двойных разностей).
✅ Изучать графовые модели зависимостей.
В анализе данных часто встречаются коррелирующие признаки, но это не значит, что один из них вызывает другой.
⚠️ Пример ловушки:
В жаркие дни продажи мороженого и количество утоплений растут одновременно. Их корреляция может быть высокой, но одно не вызывает другое — причиной является погода.
🔍 Как проверить причинность?
✅ Использовать эксперименты (A/B-тестирование).
✅ Применять каузальный анализ (например, метод двойных разностей).
✅ Изучать графовые модели зависимостей.
❤6
🤔 Основы математики в Machine Learning / Deep Learning
🗓 6 марта приглашаем вас на прямой эфир, где мы подробно разберем ряд Тейлора, собственные векторы и другие ключевые понятия в ML.
(ссылка)
🌟 Спикер: *Мария Горденко* – Старший преподаватель ФКН НИУ ВШЭ, НИТУ МИСИС, аспирант департамента анализа данных и искусственного интеллекта ФКН НИУ ВШЭ, а также преподаватель на курсе Алгоритмы и структуры данных в proglib academy.
Место работы: Инженер-программист, ведущий эксперт НИУ ВШЭ, цифровой ассистент и цифровой консультант НИУ ВШЭ.
😮 На вебинаре вы узнаете:
🔵 Теорию вероятностей: обсудим случайные величины, вероятность, математическое ожидание и дисперсию.
🔵 Линейную алгебру: изучим векторы, матрицы, собственные векторы и собственные значения.
🔵 Математический анализ: разберем производные и разложение функций в ряд Тейлора.
🔵 Практику: применим полученные знания на реальных кейсах из области Machine Learning и Deep Learning.
🎯 Почему это важно?
Понимание математических основ помогает глубже разобраться в работающих под капотом алгоритмах ML/DL и эффективно применять их на практике.
👉 Присоединяйтесь к нам и совершенствуйте свои навыки в машинном обучении!
📌 Регистрация по ссылке: https://proglib.io/w/98cb734d
🗓 6 марта приглашаем вас на прямой эфир, где мы подробно разберем ряд Тейлора, собственные векторы и другие ключевые понятия в ML.
(ссылка)
🌟 Спикер: *Мария Горденко* – Старший преподаватель ФКН НИУ ВШЭ, НИТУ МИСИС, аспирант департамента анализа данных и искусственного интеллекта ФКН НИУ ВШЭ, а также преподаватель на курсе Алгоритмы и структуры данных в proglib academy.
Место работы: Инженер-программист, ведущий эксперт НИУ ВШЭ, цифровой ассистент и цифровой консультант НИУ ВШЭ.
😮 На вебинаре вы узнаете:
🔵 Теорию вероятностей: обсудим случайные величины, вероятность, математическое ожидание и дисперсию.
🔵 Линейную алгебру: изучим векторы, матрицы, собственные векторы и собственные значения.
🔵 Математический анализ: разберем производные и разложение функций в ряд Тейлора.
🔵 Практику: применим полученные знания на реальных кейсах из области Machine Learning и Deep Learning.
🎯 Почему это важно?
Понимание математических основ помогает глубже разобраться в работающих под капотом алгоритмах ML/DL и эффективно применять их на практике.
👉 Присоединяйтесь к нам и совершенствуйте свои навыки в машинном обучении!
📌 Регистрация по ссылке: https://proglib.io/w/98cb734d
🔥1
Почему среднее значение не всегда отражает суть данных
Среднее (mean) — одна из самых распространённых метрик в анализе данных, но его использование может привести к неверным выводам.
⚠️ Когда среднее вводит в заблуждение?
1. Выбросы сильно искажают результат (например, средняя зарплата в компании с одним миллиардером).
2. Смещение распределения — в асимметричных данных среднее может не отражать «типичное» значение.
3. Категориальные данные — нельзя усреднять, например, номера телефонов или географические координаты.
🔍 Что делать?
✅ Использовать медиану для устойчивости к выбросам.
✅ Смотреть на разброс данных (стандартное отклонение, IQR).
✅ Визуализировать распределение, а не полагаться только на одно число.
Среднее (mean) — одна из самых распространённых метрик в анализе данных, но его использование может привести к неверным выводам.
⚠️ Когда среднее вводит в заблуждение?
1. Выбросы сильно искажают результат (например, средняя зарплата в компании с одним миллиардером).
2. Смещение распределения — в асимметричных данных среднее может не отражать «типичное» значение.
3. Категориальные данные — нельзя усреднять, например, номера телефонов или географические координаты.
🔍 Что делать?
✅ Использовать медиану для устойчивости к выбросам.
✅ Смотреть на разброс данных (стандартное отклонение, IQR).
✅ Визуализировать распределение, а не полагаться только на одно число.
❤4👍1
Forwarded from Библиотека питониста | Python, Django, Flask
💾 10 способов работы с большими файлами в Python, о которых ты не знал
Годнота для всех, кто работает с данными. Статья раскрывает разные подходы к обработке больших файлов — от простых итераторов до распределенных вычислений.
👍 Сохраняй себе, точно пригодится в работе: https://proglib.io/sh/VOcgo7w0W1
Годнота для всех, кто работает с данными. Статья раскрывает разные подходы к обработке больших файлов — от простых итераторов до распределенных вычислений.
👍 Сохраняй себе, точно пригодится в работе: https://proglib.io/sh/VOcgo7w0W1