将Keras用于带有自定义Y参数的sklearn AdaBoost

2024-06-28 11:04:03 发布

您现在位置:Python中文网/ 问答频道 /正文

我试图将AdaBoost应用于Keras模型。问题是,我必须使用自定义损失函数(无标度偏差),当我在sklearn的随机搜索CV中使用Keras时,该函数运行良好,但当我尝试使用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)

但是现在,我想在Adaboostregrestor中使用这个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库中编辑一两行可以做到这一点,但我自己没有找到合适的地方


Tags: fromimportaddtruedatamodelkbzeros