Почему на разделимых данных коэффициенты логистической регрессии улетают и что это чинит?
Коллега сообщает, что обученный классификатор печатает коэффициенты порядка 1e4 и предупреждение о сходимости, при этом точность на обучении равна ровно 1.0. Классы линейно разделимы.
Ограничения: оставить логистическую регрессию, сохранить все признаки, данные не править.
import numpy as np
from sklearn.linear_model import LogisticRegression
X = np.array([[-2.0], [-1.0], [1.0], [2.0]])
y = np.array([0, 0, 1, 1])
model = LogisticRegression(penalty=None, max_iter=100000)
model.fit(X, y)
print(model.coef_) # порядок 1e4, и растёт вместе с max_iter
Найдите и исправьте ошибку.
При идеальной разделимости оптимум максимального правдоподобия не существует: рост весов толкает log-loss к нулю, не достигая его, поэтому коэффициенты расходятся, а солвер встаёт лишь по лимиту итераций. Штраф фиксирует конечное решение.
- ✗Поднимают max_iter и считают исчезнувшее предупреждение решением
- ✗Винят переполнение float или масштаб признаков вместо несуществующего оптимума
- ✗Считают, что идеальная точность на обучении означает здоровую модель
- →Почему поднятие лимита итераций делает напечатанные коэффициенты больше, а не устойчивее?
- →Какое ещё средство, кроме штрафа, ограничивает оценку при разделимости?
Классы линейно разделимы, поэтому оптимума правдоподобия без штрафа просто нет: любое масштабирование весов делает предсказания увереннее и снижает log-loss, а предел достигается только на бесконечности. Поднимать max_iter бессмысленно — коэффициенты будут расти дальше. Нужно вернуть штраф (в scikit-learn это поведение по умолчанию), тогда целевая функция коэрцитивна и минимум конечен.
import numpy as np
from sklearn.linear_model import LogisticRegression
X = np.array([[-2.0], [-1.0], [1.0], [2.0]])
y = np.array([0, 0, 1, 1])
model = LogisticRegression(penalty="l2", C=1.0, max_iter=1000)
model.fit(X, y)
print(model.coef_) # конечный коэффициент, устойчив к росту max_iter
Меньшее C сильнее штрафует и сильнее сжимает оценку. Альтернатива без штрафа — штрафованное правдоподобие Фирта, которое также даёт конечные оценки при разделимости.