Позвольте мне ответить на мой собственный вопрос.
Аргументы в целевой функции должны быть:
y_true of size [n_sample, ]
y_pred of size [n_sample * n_class, ] instead of [n_sample, n_class]
Чтобы быть более точным, y_pred должен быть похож на
y_pred = [first_class, first_class,..., second_class, second_class,..., third_class, third_class,...]
Более того, градиент и гессиан должны быть сгруппированы одинаково.
def objective(y_true, y_pred):
'''
input:
y_true: np.array of size [n_sample,]
y_pred: np.array of size [n_sample * n_class, ]
return:
gradient and hessian should have exactly the same form of y_pred
'''
y_pred = np.reshape(y_pred, [num_train, 3], order = 'F')
y_pred = softmax(y_pred)
temp = np.zeros_like(y_pred)
temp[range(y_pred.shape[0]), y_true] = 1
gradient = y_pred - temp
hessian = y_pred * (1 - y_pred)
return [gradient.ravel(order = 'F'), hessian.ravel(order = 'F')]