Как заставить веса быть неотрицательными в линейной регрессии

27

Я использую стандартную линейную регрессию, используя scikit-learn в python. Тем не менее, я хотел бы, чтобы веса были положительными для каждой функции (не отрицательной), есть ли способ, которым я могу это сделать? Я искал в документации, но не мог найти способ сделать это. Я понимаю, что я не могу найти лучшее решение, но мне нужно, чтобы веса были неотрицательными.

пользователь
источник

Ответы:

27

То, что вы ищете, это неотрицательная регрессия наименьших квадратов . Это простая задача оптимизации в квадратичном программировании, где ваше ограничение состоит в том, что все коэффициенты (или веса) должны быть положительными.

Сказав это, в Scikit-Learn нет стандартной реализации неотрицательных наименьших квадратов. Запрос на получение ответа все еще открыт .

Но, похоже, Сципи реализовал то же самое .

PS: я не пробовал scipy версию. Я нашел это исключительно, погуглив вокруг.

Dawny33
источник
1
как насчет регрессии гребня, где она вынуждена к положительному?
Чарли Паркер
15

Я использую обходной путь с Лассо в Scikit Learn (это определенно не лучший способ сделать что-то, но он работает хорошо). У Лассо есть параметр, positiveкоторый можно установить Trueи заставить коэффициенты быть положительными. Кроме того, установка коэффициента регуляризации alphaна значение, близкое к 0, приводит к линейной регрессии, имитирующей лассо, без регуляризации. Вот код:

from sklearn.linear_model import Lasso
lin = Lasso(alpha=0.0001,precompute=True,max_iter=1000,
            positive=True, random_state=9999, selection='random')
lin.fit(X,y)
Адарш Чавакула
источник
0

Вот пример того, почему вы хотите это сделать (и примерно как).

У меня есть 3 прогностические модели цен на жилье: линейная, градиентная, нейронная сеть.

Я хочу смешать их в средневзвешенном и найти лучшие веса.

Я запускаю линейную регрессию и получаю решение с такими весами, как -3.1, 2.5, 1.5 и некоторый перехват.

Так что вместо этого я использую sklearn

blendlasso = LassoCV(alphas=np.logspace(-6, -3, 7),
                     max_iter=100000,
                     cv=5,
                     fit_intercept=False,
                     positive=True)

И я получаю положительные веса, которые суммируют (очень близко) к 1. В моем примере я хочу, чтобы альфа работала лучше всего вне выборки, поэтому я использую LassoCV с перекрестной проверкой.

Документы sklearn утверждают, что вы не должны устанавливать альфа в 0 по численным причинам, однако вы также можете использовать прямую Lasso () и установить альфа-параметр настолько низким, насколько это возможно для получения разумного ответа.

Роки МакНатс
источник