首页 > 解决方案 > 将 Keras 用于带有自定义 Y 参数的 sklearn AdaBoost

问题描述

我正在尝试将 AdaBoost 应用于 Keras 模型。问题是我必须使用自定义损失函数(未缩放的偏差),当我将 Keras 用于 sklearn 的 RandomizedSearchCV 时效果很好,但是当我尝试使用 AdaBoostRegressor 时,我得到:

ValueError: y should be a 1d array, got an array of shape (64501, 2) instead.

这个错误来自于在我的自定义损失函数中,我使用了三个参数。然而 Keras 只接受两个参数 (y_true, y_pred),所以我通过传递一个包含两个值而不是 y_true 的元组来绕过它,如下所示:

#Loss function     
def deviance(data, y_pred):
    y_true = data[:, 0]
    d = data[:, 1]
    
    lnY = KB.log(y_true)
    bool1 = KB.equal(y_true, 0)
    zeros = KB.zeros_like(y_true)
    lnY = KB.switch(bool1, zeros, lnY)
    
    lnYp = KB.log(y_pred)
    bool2 = KB.equal(y_pred, 0)
    zeross = KB.zeros_like(y_pred)
    lnYp = KB.switch(bool2, zeross, lnYp)
    
    loss = 2 * d * (y_true * lnY - y_true * lnYp[:, 0] - y_true + y_pred[:, 0])
    return loss

因此,程序获取元组(称为“feed”)并将其解包以计算未缩放的偏差。然后我像这样使用它并且它可以工作:

grid = RandomizedSearchCV(pipeline, cv = cv, param_distributions=param_grid, verbose=2, n_iter = 40) #plus de folds pourraient augmenter la variance
grid.fit(data, feed)

但是现在,我想在 AdaboostRegressor 中使用这个 keras 模型,方法是:

from keras.wrappers.scikit_learn import KerasRegressor
from sklearn.model_selection import GridSearchCV, RandomizedSearchCV
from sklearn.pipeline import Pipeline
from sklearn.model_selection import KFold

def baseline_model2(dropout = 0.2, kernel_initializer = 'glorot_uniform', nn1 = 15, nn2 = 10, lr = 0.001, act1 = "relu"):
    with tf.device('/gpu:0'):
        # create model
        #building model
        model = keras.Sequential()
        model.add(Dense(nn1, input_dim = 21, activation = act1, kernel_initializer=kernel_initializer))
        model.add(Dropout(dropout))
        #model.add(Dense(2, activation = "exponential"))
        model.add(Dense(nn2, activation = act1))
        model.add(Dense(1, activation = "exponential", kernel_initializer=kernel_initializer))
        optimizer = keras.optimizers.adagrad(lr=lr)
        model.compile(loss=deviance, optimizer=optimizer, metrics = [deviance, "mean_squared_error"])
        return model


clf = KerasRegressor(build_fn=baseline_model2)

from sklearn.ensemble import AdaBoostRegressor
boostedNN = AdaBoostRegressor(base_estimator=clf)
boostedNN.fit(data, feed)

正是这部分给了我ValueError。我知道这是因为我为算法提供了一个元组,但我正在寻找一种绕过它的方法,因为 Keras 需要该元组才能正确评估偏差。我认为在 skl 库中编辑一两行可以解决问题,但我自己没有找到合适的地方来做这件事。

标签: pythontensorflowkerasadaboost

解决方案


推荐阅读