如何应用 cross_val_score 来交叉验证我们自己的模型

Posted

技术标签:

【中文标题】如何应用 cross_val_score 来交叉验证我们自己的模型【英文标题】:How to apply cross_val_score to cross valid our own model 【发布时间】:2021-03-09 01:36:15 【问题描述】:

通常,我们通过以下方式将cross_val_score 应用于Sklearn 模型。

scores = cross_val_score(clf, X, y, cv=5, scoring='f1_macro')

现在我有自己的模型,我希望执行交叉验证。我应该如何处理它?

tf.keras.backend.clear_session()


model = tf.keras.models.Sequential()
model.add(Masking(mask_value=0.0, input_shape=(X_train.shape[1], X_train.shape[2])))
model.add(Bidirectional(LSTM(128, dropout=dropout, recurrent_dropout=Rdropout, return_sequences=True)))
# model.add(Bidirectional(LSTM(64, dropout=dropout, recurrent_dropout=Rdropout, return_sequences=True)))
# model.add(Bidirectional(LSTM(128, dropout=dropout, recurrent_dropout=Rdropout, return_sequences=True)))
model.add(Bidirectional(LSTM(32, dropout=dropout, recurrent_dropout=Rdropout)))
# model.add(Dense(6, activation='relu'))
# model.add(Dense(4, activation='relu'))
model.add(Dense(num_classes, activation='softmax'))

adamopt = tf.keras.optimizers.Adam(lr=0.003, beta_1=0.9, beta_2=0.999, epsilon=1e-8)
RMSopt = tf.keras.optimizers.RMSprop(lr=0.0007,rho=0.9, epsilon=1e-6)

model.compile(loss='binary_crossentropy',
              optimizer=RMSopt,
              metrics=['accuracy'])
print(cross_val_score(model, X_train, y_train, cv=2,scoring='accuracy'))

TypeError: Cannot clone object '<tensorflow.python.keras.engine.sequential.Sequential object at 0x7f86481170f0>' (type <class 'tensorflow.python.keras.engine.sequential.Sequential'>): it does not seem to be a scikit-learn estimator as it does not implement a 'get_params' methods.

我认为cross_val_scoreSklearn 模型独有的?

【问题讨论】:

【参考方案1】:

cross_val_score 确实是 Sklearn 模型或实现相同所需功能的模型所独有的,而 Keras 模型并非如此。

Keras 没有允许您交叉验证模型的预构建功能,您需要编写交叉验证算法。

首先你应该决定你想要多少折叠,然后你可以使用 sklearn 中的KFold 类将你的数据集划分为那么多折叠。 (注意 KFold.split 返回的是数据点的索引,而不是实际的数据点)

然后,您应该为每个拆分训练一个新模型并计算您想要的指标。 您可以关注this教程了解更多信息。

【讨论】:

【参考方案2】:

我们无法将 Keras 模型直接集成到 sklearn 管道中。因此,如果您正在寻找使用 cross_val_score 评估您的 Keras 模型,您需要使用包装器模块 tf.keras.wrappers.scikit_learn 来将 sklearn API 与 Keras 模型一起使用。例如,

from tf.keras.wrappers.scikit_learn import KerasClassifier

def LSTM_Network(neurons=100):

    model = tf.keras.models.Sequential()
    .
    .
    model.compile(loss='binary_crossentropy',
          optimizer=RMSopt,
          metrics=['accuracy'])    
    return model

lstm_clf = KerasClassifier(build_fn=LSTM_Network, epochs=6, batch_size=64, verbose=0)

model_selection.cross_val_score(lstm_clf, X_train, Y_test, cv=10, scoring='accuracy')

【讨论】:

以上是关于如何应用 cross_val_score 来交叉验证我们自己的模型的主要内容,如果未能解决你的问题,请参考以下文章

cross_val_score 交叉验证与 K折交叉验证,嗯都是抄来的,自己作个参考

使用带有管道和 GridSearch 的 cross_val_score 进行嵌套交叉验证

交叉验证:来自 scikit-learn 参数的 cross_val_score 函数

sklearn中的cross_val_score交叉验证

cross_val_score的用法

使用 sklearn cross_val_score 和 kfolds 来拟合和帮助预测模型