我试图将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库中编辑一两行可以做到这一点,但我自己没有找到合适的地方
目前没有回答
相关问题 更多 >
编程相关推荐