Ответ
Линейные модели основаны на предположении о линейной зависимости между признаками и целевой переменной. Основные формулы:
-
Линейная регрессия:
y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + εy— предсказываемое значение (целевая переменная).β₀— свободный член (intercept).β₁...βₙ— коэффициенты (веса) признаков.x₁...xₙ— независимые переменные (признаки).ε— ошибка (шум), обычно предполагается нормально распределённой.
-
Логистическая регрессия (для бинарной классификации): Использует логистическую (сигмоидную) функцию для преобразования линейной комбинации в вероятность.
p(y=1 | x) = σ(z) = 1 / (1 + e^{-z}), гдеz = β₀ + β₁x₁ + ... + βₙxₙp(y=1 | x)— вероятность принадлежности к классу 1.σ(z)— сигмоидная функция, отображающаяzв интервал (0, 1).
-
Функция потерь (MSE для регрессии):
MSE = (1/n) * Σ(y_i - ŷ_i)²Минимизация MSE методом наименьших квадратов даёт аналитическое решение дляβ. -
Функция потерь (Log Loss для логистической регрессии):
Log Loss = - (1/n) * Σ [y_i * log(p_i) + (1 - y_i) * log(1 - p_i)]
Практический пример с регуляризацией (scikit-learn):
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
# Масштабирование признаков для стабильности работы регуляризации
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
# L1-регуляризация (Lasso) может обнулять коэффициенты, выполняя отбор признаков
model_l1 = LogisticRegression(penalty='l1', solver='liblinear', C=0.1)
model_l1.fit(X_train_scaled, y_train)
print("Коэффициенты (L1):", model_l1.coef_)
# L2-регуляризация (Ridge) уменьшает величину коэффициентов, но не обнуляет их
model_l2 = LogisticRegression(penalty='l2', C=1.0)
model_l2.fit(X_train_scaled, y_train)
print("Коэффициенты (L2):", model_l2.coef_)
Ключевой вывод: Несмотря на простоту, линейные модели с регуляризацией (L1/L2) часто являются сильным базовым решением, интерпретируемым и устойчивым к переобучению.
Ответ 18+ 🔞
А, линейные модели! Ну, классика жанра, ёпта. Типа, самый фундамент, на котором всё держится, как водка в пятницу. Представь, что твоя целевая переменная — это просто сумма всего, что на неё влияет, умноженная на какие-то веса. И всё, блядь. Никакой магии, чистая арифметика.
Вот смотри, как это выглядит, если на пальцах:
-
Линейная регрессия (когда надо число предсказать):
y = β₀ + β₁x₁ + β₂x₂ + ... + βₙxₙ + εy— это что мы хотим угадать. Цена квартиры, например.β₀— это типа базовый уровень. Стоимость голой земли, нахуй.β₁...βₙ— вот это самое интересное. Насколько сильно каждый признак (метры, район, этаж) влияет на цену. Если коэффициент отрицательный — значит, признак цену хуярит, снижает.x₁...xₙ— сами признаки. Площадь, удалённость от метро, год постройки.ε— это наш родной русский шум, случайность, которую мы нихуя не можем объяснить. Типа, продавец просто в душе не ебёт и занизил цену.
-
Логистическая регрессия (когда надо да/нет): Тут уже хитрая жопа. Мы не число предсказываем, а вероятность. Формула страшная, но суть простая: берём ту же самую линейную комбинацию (
z), суём её в специальную S-образную функцию (сигмоиду), и она выдаёт число от 0 до 1. Это и есть шанс, что объект принадлежит к классу 1 (например, клиент купит).p(y=1 | x) = 1 / (1 + e^{-z})Еслиp> 0.5 — говорим «да», если нет — «пошёл нахуй», то есть «нет». Всё гениальное — просто, как валенок. -
Как модель учится? А учится она на ошибках, как и все мы! Для регрессии есть функция MSE — средний квадрат ошибок. Она считает, насколько наши предсказания
ŷотъехали от реальных значенийy. Задача модели — ёбнуть эти ошибки в ноль, то есть минимизировать MSE. Иногда для этого есть красивое аналитическое решение (как в школе решить уравнение), иногда — итеративные методы.Для логистической регрессии — Log Loss. Она сурово наказывает модель за уверенность в неверном ответе. Сказала, что с вероятностью 99% клиент купит, а он нихуя — получай по шапке от функции потерь.
А теперь самое вкусное — регуляризация. Это чтобы наша модель не начала выёбываться и подстраиваться под каждую соплю в обучающих данных (это называется переобучение, и оно — пиздец).
Смотри код, тут всё наглядно:
from sklearn.linear_model import LogisticRegression
from sklearn.preprocessing import StandardScaler
# Признаки сначала масштабируем, чтобы регуляризация их всех равноправно ебала, а не только тех, у кого значения больше.
scaler = StandardScaler()
X_train_scaled = scaler.fit_transform(X_train)
# L1-регуляризация (Lasso). Она как строгий отец: "Слабые признаки — нахуй с пляжа!" Может обнулить коэффициент, если признак бесполезен.
model_l1 = LogisticRegression(penalty='l1', solver='liblinear', C=0.1)
model_l1.fit(X_train_scaled, y_train)
print("Коэффициенты (L1):", model_l1.coef_) # Тут будут нули, это отбор признаков!
# L2-регуляризация (Ridge). Она как добрая мать: "Все вы важны, детки, но ведите себя потише". Коэффициенты не обнуляет, но делает их поменьше, сглаживает.
model_l2 = LogisticRegression(penalty='l2', C=1.0)
model_l2.fit(X_train_scaled, y_train)
print("Коэффициенты (L2):", model_l2.coef_) # Тут нулей не будет, но числа будут скромные.
Итог, чувак: Не гонись сразу за нейросетями в 500 слоёв. Часто эта манда с ушами — обычная логистическая регрессия с L1-регуляризацией — даст результат не хуже, а то и лучше, да ещё и объяснить можно будет, какого хуя она так решила. Простота — не всегда глупость, иногда это просто гениальная простота.