Keras 神经网络的部分依赖图

Posted

技术标签:

【中文标题】Keras 神经网络的部分依赖图【英文标题】:Partial Dependence Plot for a Keras Neural Network 【发布时间】:2020-11-19 17:01:05 【问题描述】:

我有一个使用Keras Sequential API 构建的密集连接的神经网络。我正在尝试创建一些部分依赖图(PDP)以用于敏感性分析。我正在尝试使用scikit-learn plot_partial_dependence 函数来执行此操作。我收到以下错误:ValueError: 'estimator' must be a fitted regressor or classifier.。当它第一次发生时,我添加了KerasClassifier 的使用。我过去曾成功使用它在scikit-learn GridSearchCV 中使用我的 Keras 模型。我仍然遇到同样的错误。我也试过KerasRegressor

谁能告诉我出了什么问题以及我该如何解决?我是否绝对需要使用 scikit-learn 的基于决策树的函数才能使用 PDP 函数?如果是,Keras 神经网络和决策树之间最大的实现区别是什么? (我从未使用过决策树。我的机器学习经验仅限于 Keras。)

我的相关代码如下,我在 google colab 的 GPU 上运行 python。我确定最后一行有几个问题,但我无法通过这个来解决它们。

from sklearn.inspection import plot_partial_dependence
from keras.wrappers.scikit_learn import KerasClassifier
from keras.wrappers.scikit_learn import KerasRegressor

def create_model():
  def swish(x):
    return (x*sigmoid(x))

  from keras.utils.generic_utils import get_custom_objects
  from keras.layers import Activation
  get_custom_objects().update('swish':(swish))

  model=Sequential()

  model.add(Dense(1024,activation='swish',input_shape=(6,)))
  model.add(Dropout(.1))

  model.add(Dense(512,activation='swish'))

  model.add(Dense(256,activation='swish'))
  model.add(Dropout(.1))

  model.add(Dense(128,activation='swish'))

  model.add(Dense(64,activation='swish'))
  model.add(Dropout(.1))

  model.add(Dense(32,activation='swish'))

  model.add(Dense(16,activation='swish'))
  model.add(Dropout(.1))

  model.add(Dense(12, activation='softmax'))

  opt=optimizers.Adam(lr=0.05)

  model.compile(loss='categorical_crossentropy',optimizer='adam', metrics=['accuracy'])

  return model

from keras.callbacks import LearningRateScheduler
from keras.callbacks import EarlyStopping
import math
def scheduler(epoch, lr):
  if epoch < 20:
    return lr
  else:
    return lr * math.exp(-0.1)

callback=LearningRateScheduler(scheduler, verbose=1)

weightsCallback=EarlyStopping(patience=30,monitor='accuracy',restore_best_weights=True, min_delta=1*10**-5, verbose=1)

modelClassified=KerasClassifier(build_fn=create_model)

modelClassified.fit(X_train, Y_train, batch_size=50, epochs=50, callbacks=[callback,weightsCallback], verbose=1)

disp=plot_partial_dependence(modelClassified, X_holdout,target=1, verbose =1, features=[0,1,2,3,4,5], feature_names=['aspect ratio','diel inner radius','diel outer radius','diel seperation','diel height','diel constant'])

【问题讨论】:

【参考方案1】:

我发现这个错误实际上是一个错误。无论如何,我的程序应该工作得很好。 plot_partial_dependence函数源码有错误。

有关更多详细信息和我用来使其工作的解决方案,请参阅指向另一个 *** 问题的链接:https://***.com/a/61485502/13822019

【讨论】:

以上是关于Keras 神经网络的部分依赖图的主要内容,如果未能解决你的问题,请参考以下文章

在 Keras 进行修剪

利用Keras搭建LSTM循环神经网络

Keras快速构建神经网络模型

深度学习入门,keras实现回归模型

Keras Sequential顺序模型

理解keras中的sequential模型