tgoop.com/analytess/493
Last Update:
Линейная регрессия с коэффициентами не меньше нуля
Небольшая хардовая заметка на полях, морали не будет. Недавно столкнулась на работе с такой задачкой: хотелось проверить (подтвердить) зависимость одной величины от нескольких продуктовых метрик при помощи наиболее простой и интерпретируемой модели из возможных. Грубо говоря, если обучится регрессия с хорошим R^2, то величины коррелируют. (Вопрос доказательства каузации сложнее, сегодня не трогаем)
И таргет, и фичи имели определённый «физический смысл» — были продуктовыми или техническими метриками — то есть временными рядами с растущим трендом. В связи с этим, а также по продуктовому здравому смыслу, хотелось, чтобы в итоговой линейной комбинации коэффициенты были неотрицательными. Так ненужные фичи получат коэффициент 0.
Оказалось, что для этого есть готовые методы
⚡️ можно заменить statsmodels.regression.linear_model.OLS
на scipy.optimize.nnls
(non-negative least squares)
⚡️ или же добавить в sklearn.linear_model.LinearRegression
параметр positive=True
. Если что, на intercept (свободное слагаемое, если fit_intercept=True
) он не распространится, что, как правило, не нарушает замысел поставленной выше задачи.
Эти методы реализуют уже не просто линейную регрессию (метод наименьших квадратов) в классическом понимании, а решают задачу выпуклой оптимизации с ограничением:argmin_x ||Ax - b||_2
при x>=0
. Но разница не так велика.
#хардов_пост
@analytess