Scipy Optimize Minimum返回初始值

时间:2019-02-08 16:01:36

标签: optimization scipy decision-tree minimization

我正在为某些数据集构建机器学习模型。然后,基于输出和输入的约束和界限,我试图找到最最小化答案的输入参数。 我面临的问题是,当模型是线性回归模型或套索之类的东西时,最小化工作得很好。 但是,当模型为“决策树”时,它将不断返回为其提供的初始值。因此,基本上,它不强制执行约束。

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)

这是我的Objective函数:

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]

2 个答案:

答案 0 :(得分:0)

我认为您应该检查“ sol”的输出。有时,该算法无法完全执行行搜索。要对此进行检查,您应该检查与“ sol”相关的消息。在这种情况下,优化器本身将返回初始参数。此行为可能有多种原因。简而言之,请检查sol的输出并采取相应措施。

答案 1 :(得分:0)

阿拉德,

如果尚未解决问题,请尝试使用scipy.optimize.differential_evolution而不是scipy.optimize.minimize。我遇到了类似的问题,尤其是决策树,因为它们的步阶行为会导致无限的梯度。