Пользовательская функция потери: длина значений не соответствует длине индекса - PullRequest
0 голосов
/ 12 марта 2019

Для дерева решений с градиентным усилением я реализовал пользовательскую функцию потерь, которая выглядит следующим образом (и работает):

def softmax(mat):
    res = np.exp(mat)
    res = np.multiply(res, 1/np.sum(res, axis=1, keepdims=True))
    return res

def custom_asymmetric_objective(y_true, y_pred_encoded):
    pred = y_pred_encoded.reshape((-1, 3), order='F')
    pred = softmax(pred)
    y_true = OneHotEncoder(sparse=False, categories='auto').fit_transform(y_true.reshape(-1, 1))
    grad = (pred - y_true).astype("float")
    hess = 2.0 * pred * (1.0-pred)
    return grad.flatten('F'), hess.flatten('F')

Теперь я хотел бы добавить что-то к целевой функции. Он рассчитывается с использованием существующего фрейма данных, а затем добавляется столбец, который затем включается в функцию потерь:

def custom_asymmetric_objective(y_true, y_pred_encoded):
    pred = y_pred_encoded.reshape((-1, 3), order='F')
    pred = softmax(pred)
    y_true = OneHotEncoder(sparse=False, categories='auto').fit_transform(y_true.reshape(-1, 1))
    #calculaten beta for each item in test data
    df2 = df.drop(['h', 'b','Label','w'], axis=1)
    betadf = df2.join(y_test, how = "right")
    betadf['pred']=y_pred_encoded
    overallmu = betadf['mu'].sum()
    betadf['w'] = (betadf['mu']/overallmu)
    label2value = {1: 0.11722, 2: 0.0124}
    factors = betadf['pred'].map(lambda n: label2value.get(n, 0.003))
    betadf['beta'] = betadf['w'] * (1 - ((betadf['sdL'] * factors) / betadf['muL']))
    #calculate deviance between beta and the average beta for each item
    average = 0.95/153
    betadf['penalty'] = 0
    betadf['penalty'].where(betadf['beta']-average > 0, average-betadf['beta'], inplace=True)
    pen = betadf['penalty']
    #get pen in same shape as y_true 
    pen = OneHotEncoder(sparse=False, categories='auto').fit_transform(pen.reshape(-1, 1))
    grad = (pred - y_true + pen).astype("float")
    hess = 2.0 * pred * (1.0-pred)
    return grad.flatten('F'), hess.flatten('F')

Если я запускаю функцию, я получаю ошибку «Длина значений не соответствует длине индекса». Я проверил «ручку» отдельно и все работает. Так что я не понимаю, откуда эта ошибка

...