使用 scipy.optimize.minimize 提前停止损失函数
Early stopping of loss function using scipy.optimize.minimize
我正在使用 scipy.optimize.minimize 库来自定义编写我的损失函数。
https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
def customised_objective_func(x):
global lag1
global lag2
global lag3
global lag4
pred = []
err = []
df_col_others_copy=df_col_others.copy(deep=True)
df_col_others_copy*=np.array(x)
pred=intercept_val+df_col_others_copy.sum(axis=1)
pred=list(pred)
col_sales=list(df_col_sales)
err = np.array(pred) - np.array(col_sales)
#err = pred - col_sales
obj_func_cust=sum(err**2)/len(err) + (lambda_mult* pen_func(x))
# CONDITION CHECK
avg_lags_val=(lag1+lag2+lag3+lag4)/float(4.0)
perc_change=(np.abs(obj_func_cust-avg_lag_val)/float(avg_lags_val))*100
if perc_change>=2.0:
break --###?? Sntax for breaking out here??
# retaining last 4 values
curr=obj_func_cust
lag4=lag3
lag3=lag2
lag2=lag1
lag1=curr
if curr=0:
return obj_func_cust
myoptions={'maxiter':1000}
results = minimize(customised_objective_func,params,method = "BFGS",options = myoptions)
我保留了为最后 4 次迭代计算的损失函数的值,如果满足该条件,我想检查它们的一些差异我想停止函数调用(甚至退出进一步的函数执行以进行更多迭代如果 1000 次迭代未完成。
我怎样才能做到这一点?希望在此帮助您将关键字设为 used/syntx?
由于您需要最后四个 objective 函数值并且您无法在 objective 函数内终止求解器,因此您可以编写一个包含回调和 objective 函数:
class Wrapper:
def __init__(self, obj_fun, cond_fun, threshold):
self.obj_fun = obj_fun
self.cond_fun = cond_fun
self.threshold = threshold
self.last_vals = np.zeros(5)
self.iters = 0
def callback(self, xk):
if self.iters <= 4:
return False
if self.cond_fun(self.last_vals) <= self.threshold:
return True
def objective(self, x):
# evaluate the obj_fun, update the last four objective values
# and return the current objective value
np.roll(self.last_vals, 1)
obj_val = self.obj_fun(x)
self.last_vals[0] = obj_val
self.iters += 1
return obj_val
callback
方法 returns True
并在您的 cond_fun
在最后四个值的评估低于给定的 threshold
时终止求解器。这里,xk
只是当前点。 objective
方法只是对 obj_fun
的包装,并更新最后的 objective 值。
那么,你可以这样使用:
def your_cond_fun(last_obj_vals):
curr = last_obj_vals[0]
last4 = last_obj_vals[1:]
avg_vals = np.sum(last4) / last4.size
return 100*np.abs(curr - avg_vals) / avg_vals
wrapper = Wrapper(your_obj_fun, your_cond_fun, your_threshold)
minimize(wrapper.objective, params, callback = wrapper.callback,
method = "BFGS", options = myoptions)
如果 callback
returns 为真,optimize
中的所有方法都不会终止。事实上,我记得只有一种方法会按预期终止,但我不确定是哪一种。
结帐:https://github.com/scipy/scipy/pull/4384
此外,您可以更改源代码scipy.optimize._minimize
以在检查回调时终止。
代码快照如下:
if callback is not None:
if unknown_options.get("early_stopping"):
# NEW: update with early stopping
res = callback(xk)
if res:
break
else:
callback(xk)
我正在使用 scipy.optimize.minimize 库来自定义编写我的损失函数。 https://docs.scipy.org/doc/scipy/reference/generated/scipy.optimize.minimize.html
def customised_objective_func(x):
global lag1
global lag2
global lag3
global lag4
pred = []
err = []
df_col_others_copy=df_col_others.copy(deep=True)
df_col_others_copy*=np.array(x)
pred=intercept_val+df_col_others_copy.sum(axis=1)
pred=list(pred)
col_sales=list(df_col_sales)
err = np.array(pred) - np.array(col_sales)
#err = pred - col_sales
obj_func_cust=sum(err**2)/len(err) + (lambda_mult* pen_func(x))
# CONDITION CHECK
avg_lags_val=(lag1+lag2+lag3+lag4)/float(4.0)
perc_change=(np.abs(obj_func_cust-avg_lag_val)/float(avg_lags_val))*100
if perc_change>=2.0:
break --###?? Sntax for breaking out here??
# retaining last 4 values
curr=obj_func_cust
lag4=lag3
lag3=lag2
lag2=lag1
lag1=curr
if curr=0:
return obj_func_cust
myoptions={'maxiter':1000}
results = minimize(customised_objective_func,params,method = "BFGS",options = myoptions)
我保留了为最后 4 次迭代计算的损失函数的值,如果满足该条件,我想检查它们的一些差异我想停止函数调用(甚至退出进一步的函数执行以进行更多迭代如果 1000 次迭代未完成。
我怎样才能做到这一点?希望在此帮助您将关键字设为 used/syntx?
由于您需要最后四个 objective 函数值并且您无法在 objective 函数内终止求解器,因此您可以编写一个包含回调和 objective 函数:
class Wrapper:
def __init__(self, obj_fun, cond_fun, threshold):
self.obj_fun = obj_fun
self.cond_fun = cond_fun
self.threshold = threshold
self.last_vals = np.zeros(5)
self.iters = 0
def callback(self, xk):
if self.iters <= 4:
return False
if self.cond_fun(self.last_vals) <= self.threshold:
return True
def objective(self, x):
# evaluate the obj_fun, update the last four objective values
# and return the current objective value
np.roll(self.last_vals, 1)
obj_val = self.obj_fun(x)
self.last_vals[0] = obj_val
self.iters += 1
return obj_val
callback
方法 returns True
并在您的 cond_fun
在最后四个值的评估低于给定的 threshold
时终止求解器。这里,xk
只是当前点。 objective
方法只是对 obj_fun
的包装,并更新最后的 objective 值。
那么,你可以这样使用:
def your_cond_fun(last_obj_vals):
curr = last_obj_vals[0]
last4 = last_obj_vals[1:]
avg_vals = np.sum(last4) / last4.size
return 100*np.abs(curr - avg_vals) / avg_vals
wrapper = Wrapper(your_obj_fun, your_cond_fun, your_threshold)
minimize(wrapper.objective, params, callback = wrapper.callback,
method = "BFGS", options = myoptions)
如果 callback
returns 为真,optimize
中的所有方法都不会终止。事实上,我记得只有一种方法会按预期终止,但我不确定是哪一种。
结帐:https://github.com/scipy/scipy/pull/4384
此外,您可以更改源代码scipy.optimize._minimize
以在检查回调时终止。
代码快照如下:
if callback is not None:
if unknown_options.get("early_stopping"):
# NEW: update with early stopping
res = callback(xk)
if res:
break
else:
callback(xk)