Comment effectuer une régression de crête non négative? Le lasso non négatif est disponible en scikit-learn
, mais pour la crête, je ne peux pas imposer la non-négativité des bêtas, et en effet, j'obtiens des coefficients négatifs. Est-ce que quelqu'un sait pourquoi c'est comme ça?
De plus, puis-je implémenter ridge en termes de moindres carrés réguliers? Déplacé ceci vers une autre question: Puis-je implémenter la régression de crête en termes de régression OLS?
Réponses:
La réponse plutôt anti-climatique à " Quelqu'un sait-il pourquoi? " Est que tout le monde ne se soucie pas suffisamment de mettre en œuvre une routine de régression de crête non négative. L'une des principales raisons est que les gens ont déjà commencé à mettre en œuvre des routines à filet élastique non négatif (par exemple ici et ici ). Le filet élastique inclut la régression de crête comme cas spécial (l'un a essentiellement défini la partie LASSO pour avoir une pondération nulle). Ces travaux sont relativement nouveaux et n'ont donc pas encore été intégrés à scikit-learn ou à un package similaire à usage général. Vous voudrez peut-être demander aux auteurs de ces articles le code.
ÉDITER:
Comme @amoeba et moi avons discuté des commentaires, la mise en œuvre réelle de ceci est relativement simple. Supposons que l'on ait le problème de régression suivant:
où et sont tous deux des normales standard telles que: . Remarquez que j'utilise des variables prédictives standardisées, je n'ai donc pas besoin de normaliser par la suite. Par souci de simplicité, je n'inclus pas d'interception non plus. Nous pouvons immédiatement résoudre ce problème de régression en utilisant une régression linéaire standard. Donc, dans R, cela devrait être quelque chose comme ceci:x 2 x p ∼ N ( 0 , 1 )x1 x2 xp∼N(0,1)
Remarquez la dernière ligne. Presque toutes les routines de régression linéaire utilisent la décomposition QR pour estimer . Nous aimerions utiliser la même chose pour notre problème de régression de crête. À ce stade, lisez ce message de @whuber; nous mettrons en œuvre exactement cette procédure. En bref, nous allons augmenter notre matrice de conception originale avec une matrice diagonale et notre vecteur de réponse avec zéros. De cette façon, nous serons en mesure de ré-exprimer le problème de régression de crête d'origine as où leX √β X yp(XTX+λI) - 1 XTy( ˉ X T ˉ X ) - 1 ˉ X T ˉ y ¯λ−−√Ip y p (XTX+λI)−1XTy (X¯TX¯)−1X¯Ty¯ ¯ symbolise la version augmentée. Vérifiez les diapositives 18-19 de ces notes aussi pour être complètes, je les ai trouvées assez simples. Donc, dans R, nous aimerions certains:
qui, comme prévu, fonctionne à nouveau. Alors maintenant, nous voulons juste: où . Ce qui est tout simplement le même problème d'optimisation mais contraint pour que la solution ne soit pas négative. β≥0minβ| | y¯- X¯β| |22 β≥ 0
ce qui montre que la tâche de régression de crête non négative d'origine peut être résolue en reformulant comme un simple problème d'optimisation contraint. Quelques mises en garde:
optim
l' argument L-BFGS-B de . C'est le solveur R le plus vanillé qui accepte les limites. Je suis sûr que vous trouverez des dizaines de meilleurs solveurs.Code pour le point 5:
la source
Le paquet R glmnet qui met en œuvre un filet élastique et donc le lasso et la crête le permettent. Avec les paramètres
lower.limits
etupper.limits
, vous pouvez définir une valeur minimale ou maximale pour chaque poids séparément, donc si vous définissez des limites inférieures à 0, il effectuera un filet élastique non négatif (lasso / crête).Il existe également un wrapper python https://pypi.python.org/pypi/glmnet/2.0.0
la source
Rappelons que nous essayons de résoudre:
est équivalent à:
avec un peu plus d'algèbre:
La solution en pseudo-python est simplement de faire:
voir: Comment peut-on faire des moindres carrés non négatifs clairsemés en utilisant régulariseurs de la forme ?x ⊤ R k xK X⊤RkX
pour une réponse un peu plus générale.
la source