Scipy Optimize свести к минимуму возвращает начальное значение - PullRequest
0 голосов
/ 08 февраля 2019

Я строю модели машинного обучения для определенного набора данных.Затем, основываясь на ограничениях и границах для выходов и входов, я пытаюсь найти входные параметры для наиболее минимизированного ответа.Проблема, с которой я сталкиваюсь, заключается в том, что, когда модель представляет собой модель линейной регрессии или что-то вроде лассо, минимизация работает идеально.Однако, когда модель называется «Дерево решений», она постоянно возвращает то самое начальное значение, которое ей дано.Таким образом, в основном, это не обеспечивает ограничения.

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]

1 Ответ

0 голосов
/ 28 апреля 2019

Я думаю, вы должны проверить вывод 'sol'.Иногда алгоритм не может выполнить поиск строки полностью.Чтобы проверить это, вы должны проверить сообщение, связанное с 'sol'.В таком случае оптимизатор сам возвращает исходные параметры.Там могут быть различные причины такого поведения.В двух словах, пожалуйста, проверьте вывод sol и действуйте соответственно.

...