ПрактИИкум
СтатистикаПо всем вопросам (в том числе и по поводу рекламы) обращайтесь к @pypros Редактор: @ya_blinchik Главред: @dadlnside канал: https://t.me/prakta_AI чат: t.me/prakta_AI_chat Канал по проге: @prakta_inf Канал по олмату: @prakta_bvi Для студентов: @praaastuda
- Последний пост
- 11 авг.
- Последнее чтение
- 12 авг.
- Постов за неделю
- 3
- Всего постов
- 20
- Тип
- открытый
- Язык
- русский
- В каталоге с
- 12 авг.
- 1/24сутки в ленте
- 125
- 1/48двое суток
- 143
- 1/72трое суток
- 154
Оценка по просмотрам недавних постов: пост набирает почти всё за первые сутки.
Посты
видео или голосовое, без подписи
видео или голосовое, без подписи
Условие IOI — первый день Лидерборд: https://ranking.ioi2026.uz/
⚡️⚡️⚡️ РОССИЯ ЗАБИРАЕТ IOAI 2026 Российская сборная третий год подряд становится абсолютным чемпионом Международной олимпиады по искусственному интеллекту (IOAI). В этот раз наша сборная забрала 7 золотых и 1 бронзовую медаль: 🥇 Артём Горохов — Санкт-Петербург, ФМЛ №239 (абсолютный победитель IOAI 2026) 🥇 Михаил Вершинин — Новосибирск 🥇 Елисей Кирпиченко — Санкт-Петербург 🥇 Кирилл Лабзин — Сириус 🥇 Александр Поваров — Москва, Летово 🥇 Никита Пудовкин — Волгоград 🥇 Семён Родионов — Новосибирск 🥉 Алексей Колегов — Ижевск, школа ЦПМ. Всего в этом году участвовало 400+ школьников из 100+ стран. Россия заняла первое место, на втором и третьем - Китай и Польша. Напоминаем, что IOAI проводится всего третий раз, и все три раза российская сборная становилась абсолютным чемпионом :) Поздравляем ребят! 🎉
Давайте поговорим о роли нейросетей в математике уже сейчас на примере нескольких кейсов, что я смог найти (да, некоторые очень нашумевшие и вам известные, но, надеюсь, не все): 1. Гипотеза Якобиана (1939г.) На протяжении 87 лет считалась верной, но ИИ нашёл контрпример, который её опровергает для случая трёх и более переменных (частный случай до сих пор открытая проблема). Самая важная гипотеза, что была опровергнута при помощи ИИ (и, пожалуй, единственная действительно значимая). Значимость человека тут, пожалуй, очень велика. 2. Гипотеза Диница—Гарга—Гоеманса (1999г.) Она также была опровергнута при помощи подходящего контрпримера, но практически без отсутствия наводок со стороны человека. Эта гипотеза уже гораздо менее интересная, но, пожалуй, самое важное, что опровергал ИИ почти без вмешательства человека. 3. Двойное покрытие циклами (1973г.) Роль человека тут гигантская, он очень сильно вмешивался в процесс и его можно по праву считать главным решателем. В действительности, решение оказалось не особо-то и идейным (оно повторяло идеи, которые были выдвинуты до этого, просто умело ими пожонглировав). Пожалуй, самый громкий случай, когда ИИ что-то доказал, а не опроверг. Впрочем, он не особо удивляет, как по мне... 4. Задачи Эрдёша и DeepMind. Скорее фанфакт, что нельзя верить новостям: нейронка, по мнению DeepMind решила 9 гипотез, а по факту не более 4 (точнее сказать не могу, т.к. не нашёл подробной инфы по ним) — большинство задач уже были солвнуты до этого людьми, поэтому подобная новость это по большей части хайп (скорее всего, намеренный) 5. Формализация Великой Теоремы Ферма. Не самое очевидное применение ИИ (но, кстати, приходившее мне на ум). Заключается оно в том, чтобы переписать решения математиков на язык формальной проверки Lean. И да, это очень муторно и неинтересно, поэтому использование нейросетей для этих целей это очень интересная темка, которая уже сейчас постепенно реализуется. В частности, вот, как и написано в заголовке, формализовали ВТФ таким образом.
Приёмная кампания подходит к концу Сегодня последний день приёма документов для зачисления в ВУЗы. В каких-то регионах приём документов уже завершён, поэтому для тех, у кого осталось < 2 часов: 1. Проверьте свои заявления на госуслугах 2. Проверьте, чтобы вы были в списках подавших заявление на сайтах своего ВУЗа и на госуслугах 3. Проверьте, что вы подгрузили все свои достижения, аттестат, баллы за ЕГЭ, олимпиады, выбрали нужные направления и запасные ВУЗы Далее начинаются важные этапы: - 27 июля — публикация конкурсных списков. - 1 августа (до 12:00 по московскому времени) — последний день, чтобы подать согласие на зачисление на приоритетном этапе (для льготников, олимпиадников, целевиков). - 3 августа — публикация приказов о зачислении на приоритетном этапе. В этот день действует «день тишины»: отозвать согласие или подать новое уже нельзя. День тишины действует ДЛЯ ВСЕХ - 5 августа (до 12:00 по московскому времени) — последний день для согласия на зачисление на основном этапе (для тех, кто идёт по общему конкурсу, без льгот). - 7 августа — публикация приказов о зачислении на основном этапе. Снова «день тишины». - С 9 августа — если после основного этапа остались бюджетные места, открывается дополнительный этап. Согласие нужно подать до 12:00 9 августа, а приказ о зачислении выйдет 11 августа. Справка: день "тишины" - это период, в течение которого поступающие не могут вносить изменения в свои заявления о приёме и согласии на зачисление. Кто куда подал уже? Хвастайтесь в комментариях!😎
🧑💻7.Пример кода import numpy as np from sklearn.ensemble import RandomForestClassifier Сама модель – случайный лес для классификации. from sklearn.datasets import make_classification Генератор синтетических данных. Принимает параметры (число объектов, признаков, информативных, избыточных) и выдаёт `X, y from sklearn.model_selection import train_test_split - `train_test_split` – разбиение на обучающую и тестовую выборки. - `cross_val_score` – импортирована, но не используется (можно удалить). from sklearn.inspection import permutation_importance Метод «перестановочной важности» – мы случайно перемешиваем значения одного признака и смотрим, насколько упало качество модели. Это оценка важности. X, y = make_classification( n_samples=2000, # 2000 объектов n_features=20, # всего 20 признаков n_informative=10, # 10 признаков реально влияют на ответ n_redundant=3, # 3 признака = комбинации информативных (избыточные) random_state=42 # для воспроизводимости ) Возвращает: - `X` – матрица размером `(2000, 20)` (числа с плавающей точкой), - `y` – столбец из 0 и 1 (бинарная классификация). Из 20 признаков только первые 10 – «полезные», остальные 7 – случайный шум. X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, # 20% на тест = 400 объектов random_state=42 # фиксируем разбиение ) - `X_train.shape` → `(1600, 20)` – обучающая выборка. - `X_test.shape` → `(400, 20)` – тестовая. rf = RandomForestClassifier( n_estimators=300, # 300 деревьев max_features='sqrt', # в каждом узле смотрим √20 ≈ 4-5 признаков min_samples_leaf=1, # лист может содержать 1 объект (деревья глубокие) oob_score=True, # считать out-of-bag точность random_state=42, # всё воспроизводимо n_jobs=-1 # использовать все ядра процессора ) rf.fit(X_train, y_train) Строит лес за доли секунды. Внутри: - создаются бутстрап-выборки (1600 объектов с повторениями), - для каждого узла случайно выбираются 4-5 признаков и лучший порог, - параллельно обучаются все 300 деревьев, - вычисляется OOB-оценка на тех объектах, которые не попали в бутстрап для каждого дерева. print(f"Test accuracy: {rf.score(X_test, y_test):.4f}") Выводит: Test accuracy: 0.9400 importances_mdi = rf.feature_importances_ indices = np.argsort(importances_mdi)[::-1] print("Top-5 признаков по MDI:") for i in indices[:5]: print(f" Признак {i}: {importances_mdi[i]:.4f}") Важность по уменьшению Gini impurity (MDI). Сортировка по убыванию. Вывод: Top-5 признаков по MDI: Признак 0: 0.1532 Признак 3: 0.1139 ... Самый важный – признак 0 (первый из информативных), за ним 3, 9, 6, 2. Все они из первой десятки – логично. perm_importance = permutation_importance( rf, X_test, y_test, n_repeats=10, # 10 перемешиваний для каждого признака random_state=42 ) sorted_idx = perm_importance.importances_mean.argsort()[::-1] print("Top-5 признаков по Permutation Importance:") for i in sorted_idx[:5]: print(f" Признак {i}: {perm_importance.importances_mean[i]:.4f} " f"+/- {perm_importance.importances_std[i]:.4f}") Перестановочная важность: насколько падает точность, когда признак «испорчен» случайным шумом. Чем больше падение, тем важнее признак. Вывод: Top-5 признаков по Permutation Importance: Признак 0: 0.0950 +/- 0.0093 Признак 3: 0.0665 +/- 0.0089 ... 🏁 8. Резюме Случайный лес — один из самых мощных и дружелюбных алгоритмов машинного обучения. Он: - Сам справляется с нелинейностью и взаимодействиями, - Не требует масштабирования, - Устойчив к шуму и выбросам, - Позволяет оценить важность признаков, - Крайне редко переобучается.
⚙️ 6. Гиперпараметры и их настройка 1. `n_estimators` (количество деревьев, B). Чем больше, тем лучше качество и стабильнее результат — до определённого предела. Ошибка OOB или тестовая ошибка выходит на плато. Обычно ставят 100–500. Для больших данных можно 1000, но выигрыш мизерный, а время растёт линейно. *Подбираем:* строим график ошибки от числа деревьев, ищем колено. 2. `max_features` (число признаков для разбиения в узле). - Классификация: sqrt(p) — по умолчанию в sklearn, хороший выбор. - Регрессия: p/3 или sqrt(p). - Можно пробовать log2(p), None (т.е. все признаки — тогда RF вырождается в bagged деревья). Чем меньше max_features, тем меньше корреляция между деревьями, но и каждое дерево слабее (выше bias). Нужен баланс. Подбираем: по сетке, ориентируясь на OOB/валидацию. 3. `max_depth`, `min_samples_split`, `min_samples_leaf` — ограничения на рост деревьев. По умолчанию деревья растут до чистоты (или пока min_samples_split=2). Но это может привести к гигантским деревьям и перерасходу памяти. Разумно слегка ограничить: - max_depth=10-30 (или None). - min_samples_leaf=1-5 (чтобы листья не были микроскопическими). На практике RF с полными деревьями (без ограничений) часто работает хорошо, но если данных мало или шумные признаки — ограничение улучшает обобщение. Подбираем: кросс-валидацией. 4. `max_samples` (размер бутстреп-выборки). По умолчанию = N (столько же, сколько объектов). Можно уменьшить, если данных очень много, чтобы ускорить обучение. 5. `bootstrap`: если False, используется вся выборка для каждого дерева (тогда OOB недоступен, и дисперсия снижается только за счёт случайных признаков). Обычно оставляют True. 6. `class_weight`: для несбалансированных классов можно указать 'balanced' (автоматический вес обратно пропорционально частоте) или словарь. Полезно, если редкий класс важен. 7. `random_state`: для воспроизводимости.
Порог 60 - Левая (≤60): {50} → [1] → Gini=0 - Правая (>60): {70,90,90} → [0,1,1] → Gini = 1 - (2/3)² - (1/3)² = 4/9 ≈ 0.444 - Gini_w = (1/4)*0 + (3/4)*0.444 = 0.333 - Прирост = 0.375 – 0.333 = 0.042 [18.07.2026 00:42] IT: Порог 80 - Левая (≤80): {50,70} → [1,0] → Gini = 1 - (1/2)² - (1/2)² = 0.5 - Правая (>80): {90,90} → [1,1] → Gini=0 - Gini_w = (2/4)*0.5 + (2/4)*0 = 0.25 - Прирост = 0.375 – 0.25 = 0.125 ✅ Выбираем порог 80. - Левый внук (≤80): дома (50,3,1) и (70,8,0) → 2 объекта, Gini=0.5. - Правый внук (>80): дома 4,4 → лист 1. 🔸 Узел с площадью ≤80 (2 объекта: (50,3,1) и (70,8,0)) Gini=0.5. Случайно выбран признак: Этаж. Значения: 3, 8. Порог: 5.5. - Левая (≤5.5): (50,3,1) → лист 1. - Правая (>5.5): (70,8,0) → лист 0. Прирост = 0.5 – 0 = 0.5(идеальный сплит). Итоговая структура Дерева 2: Этаж ≤ 2? ├── Да → лист: 0 └── Нет → Площадь ≤ 80? ├── Да → Этаж ≤ 5.5? │ ├── Да → лист: 1 │ └── Нет → лист: 0 └── Нет → лист: 1 4. Построение Дерева 3 Бутстреп-выборка: 6,5,2,1,1,1 Данные: | Площадь | Этаж | Продался | |---------|------|----------| | 70 | 8 | 0 | | 45 | 2 | 0 | | 80 | 7 | 1 | | 50 | 3 | 1 | | 50 | 3 | 1 | | 50 | 3 | 1 | Метки: 0,0,1,1,1,1 → 4 Да, 2 Нет. Gini_корень = 1 - (4/6)² - (2/6)² = 16/36 ≈ 0.4444 🔸 Случайно выбран признак: Площадь Сортируем: 45 (0), 50 (1), 50 (1), 50 (1), 70 (0), 80 (1). Пороги: 47.5, 60, 75. Порог 47.5 - Левая (≤47.5): {45} → [0] → Gini=0 - Правая (>47.5): {50,50,50,70,80} → [1,1,1,0,1] → 4 Да, 1 Нет Gini_пр = 1 - (4/5)² - (1/5)² = 8/25 = 0.32 - Gini_w = (1/6)*0 + (5/6)*0.32 ≈ 0.2667 - Прирост = 0.4444 – 0.2667 = 0.1777 ✅ ... Лучший порог: 47.5. Разбиваем: - Левый ребёнок (≤47.5): дом 5 → лист 0. - Правый (>47.5): 5 объектов (50,50,50,70,80) → метки 1,1,1,0,1, Gini=0.32. 🔸 Правый узел (5 объектов, площадь >47.5) Gini_узла = 0.32. Случайно выбран признак: Этаж. Значения этажа: 3 (трижды), 8 (один), 7 (один). Сортируем: 3,3,3,7,8. Пороги: 5, 7.5. Порог 5 - Левая (≤5): {3,3,3} → метки [1,1,1] → Gini=0 - Правая (>5): {7,8} → метки [1,0] → Gini = 0.5 - Gini_w = (3/5)*0 + (2/5)*0.5 = 0.2 - Прирост = 0.32 – 0.2 = 0.12 Порог 7.5 - Левая (≤7.5): {3,3,3,7} → метки [1,1,1,1] → Gini=0 - Правая (>7.5): {8} → метка [0] → Gini=0 - Gini_w = 0 - Прирост = 0.32 – 0 = 0.32✅ Выбираем порог 7.5. - Левый внук (≤7.5): дома с этажами 3,3,3,7 (все «Да») → лист 1. - Правый внук (>7.5): дом 6 (70,8,0) → лист 0. Итог Дерева 3: Площадь ≤ 47.5? ├── Да → лист: 0 └── Нет → Этаж ≤ 7.5? ├── Да → лист: 1 └── Нет → лист: 0 5. Предсказание для нового дома (60 м², этаж 5) Прогоняем новый объект через каждое дерево. - Дерево 1: Площадь 60 > 47.5 → правая ветвь → лист 1 (Да). - Дерево 2: Этаж 5 > 2 → направо. Площадь 60 ≤ 80 → налево. Этаж 5 ≤ 5.5 → налево → лист 1 (Да). - Дерево 3: Площадь 60 > 47.5 → направо. Этаж 5 ≤ 7.5 → налево → лист 1(Да). Голосование: 3 «Да», 0 «Нет». Среднее = (1.0 + 1.0 + 1.0) / 3 = 1.0 По умолчанию — 0.5 (50%). Вероятность ≥ 0.5 → предсказание «Продастся» (1) Вероятность < 0.5 → предсказание «Не продастся» (0) Итог: Продастся ✅ Вот ваш абзац, расширенный с учётом регрессии (можно вставить целиком): --- Голосование: 3 «Да», 0 «Нет». Среднее = (1.0 + 1.0 + 1.0) / 3 = 1.0 По умолчанию — 0.5 (50%). Вероятность ≥ 0.5 → предсказание «Продастся» (1) Вероятность < 0.5 → предсказание «Не продастся» (0) Итог: Продастся ✅ Если бы это была задача регрессии (например, предсказание цены дома), то каждое дерево выдавало бы число, а итогом было бы просто среднее арифметическое этих чисел — без порога 0.5. Порог сравнения используется только в классификации для перевода вероятности в бинарный ответ. В регрессии ответом является само среднее значение, и если нужно получить категориальный вывод (например, «дорогой/дешёвый»), порог задаётся аналитиком отдельно, уже после расчёта средней цены.
🏠5.Данные | Дом | Площадь (м²) | Этаж | Продался? | |-----|--------------|------|-----------| | 1 | 50 | 3 | Да (1) | | 2 | 80 | 7 | Да (1) | | 3 | 30 | 1 | Нет (0) | | 4 | 90 | 10 | Да (1) | | 5 | 45 | 2 | Нет (0) | | 6 | 70 | 8 | Нет (0) | Задача: предсказать, продастся ли дом с площадью 60 м² и этажом 5 Строим ансамбль из трёх деревьев (n_estimators=3), max_features=1 (в узле рассматривается только один случайный признак), bootstrap=True, min_samples_leaf=1 1. Генерация бутстреп-выборок (случайный выбор с возвращением) Исходная выборка: 6 объектов. Для каждого дерева генерируем новую выборку размером 6, выбирая объекты случайно с возвращением. - Дерево 1: выпали дома 4, 1, 2, 2, 5, 3 Объекты: (90,10,1), (50,3,1), (80,7,1), (80,7,1), (45,2,0), (30,1,0) Пропущен дом 6 (будет OOB для этого дерева). - Дерево 2: дома 3, 3, 6, 1, 4, 4 Объекты: (30,1,0), (30,1,0), (70,8,0), (50,3,1), (90,10,1), (90,10,1) Пропущены дома 2 и 5. ... Каждое дерево будет строиться полностью (до чистоты листьев или одного объекта в листе). При построении узла случайно выбирается один признак из двух (Площадь или Этаж), и для него ищется наилучший порог по критерию Gini impurity. > Напоминание: > Gini = 1 - Σ (p_k)² > При разбиении: > Gini_w = (N_л / N) * Gini_л + (N_пр / N) * Gini_пр > Прирост = Gini_родителя - Gini_w 2. Построение Дерева 1 Бутстреп-выборка: 4,1,2,2,5,3 Объекты и метки: | Площадь | Этаж | Продался | |---------|------|----------| | 90 | 10 | 1 | | 50 | 3 | 1 | | 80 | 7 | 1 | | 80 | 7 | 1 | | 45 | 2 | 0 | | 30 | 1 | 0 | Корень (6 объектов): Метки: 1,1,1,1,0,0 → 4 Да, 2 Нет Gini_корень = 1 - (4/6)² - (2/6)² = 1 - 16/36 - 4/36 = 16/36 ≈ 0.4444 🔸 Случайно выбран признак: Площадь Сортируем по площади: 30, 45, 50, 80, 80, 90. Возможные пороги: 37.5, 47.5, 65, 85. 📉 Порог 37.5 - Левая часть (≤37.5): {30} → метка [0] → Gini=0 - Правая (>37.5): {45,50,80,80,90} → метки [0,1,1,1,1] → 4 Да, 1 Нет Gini_пр = 1 - (4/5)² - (1/5)² = 1 - 16/25 - 1/25 = 8/25 = 0.32 - Gini_w = (1/6)*0 + (5/6)*0.32 ≈ 0.2667 - Прирост = 0.4444 – 0.2667 = 0.1777 📉Порог 47.5 - Левая (≤47.5): {30,45} → [0,0] → Gini=0 - Правая (>47.5): {50,80,80,90} → [1,1,1,1] → Gini=0 - Gini_w = 0 - Прирост = 0.4444 – 0 = 0.4444 ✅ ... Лучший порог: 47.5 (прирост 0.4444). Разбиваем корень: - Левое поддерево (≤47.5): дома 3 и 5 → оба «Нет» → лист с классом 0 - Правое поддерево (>47.5): дома 1,2,2,4 → все «Да» → лист с классом 1 Дерево 1 готово — один сплит, максимальная чистота. --- 3. Построение Дерева 2 Бутстреп-выборка: 3,3,6,1,4,4 Данные: | Площадь | Этаж | Продался | |---------|------|----------| | 30 | 1 | 0 | | 30 | 1 | 0 | | 70 | 8 | 0 | | 50 | 3 | 1 | | 90 | 10 | 1 | | 90 | 10 | 1 | Метки: 0,0,0,1,1,1 → 3 Да, 3 Нет. Gini_корень = 1 - (3/6)² - (3/6)² = 0.5 🔸 Случайно выбран признак: Этаж Значения этажа: 1 (дважды), 3 (один), 8 (один), 10 (дважды). Сортируем: 1, 1, 3, 8, 10, 10. Возможные пороги: 2, 5.5, 9. 📉 Порог 2 - Левая (≤2): {1,1} → метки [0,0] → Gini=0 - Правая (>2): {3,8,10,10} → метки [1,0,1,1] → 3 Да, 1 Нет Gini_пр = 1 - (3/4)² - (1/4)² = 1 - 9/16 - 1/16 = 6/16 = 0.375 - Gini_w = (2/6)*0 + (4/6)*0.375 = 0.25 - Прирост = 0.5 – 0.25 = 0.25 ... Максимальный прирост 0.25 у порогов 2 и 9. Выбираем первый — порог 2 (Этаж ≤ 2). Разбиваем: - Левый ребёнок (≤2): два дома 3 → лист 0. - Правый ребёнок (>2): дома 1,6,4,4 (метки 1,0,1,1) → 4 объекта, Gini=0.375. 🔸 Правый узел (4 объекта: этаж >2) Метки: 1,0,1,1 → 3 Да, 1 Нет. Случайно выбран признак: Площадь. Сортируем по площади: 50 (1), 70 (0), 90 (1), 90 (1). Пороги: 60, 80.
🧠 4. Почему это работает: Bias-Variance разбор - Смещение (bias): отдельное дерево — модель с низким смещением (гибкая, может идеально подогнаться под любую сложную границу). Когда мы усредняем много таких деревьев, смещение остаётся почти таким же низким. Небольшой рост смещения возможен из-за того, что каждое дерево видит меньше признаков и меньше данных, но на практике это незначительно. - Дисперсия (variance): как обсуждалось выше, усреднение сильно снижает дисперсию, если деревья достаточно декоррелированы. Случайность бутстрепа + случайность признаков дают сильную декорреляцию. - Шум: неустранимая ошибка остаётся той же. Итог: Random Forest почти не переобучается при добавлении деревьев (ошибка на тесте выходит на плато), в отличие от одиночного дерева, которое легко переобучить по глубине. Это делает RF одним из самых безопасных алгоритмов "из коробки".
🌲Случайный лес (🔤🔤🔤🔤🔤🔤 🔤🔤🔤🔤🔤🔤) 📦 1. Что это вообще такое и зачем придумали Одиночное решающее дерево — отличный интерпретируемый алгоритм, но у него большая проблема: высокая дисперсия (variance). Чуть-чуть измени обучающую выборку — и дерево может перестроиться совершенно иначе, а предсказания поплывут. На практике это означает переобучение. Чтобы победить дисперсию, не потеряв в точности, придумали ансамблевый метод Random Forest . Идея гениально проста: - Берём много глубоких деревьев. - Каждое обучаем на своей слегка изменённой версии исходных данных. - При построении каждого узла дерево смотрит не на все признаки, а лишь на случайное подмножество. - Финальный ответ — выбирается класс с максимальной средней вероятностью (классификация) или среднее арифметическое предсказанных значений всех деревьев (регрессия). Далее будет пример. RF = Bagging (Bootstrap Aggregating) + Random Subspace Method. Bagging — усреднение моделей, обученных на разных bootstrap-выборках (объекты выбираются случайно с возвращением). Уменьшает дисперсию. Random Subspace Method — каждая модель обучается только на случайном подмножестве признаков. Декоррелирует модели ансамбля. Деревья строятся на bootstrap-выборках и в каждом узле перебирается случайная часть признаков. Двойная декорреляция → минимальная дисперсия и отличное качество «из коробки». 🧱 2. Строительные блоки: Bagging и случайные признаки 2.1. Bagging (бутстреп-агрегирование) Bagging решает проблему высокой дисперсии за счёт усреднения многих моделей. Алгоритм: 1. Из исходной обучающей выборки размера N генерируем M новых выборок с возвращением того же размера N. Каждая такая выборка называется бутстреп-выборкой. 2. В каждой бутстреп-выборке некоторые объекты повторяются несколько раз. 3. На каждой бутстреп-выборке обучаем отдельное решающее дерево. Поскольку деревья глубокие , каждое из них по отдельности переобучено: низкий bias, высокий variance. 4. Итоговое предсказание: для классификации — выбирается класс с максимальной средней вероятностью (классификация) или среднее арифметическое предсказанных значений всех деревьев 2.2. Случайное подмножество признаков (Random Subspace) Даже с бутстрепом деревья могли бы быть сильно скоррелированы, если бы каждое при разбиении узла просматривало все признаки. Самое сильное разбиение часто одно и то же, и все деревья пошли бы по одному пути. В Random Forest для каждого узла случайно отбирается k признаков из общего числа p: - Для классификации: k = sqrt(p). - Для регрессии: k = p (авто настройка) или - Для регрессии: k = p/3 (ручная настройка) - В sklearn это параметр max_features.
4️⃣6.4. Ранняя остановка (Early Stopping) При итеративном обучении отслеживаем ошибку на валидационной выборке. Как только она перестаёт улучшаться и начинает расти, останавливаем обучение и возвращаем лучшие веса. Математически ранняя остановка эквивалентна L2-регуляризации: она ограничивает эффективную ёмкость модели, не давая весам уйти далеко от начальных малых значений. 5️⃣6.5. Кросс-валидация для подбора гиперпараметров Чтобы выбрать уровень регуляризации, глубину дерева или learning rate, используем k-fold кросс-валидацию только на обучающей части. Так мы честно оцениваем обобщающую способность и избегаем переобучения на валидационный отбор. Процесс: 1)Разбиваем обучающие данные на k фолдов. 2)Для каждого кандидата гиперпараметров: 3)Проводим k обучений, каждый раз оставляя один фолд для валидации. 4)Усредняем ошибку. 5)Выбираем гиперпараметры с наименьшей средней ошибкой. 6)Обучаем финальную модель на всех train-данных с этими параметрами и тестируем на заранее отложенном test. 6️⃣6.6. Снижение размерности PCA (Метод главных компонент) Проецирует данные в подпространство меньшей размерности, сохраняя направления с максимальной дисперсией. Убирает мультиколлинеарность и шумовые компоненты, что уменьшает variance модели. 7️⃣6.7. Нормализация данных Стандартизация (mean=0, std=1) или MinMax-масштабирование помогает градиентному спуску быстрее сходиться и снижает риск патологического поведения весов. 8️⃣6.8. Регуляризация через шум Добавление небольшого гауссова шума к входам или весам во время обучения. Gradient noise: добавление шума к градиентам помогает выходить из острых локальных минимумов, которые часто соответствуют переобучению. 9️⃣6.9. Ансамбли 1)Бэггинг (Bagging, Bootstrap Aggregating) 2)Бустинг (Boosting) To be continued...
В алгоритмах вроде случайного леса мы голосуем многочисленными деревьями, и именно усреднение снижает дисперсию (variance), что и борется с переобучением. 🔥4. Как обнаружить переобучение на практике 🦖4.1. Обучающая и валидационная кривые Строим две кривые: ошибка на train и ошибка на валидации (val) в зависимости от сложности модели (глубина дерева, степень полинома, число итераций и т.д.). Ошибка │ │ _ _ _ _ _ Валидация │ / . – . – . – . │ / . . │ / . . │ / . . │ / . . │ / . . │ / . │ / ____ Обучение (почти до 0) └────────────────────────── сложность / эпохи ↑ момент, где val начинает расти – переобучение Признак переобучения: разрыв между train и val увеличивается; ошибка на train продолжает падать, а на val — расти. Если ошибка на train тоже высокая и они близки — это недообучение. 🦖4.2. Кросс-валидация Делим обучающую выборку на k фолдов(равных частей) , обучаем на (k-1) и валидируем на оставшемся. Усреднённая ошибка кросс-валидации — честная оценка обобщающей способности. Если при усложнении модели кросс-валидационная ошибка перестаёт падать или начинает расти — мы переобучились. 🦖4.3. Проверка на отложенном тесте Всегда держим нетронутый тестовый сет. Если разница между качеством на train и test большая (например, accuracy 99% vs 85%) — скорее всего, модель переобучена. 🖥 5. Причины переобучения 🐤1. Слишком высокая сложность модели (ёмкость, capacity). Модель имеет слишком много степеней свободы по сравнению с объёмом данных. Например, полином степени 20 на 15 точках; дерево без ограничений. 🦆2. Малое количество данных. Даже простая модель может переобучиться, если данных катастрофически мало — она просто запоминает отдельные примеры. Правило большого пальца: количество примеров должно хотя бы в 10–20 раз превышать количество параметров (для линейных моделей). Для глубоких сетей нужно ещё больше. 😮3. Шум в данных (неустранимая дисперсия). Если целевая переменная сильно зашумлена, сложная модель начнёт подгоняться под этот шум, высасывая из него «закономерности». 🪷4. Неинформативные / избыточные признаки. Чем больше «мусорных» признаков, тем легче модели найти ложные корреляции. Это как предсказывать цену акций по фазе луны. ☺️5. Слишком долгое обучение (много итераций). При итеративной оптимизации (градиентный спуск, бустинг) модель постепенно всё точнее подстраивается под обучающие данные и после некоторого момента начинает заучивать шум. 😐6. Отсутствие регуляризации. Модель не штрафуется за сложность, ей ничто не мешает «растянуться» до идеального соответствия обучающей выборке. [07.07.2026 18:46] IT: ⏰6. Арсенал методов борьбы с переобучением 1️⃣6.1. Упрощение модели Деревья: ограничить max_depth, min_samples_split, min_samples_leaf, min_impurity_decrease. Линейные модели: использовать меньше признаков (отбор через Lasso, mutual information, recursive feature elimination). 2️⃣6.2. Регуляризация L2-регуляризация (Ridge, Weight Decay) Добавляем штраф за величину весов к функции потерь: J(θ) = L(θ) + λ * Σ θ_j² На каждом шаге веса немного «поджимаются» к нулю, что эквивалентно ограничению их нормы. Чем больше λ, тем сильнее сжатие. L1-регуляризация (Lasso) J(θ) = L(θ) + λ * Σ |θ_j| Приводит к разреженным решениям: часть весов становится ровно нулю — автоматический отбор признаков. Геометрически: ограничение — ромб, минимум нерегуляризованной функции часто попадает на угол, где некоторые координаты равны нулю. ElasticNet Комбинация L1 и L2: J(θ) = L(θ) + λ₁ Σ |θ_j| + λ₂ Σ θ_j² Позволяет и отбирать признаки, и бороться с мультиколлинеарностью(когда признаки сильно коррелируют между собой) 3️⃣6.3. Label Smoothing Вместо жёстких меток [0,1] используем смягчённые, например [0.1, 0.9]. Это не даёт модели становиться слишком уверенной и переобучаться на выбросы.
🔤🔤🔤🔤🔤🔤🔤🔤🔤🔤 (ПЕРЕОБУЧЕНИЕ) ⚙️1. Интуиция и определение Представь студента, который вместо понимания предмета выучил наизусть ответы на все билеты из прошлогодней сессии. Если вопрос на экзамене совпадёт дословно — он получит «отлично». Но стоит преподавателю чуть переформулировать или задать смежную тему — студент провалится. Примерно так ведёт себя переобученная модель. 🔖Формальное определение: Переобучение (overfitting) — это состояние модели, при котором она слишком хорошо описывает обучающую выборку, захватывая не только истинную закономерность, но и случайный шум, выбросы и особенности конкретного набора данных. В результате качество на новых, ранее не виденных примерах резко падает. Противоположное состояние — недообучение (underfitting), когда модель слишком проста и не может уловить даже основную зависимость. Пример с решающим деревом: Если мы строим дерево без ограничений (max_depth=None, min_samples_leaf=1), то каждый лист будет содержать ровно один объект из обучения. Ошибка на обучении станет нулевой — идеально! Но подадим новый объект с чуть другими значениями признаков, и дерево не найдёт для него точного совпадения — предсказание будет почти случайным. Модель выучила не правило, а саму обучающую таблицу наизусть. 🎯 2. Bias-Variance: почему модель вообще ошибается? Любая ошибка предсказания (например, на сколько тысяч мы промахнулись с ценой дома) складывается из трёх источников. Представь, что тебе нужно с завязанными глазами кинуть мяч в центр мишени. Ты делаешь бросок — и промахиваешься. Почему? 1. Неустранимый шум (σ²) — это природная случайность, которую не убрать. Даже если ты знаешь всё про дом (площадь, этаж, район), цена всё равно может немного «плавать» из-за настроения покупателя, погоды в день сделки или случайного шума в данных. Идеальный предсказатель тоже ошибётся на эту величину. 🔹 Жизненный пример: два абсолютно одинаковых дома в одном подъезде проданы за 5.1 млн и 4.9 млн — просто так сложилось. Этот разброс не объяснить никакими признаками. 2. Смещение (Bias) — это систематическая ошибка из-за того, что модель слишком проста и принципиально не может выучить настоящую форму зависимости. 🔹 Пример: настоящая зависимость цены от площади — изогнутая (парабола), а мы обучаем только прямую линию. Прямая всегда будет проходить «в среднем» мимо реальных точек, она не умеет изгибаться. Такую ошибку уже можно исправить, усложнив модель. Высокий bias = модель «недоучилась», она как плохой стрелок, у которого прицел всегда уводит влево — даже в среднем его пули далеко от центра. 3. Разброс (Variance) — это чувствительность модели к конкретному набору данных, на котором она училась. Если бы мы собрали чуть другие примеры домов, предсказания для того же самого нового дома сильно бы изменились. 🔹 Пример: модель-«хамелеон» идеально подстроилась под каждую чёрточку обучающих домов, запомнила даже шум. Но стоит нам взять другую обучающую выборку (например, без одного выброса), как её предсказания резко сдвигаются. Высокий variance = модель «переобучилась», она слишком дёрганая. В аналогии с мишенью — это стрелок, который каждый раз кидает мяч очень кучно, но кучка лежит в стороне от центра, потому что он настроил бросок под тот самый единственный тренировочный зал. 👁 Практический смысл Понимание bias и variance помогает выбрать лечение: - Если ошибка на обучении и на проверке обе большие → вероятно, высокий bias. Надо усложнить модель. - Если на обучении ошибка крошечная, а на проверке большая → высокий variance. Надо упрощать, добавлять регуляризацию, больше данных. : 🌐3. Разложение для классификации - Шум — когда объект с одними признаками может иметь разную метку (например, два одинаковых письма, одно спам, другое нет). - Смещение — когда модель принципиально не может верно описать границу классов (линейная модель для круговой границы). - Дисперсия — модель скачет от выборки к выборке, переобучаясь на шум.
🛑 8. Критерии остановки и Pre-pruning Если дать дереву расти бесконтрольно, оно идеально запомнит обучающие данные (вплоть до 1 объекта в листе) и будет ужасно обобщать. Pre-pruning останавливает рост заранее: - max_depth – максимальная глубина. - min_samples_split – минимальное число объектов в узле для его разделения. - min_samples_leaf – минимальное число объектов в листе (разбиение, создающее лист с меньшим числом, запрещено). - min_impurity_decrease – минимальный прирост impurity. - max_leaf_nodes – максимальное число листьев. Параметры подбирают по валидации. 🐍 12. Реализация в scikit-learn Теперь перейдём к практике. sklearn.tree содержит DecisionTreeClassifier 12.1 Классификация на Iris(датасет) # 1. Импорт библиотек from sklearn.datasets import load_iris # Загружаем знаменитый датасет Iris (ирисы) from sklearn.tree import DecisionTreeClassifier # Классификатор "Решающее дерево" from sklearn.model_selection import train_test_split # Разбиение данных from sklearn.metrics import accuracy_score # Метрика "доля правильных ответов" # 2. Загрузка данных X, y = load_iris(return_X_y=True) # X — признаки (150 строк, 4 столбца): длина/ширина чашелистика, длина/ширина лепестка # y — метки классов (0, 1, 2) — три вида ирисов: setosa, versicolor, virginica # 3. Разделение на обучающую и тестовую выборки X_train, X_test, y_train, y_test = train_test_split( X, y, test_size=0.2, # 20% данных оставляем для теста, 80% — для обучения random_state=42 # Фиксируем генератор случайных чисел, чтобы разбиение было воспроизводимым ) # Теперь у нас: # X_train, y_train — обучающая выборка (120 объектов) # X_test, y_test — тестовая выборка (30 объектов) # 4. Создание и обучение модели tree = DecisionTreeClassifier( max_depth=3, # Ограничиваем максимальную глубину дерева = 3 (pre-pruning!) random_state=42 # Для воспроизводимости (при одинаковых данных даст одинаковое дерево) ) tree.fit(X_train, y_train) # Обучаем дерево на обучающих данных # На этом этапе внутри дерева уже построены все вопросы "если-то" # 5. Прогноз на тестовой выборке y_pred = tree.predict(X_test) # Получаем предсказанные классы для 30 тестовых объектов # 6. Оценка качества acc = accuracy_score(y_test, y_pred) # Сравниваем истинные метки y_test с предсказанными y_pred print(f"Accuracy: {acc:.2f}") # Выводим, например: Accuracy: 0.97 13. Итог Решающее дерево — алгоритм машинного обучения. Оно интуитивно понятно, интерпретируемо и служит основой для продвинутых ансамблевых методов. Мы разобрали: - внутреннюю механику с детальными вычислениями Gini, энтропии, Information Gain, Gain Ratio - ручное построение на примере классификации - pre-pruning - реализацию в sklearn
Для площади, порог 47.5: - Левая: 0 Да, 2 Нет → p=0 → H_L = 0 - Правая: 3 Да, 1 Нет → p=3/4=0.75, 1-p=0.25→ H_R = -0.75log_2 0.75 - 0.25log_2 0.25 log_2 0.75 ≈ -0.415, log_2 0.25 = -2 H_R = -0.75(-0.415) -0.25(-2) = 0.31125 + 0.5 = 0.81125 - Взвешенная энтропия: (2/6)0 + (4/6)0.81125 = 0.5408 - Information Gain = 1 - 0.5408 = 0.4592 Для площади, порог 75: - Левая: 1 Да, 3 Нет → p=0.25, 0.75 → H_L = -0.25log_2 0.25 -0.75log_2 0.75 log_2 0.25 = -2, log_2 0.75 ≈ -0.415 H_L = -0.25(-2) -0.75(-0.415) = 0.5 + 0.31125 = 0.81125 - Правая: 2 Да, 0 Нет → H_R = 0 - Взвешенная энтропия: (4/6)0.81125 + (2/6)0 = 0.5408 - IG = 1 - 0.5408 = 0.4592 Для этажа, порог 2.5: - Левая: 0 Да, 2 Нет → H_L=0 - Правая: 3 Да, 1 Нет → H_R=0.81125 - Взвешенная энтропия: (2/6)0 + (4/6)0.81125 = 0.5408 - IG = 0.4592. Как видим, оба признака с лучшими порогами дают одинаковый IG. Это типично: Gini и энтропия часто согласуются в выборе разбиения. 6.4 посчитаем ради практики через Gain Ratio для признака «Этаж» У этажа 5 уникальных значений, поэтому Split Info: SplitInfo = - Σ ( |S_ v| / |S| ) · log₂( |S_v| / |S| ) При пороге 2.5 получаем две группы: размер 2 и 4 SplitInfo = -(2/6)log_2(2/6) - (4/6)log_2(4/6) = -(1/3)(-1.585) - (2/3)(-0.585) = 0.528 + 0.390 = 0.918. Gain Ratio = IG / SplitInfo = 0.4592 / 0.918 = 0.5. Для площади с порогом 47.5 (тоже две группы размером 2 и 4) SplitInfo такой же, Gain Ratio = 0.5. Дерево как умный покупатель: «Я готово заплатить (создать разбиение), только если польза от вопроса заметно превышает его сложность. Если вопрос заставляет меня разбить всё на миллион кусочков, я такой вопрос проигнорирую и выберу что-то попроще и понадежнее».
5. Как ищется наилучшее разбиение 🏆 Для числового признака алгоритм перебирает пороги между соседними отсортированными значениями. Эффективная реализация: 1. Сортируем объекты узла по данному признаку от меньшего к большему 2. Создаём гистограмму классов: левая — пустая, правая — все объекты. 3. Двигаемся слева направо, переносим по одному объекту из правой в левую, обновляя гистограммы. 4. На каждом уникальном значении признака (точнее, на середине между соседними разными значениями) вычисляем impurity левого и правого потомков. 5. Запоминаем порог с максимальным приростом. (Далее будет пример,на котором станет все понятнее) 🏠 6. Подробный пример выбора первого вопроса Рассмотрим задачу: предсказать, продастся ли дом. Данные: | Дом | Площадь, м² | Этаж | Продался?| | 1 | 50 | 3 | Да (1) | | 2 | 80 | 7 | Да (1) | | 3 | 30 | 1 | Нет (0) | | 4 | 90 | 10 | Да (1) | | 5 | 45 | 2 | Нет (0) | | 6 | 70 | 8 | Нет (0) | Корень: 6 объектов: 3 Да, 3 Нет → Gini = 1 - (0.5^2+0.5^2) = 0.5 6.1 Перебираем признак Площадь с индексом Джини Пропустим вычисления,так как у них прирост меньше(я посчитал) Упорядоченные значения: 30, 45, 50, 70, 80, 90. Пороги (середины): 37.5(30/2+45/2), 47.5, 60, 75, 85(80/2+90/2) ... - Порог 47.5 Левая (≤47.5): дома 3,5 → оба Нет → 0 Да, 2 Нет → Gini = 0. Правая (>47.5): дома 1,2,4,6 → метки 1,1,1,0 → 3 Да, 1 Нет → Gini = 1 - (0.75^2+0.25^2) = 0.375 Взвешенный Gini = (2/6)0 + (4/6)0.375 = 0.25 Прирост = 0.5 – 0.25 = 0.25. ... - Порог 75 Левая (≤75): дома 1(Да),3(Нет),5(Нет),6(Нет) → 1 Да, 3 Нет → Gini = 1 - (0.25^2+0.75^2)=0.375 Правая (>75): дома 2,4 → оба Да → Gini = 0. Взвешенный Gini = (4/6)0.375 + (2/6)0 = 0.25 Прирост = 0.5 – 0.25 = 0.25. ... Лучшие пороги: 47.5 и 75 с приростом 0.25. 6.2 Перебираем признак «Этаж» с индексом Джини Этажи: 1,2,3,7,8,10. Пороги: 1.5, 2.5, 5, 7.5, 9. - Порог 1.5 Левая: дом 3 (Нет) → Gini=0. Правая: 1,2,4,5,6 → 3 Да, 2 Нет → Gini=0.48. Взвешенный = 0.40, прирост=0.10. - Порог 2.5 Левая: дома 3,5 (оба Нет) → Gini=0. Правая: 1,2,4,6 → 3 Да, 1 Нет → Gini=0.375. Взвешенный = 0.25, прирост=0.25. ... - Порог 9 Левая: 1,3,5,2,6 → 2 Да,3 Нет → Gini=0.48. Правая: 4 → Gini=0. Взвешенный=0.40, прирост=0.10. Лучший: порог 2.5 с приростом 0.25. 6.3 Теперь вычислим энтропию и IG(Information Gain) для этих же разбиений,посмотрим будут ли различия с Gini в выборе порядка вопросов и порогов Энтропия корня: H(S) = -0.5log_2 0.5 - 0.5log_2 0.5 = 1
🌳 Решающие деревья 1. Решающее дерево — это модель, которая предсказывает значение целевой переменной, задавая последовательность вопросов с ответом «да/нет». Каждый вопрос проверяет один признак объекта. Например: «Площадь ≤ 75 м²?» → если да, идём налево, иначе направо. Структура: - Корень — первый (самый информативный) вопрос. - Внутренние узлы — последующие вопросы. - Листья — финальное предсказание (класс, вероятности или число). Для задачи «Продастся ли дом за месяц?» лист хранит долю проданных домов — это и есть оценка вероятности. 📊 2. Решают задачу классификация (бинарная и многоклассовая), остальное получается плохо. 🧠 3. Как строится дерево: жадный алгоритм CART Почти все современные реализации (sklearn, XGBoost, LightGBM) основаны на CART — Classification and Regression Tree. CART строит бинарные деревья: каждый узел делит данные ровно на две части. Ключевое: жадность — на каждом шаге выбираем наилучшее разбиение только здесь и сейчас, не думая о будущем. 🎯 4. Меры неопределённости (Impurity) Чтобы оценить, насколько «грязный» (перемешаны объекты разных классов) узел, вводят impurity. Цель разбиения — максимально её уменьшить. 📌 Цель разбиения — максимально уменьшить неопределённость. Чем «грязнее» (перемешаны объекты разных классов) узел, тем хуже. Рассмотрим три главные меры. 🔹 1. ИНДЕКС ДЖИНИ Gini impurity = 1 – Σ (p_k)² ΔGini = Gini(S) – Σ (|S_v|/|S|) )·Gini(S_v) p_k — доля объектов класса k в узле. Чистый узел (все одного класса) → Gini = 0. Интуиция: это вероятность ошибиться, если случайно назначить класс по распределению в узле. 🔹 2. ЭНТРОПИЯ (Entropy) H = – Σ p_k · log₂(p_k) IG = H(S) – Σ (|S_v|/|S|) · H(S_v) • Чем выше IG и Gini impurity, тем лучше разбиение. • |S_v| -Подмножество объектов из S, у которых значение признака равно v • |S| - все объекты 🔹 3. GAIN RATIO — спасение от ловушки Information Gain У Information Gain есть скрытый недостаток: он обожает признаки с большим количеством уникальных значений. Представьте, что у нас есть признак «ID дома». Если строить по нему разбиение, можно выделить столько веток, сколько объектов в узле. В каждой ветке окажется ровно один дом, энтропия станет 0, и Information Gain будет максимальным. Но такое разбиение бесполезно для новых домов — для них ID будет другим, и правило не сработает. 📏 Что такое Split Information? Это энтропия распределения размеров дочерних групп. Она показывает, насколько сложным получилось разбиение — насколько сильно различаются размеры получившихся «веток». 🫧Формула: SplitInfo = – Σ ( |S_ v| / |S| ) · log₂( |S_v| / |S| ) Если все объекты уходят в одну ветку → SplitInfo = 0 Если разбиение создаёт много мелких веток (например, поровну на 10 частей) → SplitInfo высокий. 👁Интуиция: SplitInfo – это «цена вопроса». Чем мельче и равномернее группы, тем дороже нам обходится такое разбиение. Чтобы не дать дереву пойти по этому ложному пути, в алгоритме C4.5 придумали Gain Ratio. Мы не просто смотрим на уменьшение энтропии, а делим его на «цену» разбиения — Split Information. Gain Ratio = IG / SplitInfo Мы «наказываем» разбиение за излишнюю сложность. Понял, давай подведу краткий итог в том же стиле — для завершения поста. Вот готовый фрагмент, можно вставлять сразу после объяснения Gain Ratio. 4️⃣Краткий итог: - Gini impurit — быстрый, простой, по умолчанию в sklearn. Показывает вероятность ошибки при случайном назначении класса. - Entropy + Information Gain— чуть более сбалансированный, но склонен выбирать признаки с большим количеством уникальных значений. - Gain Ratio — спасает от этой ловушки: делит Information Gain на «цену сложности» разбиения (SplitInfo). Чем мельче и равномернее группы, тем выше SplitInfo, и тем сильнее падает Gain Ratio — бесполезные признаки отсеиваются. - На практике: в CART (sklearn) проблема многозначности смягчена бинарными разбиениями, но для категорий с сотнями значений Gain Ratio остаётся полезной концепцией. Главное — дерево всегда выбирает разбиение, которое максимально уменьшает impurity с учётом ограничений🌳
🏔 Градиентный спуск: формулы Градиенты (без регуляризации) выглядят удивительно просто: ∂J/∂W₁ = (1/n) Σ (ŷ – y)·x₁ ∂J/∂W₂ = (1/n) Σ (ŷ – y)·x₂ ∂J/∂B = (1/n) Σ (ŷ – y) Обновление весов: W₁ := W₁ – α·∂J/∂W₁ W₂ := W₂ – α·∂J/∂W₂ B := B – α·∂J/∂B Если добавляем L2-регуляризацию с коэффициентом λ, к градиентам W₁ и W₂ прибавляется + 2λW. 🧮 (α = 0.001, λ = 0.1) Делаем L2-регуляризацию, чтобы победить корреляцию. Смотрим, как меняются веса и ошибка. Итерация 0 (старт): W₁ = 0, W₂ = 0, B = 0 z =W₁·Площадь + W₂·Этаж + B= 0 для всех домов → ŷ =σ(0)= 1 / (1 + e^(-0))=0.5 для всех Ошибка (Log Loss) = –ln(0.5) ≈ 0.693 Итерация 1 (считаем градиенты): Для каждого дома разница (ŷ – y): Дом 1: 0.5 – 1 = –0.5 Дом 2: 0.5 – 1 = –0.5 Дом 3: 0.5 – 0 = +0.5 Градиенты (без регуляризации): ∂J/∂W₁ = ⅓[ (–0.5)·50 + (–0.5)·80 + 0.5·30 ] = ⅓[ –25 – 40 + 15 ] = –16.67 ∂J/∂W₂ = ⅓[ (–0.5)·3 + (–0.5)·7 + 0.5·1 ] = ⅓[ –1.5 – 3.5 + 0.5 ] = –1.5 ∂J/∂B = ⅓[ –0.5 – 0.5 + 0.5 ] = –0.1667 Добавляем регуляризацию: 2λW = 2·0.1·0 = 0 Обновляем веса (шаг α = 0.001): W₁ = 0 – 0.001·(–16.67) = 0.01667 W₂ = 0 – 0.001·(–1.5) = 0.0015 B = 0 – 0.001·(–0.1667) = 0.0001667 Считаем новые z и ŷ: Дом 1: z = 0.01667·50 + 0.0015·3 + 0.00017 ≈ 0.838 → ŷ ≈ 0.698 Дом 2: z = 0.01667·80 + 0.0015·7 + 0.00017 ≈ 1.344 → ŷ ≈ 0.793 Дом 3: z = 0.01667·30 + 0.0015·1 + 0.00017 ≈ 0.502 → ŷ ≈ 0.623 Считаем Log Loss: Дом 1: –ln(0.698) = 0.360 Дом 2: –ln(0.793) = 0.232 Дом 3: –ln(1–0.623) = –ln(0.377) = 0.976 Среднее = (0.360+0.232+0.976)/3 ≈ 0.523 ✅ Ошибка упала с 0.693 до 0.523! Итерация 500 : W₁ ≈ 0.072, W₂ ≈ 0.38, B ≈ –4.5 ŷ₁ = σ(0.24) ≈ 0.56 ŷ₂ = σ(3.92) ≈ 0.98 ŷ₃ = σ(–1.96) ≈ 0.12 Log Loss ≈ 0.09 📉Визуализация обучения Log Loss │ │● (0.693) │ ● (0.523) │ ●● (0.38) │ ●● (0.22) │ ●●● (0.09) └──────────────────── итерации минимум Плавное снижение ошибки, без скачков. Регуляризация держит веса под контролем. 🎯 Предсказание для нового дома Приходит: 60 м², 5 этаж. z = 0.072·60 + 0.38·5 – 4.5 = 2.22 → ŷ ≈ 0.90 Модель говорит: вероятность продажи 90% — высокий шанс. Ставим порог 0.5: - если ŷ ≥ 0.5 → «продастся» - если ŷ < 0.5 → «не продастся» 🐇Большой α,допустим= 0.01 — может вызвать резкие скачки ŷ к 0 или 1 и взрыв логарифма. 📌 Итог (простыми словами) Логистическая регрессия — это классификатор, который предсказывает вероятность принадлежности к классу Мы берём линейную комбинацию признаков, сжимаем сигмоидой в (0,1), и минимизируем Log Loss градиентным спуском. ⚠️ Если признаки сильно скоррелированы (как площадь и этаж), модель становится нестабильной. Лечится: удалением лишнего признака, стандартизацией, регуляризацией или PCA. С регуляризацией и умеренным шагом модель плавно учится и даёт более интерпретируемые вероятности. 🤔Почему всё-таки «регрессия», если это классификатор? — Модель предсказывает непрерывную величину z, которую затем превращает в вероятность сигмоидой. А уже к вероятности применяем порог. Поэтому внутри — регрессия, а снаружи — классификатор