如何应用 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_score
是Sklearn
模型独有的?
【问题讨论】:
【参考方案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 进行嵌套交叉验证