Як змусити ваги бути негативними при лінійній регресії


27

Я використовую стандартну лінійну регресію з використанням scikit-learn в python. Однак я хотів би змусити ваги бути позитивними для кожної риси (не від'ємною), чи я можу це досягти? Я шукав документацію, але не міг знайти спосіб досягти цього. Я розумію, що я не можу отримати найкраще рішення, але мені потрібно, щоб ваги були негативними.

Відповіді:


27

Те, що ви шукаєте, - це негативна найменша квадратна регресія . Це проста проблема оптимізації в квадратичному програмуванні, де ваше обмеження полягає в тому, що всі коефіцієнти (так само ваги) повинні бути позитивними.

Сказавши це, у Scikit-Learn немає стандартної реалізації найнегативніших найменших квадратів. Запит на виклик все ще відкритий .

Але, схоже, Scipy реалізував те саме .

PS: Я не пробував версію scipy. Я знайшов це виключно, гуляючи.


1
як щодо регресії хребта, де вона змушена позитиву?
Чарлі Паркер

15

Я використовую вирішення Lasso на 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 () та встановити параметр альфа як мінімум, щоб отримати можливість отримати розумну відповідь.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.