Home > Back-end >  TypeError: If no scoring is specified, the estimator passed should have a 'score' method.
TypeError: If no scoring is specified, the estimator passed should have a 'score' method.

Time:12-30

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)

Cross-validation score:

print("Mean of Cross validation score(CNN): ", cross_val_score(model_cnn, x_train, y_train, cv=kfold).mean())

I am finding the cross-validation score of CNN model but I got an error:

Error:

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.

CodePudding user response:

You could create a custom scikit-learn estimator that implements a score method.

Here's a fairly minimal example:

from sklearn.base import BaseEstimator, ClassifierMixin
from tensorflow import keras
from tensorflow.keras import layers
from sklearn.metrics import accuracy_score
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score


class KerasModel(BaseEstimator, ClassifierMixin):
    def fit(self, X, y):
        model = keras.Sequential([
            keras.Input(shape=X.shape[1]),
            layers.Dense(100),
            layers.Dropout(0.1),
            layers.Dense(1, activation="relu")])
        model.compile(loss="binary_crossentropy", optimizer="adam", metrics=["accuracy"])
        model.fit(X, y, epochs=25)
        self.model = model
        return self

    def score(self, X, y):
        return accuracy_score(y, (self.model.predict(X) > 0.5).flatten())

Model creation and training occurs inside fit(), and score() returns the accuracy of using the model for prediction. So it implements everything needed for cross_val_score:

if __name__ == "__main__":
    X, y = make_classification()
    clf = KerasModel()
    print(cross_val_score(clf, X, y))
[0.7  0.85 0.95 0.85 0.8 ]
  • Related