我正在为某个数据集构建机器学习模型。然后,基于输出和输入的约束和界限,我试图找到最小化答案的输入参数。我面临的问题是,当模型是线性回归模型或类似套索时,最小化效果非常好。但是,当模型是“决策树”时,它会不断返回给定的初始值。所以基本上,它不会强制执行约束。
import numpy as np
import pandas as pd
from scipy.optimize import minimize
我正在使用输入数据集中的第一个样本进行优化。由于它只是一个样本,我需要将其重塑为(1,-1)。
x = df_in.iloc[0,:]
x = np.array(x)
x = x.reshape(1,-1)
这是我的目标函数:
def objective(x):
x = np.array(x)
x = x.reshape(1,-1)
y = 0
for n in range(df_out.shape[1]):
y = Model[n].predict(x)
Y = y[0]
return Y
在这里,我定义了输入的界限:
range_max = pd.DataFrame(range_max)
range_min = pd.DataFrame(range_min)
B_max=[]
B_min =[]
for i in range(range_max.shape[0]):
b_max = range_max.iloc[i]
b_min = range_min.iloc[i]
B_max.append(b_max)
B_min.append(b_min)
B_max = pd.DataFrame(B_max)
B_min = pd.DataFrame(B_min)
bnds = pd.concat([B_min, B_max], axis=1)
这些是我的约束:
con_min = pd.DataFrame(c_min)
con_max = pd.DataFrame(c_max)
这里我定义了约束函数:
def const(x):
x = np.array(x)
x = x.reshape(1,-1)
Y = []
for n in range(df_out.shape[1]):
y = Model[n].predict(x)[0]
Y.append(y)
Y = pd.DataFrame(Y)
a4 =[]
for k in range(Y.shape[0]):
a1 = Y.iloc[k,0] - con_min.iloc[k,0]
a2 = con_max.iloc[k, 0] - Y.iloc[k,0]
a3 = [a2,a1]
a4 = np.concatenate([a4, a3])
return a4
c = const(x)
con = {'type': 'ineq', 'fun': const}
这是我尽量减少的地方。我不选择一种方法,因为自动选择的模型到目前为止已经有效。
sol = minimize(fun = objective, x0=x,constraints=con, bounds=bnds)
所以实际的限制是:
c_min = [0.20,1000]
c_max = [0.3,1600]
并且边界的最大和最小范围是:
range_max = [285,200,8,85,0.04,1.6,10,3.5,20,-5]
range_min = [215,170,-1,60,0,1,6,2.5,16,-18]
我想你应该检查'sol'的输出。有时,该算法无法完全执行线搜索。要检查这一点,您应该检查与'sol'关联的消息。在这种情况下,优化器本身返回初始参数。这种行为可能有多种原因。简而言之,请检查sol的输出并采取相应的行动。