Custom Loss Function: Length of values does not match length of index

Wenn du dir nicht sicher bist, in welchem der anderen Foren du die Frage stellen sollst, dann bist du hier im Forum für allgemeine Fragen sicher richtig.
Antworten
Lizzy
User
Beiträge: 48
Registriert: Mittwoch 30. Januar 2019, 15:22

Ich habe im Rahmen eines gradient boosted classifiers (decision tree) eine custom loss function implementiert die folgendermaßen aussieht und funktioniert:

Code: Alles auswählen

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')
Nun möchte ich einen weiteren "Wert" mit einbeziehen. Die Berechnung ist etwas kompliziert, hier wird einem existierenden data frame eine neue Spalte zugefügt, die dann am Ende auch noch in der loss function berücksichtigt werden soll.

Code: Alles auswählen

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']
    #da pen die selbe shape und den selben typ wie y_true hat, gehe ich davon aus dass die Transformation gleich ist 
    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')

Nun bekomme ich aber den Fehler: "Length of values does not match length of index" sobald ich diese Funktion aufrufe. Ich habe die verschiedenen shapes gecheckt und kann keinen Fehler finden.
Antworten