¿Cómo realizar una regresión de cresta no negativa? El lazo no negativo está disponible en scikit-learn
, pero para cresta, no puedo imponer la no negatividad de las versiones beta, y de hecho, estoy obteniendo coeficientes negativos. ¿Alguien sabe a que se debe esto?
Además, ¿puedo implementar la cresta en términos de mínimos cuadrados regulares? Moví esto a otra pregunta: ¿Puedo implementar la regresión de cresta en términos de regresión OLS?
regression
lasso
regularization
ridge-regression
El baron
fuente
fuente
Respuestas:
La respuesta más bien anti-climática a " ¿Alguien sabe por qué es esto? " Es que simplemente a nadie le importa lo suficiente como para implementar una rutina de regresión de cresta no negativa. Una de las razones principales es que las personas ya han comenzado a implementar rutinas de red elásticas no negativas (por ejemplo, aquí y aquí ). Elastic net incluye la regresión de cresta como un caso especial (uno esencialmente configura la parte LASSO para que tenga una ponderación cero). Estos trabajos son relativamente nuevos, por lo que aún no se han incorporado a scikit-learn o un paquete de uso general similar. Es posible que desee consultar a los autores de estos documentos para obtener el código.
EDITAR:
Como @amoeba y yo discutimos sobre los comentarios, la implementación real de esto es relativamente simple. Digamos que uno tiene el siguiente problema de regresión para:
donde y x 2 son ambos normales estándar, tales como: x p ~ N ( 0 , 1 ) . Tenga en cuenta que uso variables predictoras estandarizadas para no tener que normalizar después. Por simplicidad, tampoco incluyo una intercepción. Podemos resolver de inmediato este problema de regresión utilizando la regresión lineal estándar. Entonces en R debería ser algo como esto:X1 X2 Xpag∼ N( 0 , 1 )
lo que muestra que la tarea original de regresión de cresta no negativa se puede resolver reformulando como un simple problema de optimización restringida. Algunas advertencias:
optim
's L-BFGS-B argumento. Es el solucionador más vainilla R que acepta límites. Estoy seguro de que encontrará docenas de mejores solucionadores.Código para el punto 5:
fuente
R paquete glmnet que implementa una red elástica y, por lo tanto, el lazo y la cresta lo permiten. Con los parámetros
lower.limits
yupper.limits
, puede establecer un valor mínimo o máximo para cada peso por separado, por lo que si establece límites inferiores a 0, se realizará una red elástica no negativa (lazo / cresta).También hay un contenedor de python https://pypi.python.org/pypi/glmnet/2.0.0
fuente
Recordemos que estamos tratando de resolver:
es equivalente a:
con algo más de álgebra:
La solución en pseudo-python es simplemente hacer:
para una respuesta un poco más general.
fuente