def get_next_by_EI(ni, alpha, lr, lr_time, X, y, ei_xi):
'''
Args:
ni: number of units in the each layer
alpha: lambda for Ridge regression
lr: fitted performance model in burning period
lr_time: fitted time model in burning period
X: all previous inputs x
y: all previous observations corresponding to X
ei_xi: parameter for EI exploitation-exploration trade-off
Returns:
x_next: a nested list [[0,1,0], [1,0,0,0], ...] as the next input x to run a specified pipeline
'''
var = np.var(lr.predict(X) - y)
m = np.dot(X.T, X)
inv = np.linalg.inv(m + alpha * np.eye(sum(ni)))
maxEI = float('-inf')
x_next = None
for i in range(np.prod(ni)):
x = [[0]*n for n in ni]
x_flat = []
pipeline = get_pipeline_by_flatten_index(ni, i)
for layer in range(len(ni)):
x[layer][pipeline[layer]] = 1
x_flat += x[layer]
x_flat = np.array(x_flat)
mu_x = lr.predict([x_flat])
var_x = var * (1 + np.dot(np.dot(x_flat, inv), x_flat.T))
sigma_x = np.sqrt(var_x)
u = (np.min(y) - ei_xi - mu_x) / sigma_x
EI = sigma_x * (u*norm.cdf(u) + norm.pdf(u))
estimated_time = lr_time.predict([x_flat])[0]
EIPS = EI / estimated_time
if EIPS > maxEI:
maxEI = EIPS
x_next = x
return x_next
评论列表
文章目录