Когда вы добавляете суммы элементов массива в модель PuLP
, вы должны использовать для этого встроенные конструкции PuLP
, такие как lpSum
- вы не можете просто добавлять массивы вместе (как вы обнаружили).
Итак, ваше определение score
должно выглядеть примерно так:
score = pulp.lpSum([train['target'][i] - (x * array1[i] + y * array2[i] + z * array3[i]) for i in arr_ind])
Несколько замечаний по этому поводу:
[+] Вы не предоставили определениеиз roc_auc_score
, поэтому я просто притворился, что он равен сумме поэлементной разницы между целевым массивом и взвешенной суммой трех других массивов.
[+] Я подозреваю, что ваш фактический расчет для roc_auc_score
нелинейно;подробнее об этом ниже.
[+] arr_ind
- это список индексов массивов, который я создал следующим образом:
# build array index
arr_ind = range(len(array1))
[+] Вы также не сделали этоговключите массивы, поэтому я создал их так:
array1 = np.random.rand(10, 1)
array2 = np.random.rand(10, 1)
array3 = np.random.rand(10, 1)
train = {}
train['target'] = np.ones((10, 1))
Вот мой полный код, который компилируется и выполняется, хотя я уверен, что он не даст вам того результата, на который вы надеетесь, так какЯ только что догадался о target
и roc_auc_score
:
import numpy as np
import pulp
# create the LP object, set up as a maximization problem
prob = pulp.LpProblem('Giapetto', pulp.LpMaximize)
# dummy arrays since arrays weren't in OP code
array1 = np.random.rand(10, 1)
array2 = np.random.rand(10, 1)
array3 = np.random.rand(10, 1)
# build array index
arr_ind = range(len(array1))
# set up decision variables
x = pulp.LpVariable('x', lowBound=0)
y = pulp.LpVariable('y', lowBound=0)
z = pulp.LpVariable('z', lowBound=0)
# dummy roc_auc_score since roc_auc_score wasn't in OP code
train = {}
train['target'] = np.ones((10, 1))
score = pulp.lpSum([train['target'][i] - (x * array1[i] + y * array2[i] + z * array3[i]) for i in arr_ind])
prob += score
coef = x + y + z
prob += coef == 1
# solve the LP using the default solver
optimization_result = prob.solve()
# make sure we got an optimal solution
assert optimization_result == pulp.LpStatusOptimal
# display the results
for var in (x, y,z):
print('Optimal weekly number of {} to produce: {:1.0f}'.format(var.name, var.value()))
Вывод:
Optimal weekly number of x to produce: 0
Optimal weekly number of y to produce: 0
Optimal weekly number of z to produce: 1
Process finished with exit code 0
Теперь, если ваша функция roc_auc_score
является нелинейной, у вас будут дополнительные проблемы.Я бы посоветовал вам попытаться сформулировать оценку линейным способом, возможно, используя дополнительные переменные (например, если вы хотите, чтобы оценка была абсолютной величиной).