python - 将 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 库中编辑一两行可以解决问题,但我自己没有找到合适的地方来做这件事。
解决方案
推荐阅读
- matlab - 一次保存多个图形
- c# - 为什么松开操纵杆时我的游戏对象会返回到某个 z 位置?
- python - 删除文件中的一行
- android - 如何在android studio中通过触摸移动、旋转和调整文本?
- coldfusion - Coldfusion 11 和 Coldfusion 2016 之间的编码问题
- html - 如何将 SVG 添加到切换按钮?
- javascript - DOM元素折叠时防止页面跳转
- java - 将 jar 文件添加到 buildpath 并获得权限被拒绝错误
- python - 使用正则表达式返回日期字符串
- python - 如果某些软件包将被降级或删除,运行“conda update anaconda”是否安全?