Tengo un problema de regresión multilineal en el que tengo la información previa sobre el rango de la salida (variable dependiente y): la predicción siempre debe estar en ese rango.
Quiero encontrar los coeficientes (límite superior e inferior) de cada característica (variables independientes) para restringir el modelo de regresión lineal al rango deseado de salida.
Por ejemplo, quiero aplicar esta solución en sklearn.datasets.load_boston donde sé que el precio de la casa estará en el rango de [10, 40] (los valores mínimo y máximo reales de y son [5,50] ).
En el siguiente ejemplo, mi objetivo es 10 < yp < 40 y en base a esto quiero encontrar el límite mínimo y máximo de todos los coeficientes
from sklearn.datasets import load_boston
import numpy as np
import pandas as pd
from gekko import GEKKO
# Loading the dataset
x, y = load_boston(return_X_y=True)
c = m.Array(m.FV, x.shape[1]+1) #array of parameters and intercept
for ci in c:
ci.STATUS = 1 #calculate fixed parameter
ci.LOWER = 1 #constraint: lower limit
ci.UPPER = 0 #constraint: lower limit
#Define variables
xd = m.Array(m.Param,x.shape[1])
for i in range(x.shape[1]):
xd[i].value = x[i]
yd = m.Param(y); yp = m.Var()
#Equation of Linear Functions
y_pred = c[0]*xd[0]+\
c[1]*xd[1]+\
c[2]*xd[2]+\
c[3]*xd[3]+\
c[4]*xd[4]+\
c[5]*xd[5]+\
c[6]*xd[6]+\
c[7]*xd[7]+\
c[8]*xd[8]+\
c[9]*xd[9]+\
c[10]*xd[10]+\
c[11]*xd[11]+\
c[12]*xd[12]+\
c[13]
#Inequality Constraints
yp = m.Var(lb=5,ub=40)
m.Equation(yp==y_pred)
#Minimize difference between actual and predicted y
m.Minimize((yd-yp)**2)
#Solve
m.solve(disp=True)
#Retrieve parameter values
a = [i.value[0] for i in c]
print(a)
El código enumerado me da un error de solución no encontrada. ¿Puedes señalar lo que estoy haciendo mal aquí, o me estoy perdiendo algo importante? Además, ¿cómo puedo obtener el límite superior e inferior de c para todas las variables independientes?
Prueba IMODE=2
con el modo de regresión. Hay algunas modificaciones, como x[:,i]
cargar los datos y ci.LOWER=0
los límites inferior y ci.UPPER=1
superior.
from sklearn.datasets import load_boston
import numpy as np
import pandas as pd
from gekko import GEKKO
m = GEKKO(remote=False)
# Loading the dataset
x, y = load_boston(return_X_y=True)
n = x.shape[1]
c = m.Array(m.FV, n+1) #array of parameters and intercept
for ci in c:
ci.STATUS = 1 #calculate fixed parameter
ci.LOWER = 0 #constraint: lower limit
ci.UPPER = 1 #constraint: lower limit
#Load data
xd = m.Array(m.Param,n)
for i in range(n):
xd[i].value = x[:,i]
yd = m.Param(y)
#Equation of Linear Functions
yp = m.Var(lb=5,ub=40)
m.Equation(yp==m.sum([c[i]*xd[i] \
for i in range(n)]) + c[13])
#Minimize difference between actual and predicted y
m.Minimize((yd-yp)**2)
#Regression mode
m.options.IMODE=2
#APOPT solver
m.options.SOLVER = 1
#Solve
m.solve(disp=True)
#Retrieve parameter values
a = [i.value[0] for i in c]
print(a)
La solución a este problema restringido se obtiene con el IPOPT o APOPT (ligeramente más rápido).
Number of state variables: 7604
Number of total equations: - 7590
Number of slack variables: - 0
---------------------------------------
Degrees of freedom : 14
----------------------------------------------
Model Parameter Estimation with APOPT Solver
----------------------------------------------
Iter Objective Convergence
0 5.60363E+04 1.25000E+00
1 1.87753E+05 6.66134E-16
2 3.06630E+04 9.99201E-16
3 3.06630E+04 3.84187E-16
5 3.06630E+04 1.35308E-16
Successful solution
---------------------------------------------------
Solver : APOPT (v1.0)
Solution time : 0.48429999999999995 sec
Objective : 30662.976306748842
Successful solution
---------------------------------------------------
[0.0, 0.11336851243, 0.0, 1.0, 0.43491543768,
1.0, 0.0, 0.0, 0.0, 0.0, 0.0, 0.037613878067,
0.0, 1.0]
Este artículo se recopila de Internet, indique la fuente cuando se vuelva a imprimir.
En caso de infracción, por favor [email protected] Eliminar
Déjame decir algunas palabras