使用cross_val_score计算CNN模型交叉验证得分时遇TypeError问题求助
解决Keras CNN模型cross_val_score报错问题
问题场景
构建的CNN模型代码如下:
model_cnn = Sequential() model_cnn.add(Convolution1D(filters=32,kernel_size=2, strides=1, activation='relu', input_shape=(x_train.shape[1], 1))) model_cnn.add(MaxPooling1D()) model_cnn.add(Flatten()) model_cnn.add(Dense(105)) model_cnn.add(Dropout(0.5)) model_cnn.add(Dense(1, activation="relu")) model_cnn.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) model_cnn.summary() x_train = x_train.todense() x_test = x_test.todense() x_train = np.expand_dims(x_train, axis=-1) x_test = np.expand_dims(x_test, axis=-1) history_cnn = model_cnn.fit(x_train, y_train,validation_data=(x_test, y_test), epochs=3)
执行交叉验证代码时:
print("Mean of Cross validation score(CNN): ", cross_val_score(model_cnn, x_train, y_train, cv=kfold).mean())
出现错误:
TypeError: If no scoring is specified, the estimator passed should have a 'score' method. The estimator <keras.engine.sequential.Sequential object at 0x00000154DF44B6A0> does not.
解决方案
方法1:给cross_val_score指定scoring参数
Keras的Sequential模型没有默认的score方法,需显式指定评估指标。针对二分类任务,直接指定scoring='accuracy'即可:
print("Mean of Cross validation score(CNN): ", cross_val_score(model_cnn, x_train, y_train, cv=kfold, scoring='accuracy').mean())
方法2:用KerasClassifier包装模型
将Keras模型包装为适配scikit-learn接口的KerasClassifier,让模型自动拥有score方法,步骤如下:
- 导入依赖:
from tensorflow.keras.wrappers.scikit_learn import KerasClassifier
- 定义模型构建函数:
def build_cnn_model(): model = Sequential() model.add(Convolution1D(filters=32,kernel_size=2, strides=1, activation='relu', input_shape=(x_train.shape[1], 1))) model.add(MaxPooling1D()) model.add(Flatten()) model.add(Dense(105)) model.add(Dropout(0.5)) model.add(Dense(1, activation="sigmoid")) # 二分类任务建议用sigmoid替代relu model.compile(loss='binary_crossentropy', optimizer='adam', metrics=['accuracy']) return model
- 包装模型并执行交叉验证:
model_cnn_wrap = KerasClassifier(build_fn=build_cnn_model, epochs=3, verbose=0) print("Mean of Cross validation score(CNN): ", cross_val_score(model_cnn_wrap, x_train, y_train, cv=kfold).mean())
额外注意事项
原模型最后一层使用relu激活函数,但二分类任务搭配binary_crossentropy损失时,更适合用sigmoid激活——sigmoid输出范围为(0,1),对应概率值,能更好匹配损失函数的计算逻辑,提升模型效果与评估准确性。
内容的提问来源于stack exchange,提问作者Umer
相关产品推荐
相关产品推荐

