¿Por qué obtengo AttributeError: el objeto ‘KerasClassifier’ no tiene ningún atributo ‘modelo’?

Este es el código y solo aparece el error en la última línea, que es y_pred = classifier.predict(X_test) . El error que AttributeError: 'KerasClassifier' object has no attribute 'model' es AttributeError: 'KerasClassifier' object has no attribute 'model'

 # Importing the libraries import numpy as np import matplotlib.pyplot as plt import pandas as pd from sklearn import datasets from sklearn import preprocessing from keras.utils import np_utils # Importing the dataset dataset = pd.read_csv('Data1.csv',encoding = "cp1252") X = dataset.iloc[:, 1:-1].values y = dataset.iloc[:, -1].values # Encoding categorical data from sklearn.preprocessing import LabelEncoder, OneHotEncoder labelencoder_X_0 = LabelEncoder() X[:, 0] = labelencoder_X_0.fit_transform(X[:, 0]) labelencoder_X_1 = LabelEncoder() X[:, 1] = labelencoder_X_1.fit_transform(X[:, 1]) labelencoder_X_2 = LabelEncoder() X[:, 2] = labelencoder_X_2.fit_transform(X[:, 2]) labelencoder_X_3 = LabelEncoder() X[:, 3] = labelencoder_X_3.fit_transform(X[:, 3]) onehotencoder = OneHotEncoder(categorical_features = [1]) X = onehotencoder.fit_transform(X).toarray() X = X[:, 1:] # Splitting the dataset into the Training set and Test set from sklearn.model_selection import train_test_split X_train, X_test, y_train, y_test = train_test_split(X, y, test_size = 0.2, random_state = 0) # Feature Scaling from sklearn.preprocessing import StandardScaler sc = StandardScaler() X_train = sc.fit_transform(X_train) X_test = sc.transform(X_test) # Creating the ANN! # Importing the Keras libraries and packages import keras from keras.models import Sequential from keras.layers import Dense from keras.layers import Dropout from keras.wrappers.scikit_learn import KerasClassifier from sklearn.model_selection import cross_val_score def build_classifier(): # Initialising the ANN classifier = Sequential() # Adding the input layer and the first hidden layer classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 10)) classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) classifier.compile(optimizer = 'adam', loss = 'binary_crossentropy', metrics = ['accuracy']) return classifier classifier = KerasClassifier(build_fn = build_classifier, batch_size = 10, epochs = 2) accuracies = cross_val_score(estimator = classifier, X = X_train, y = y_train, cv = 1, n_jobs=1) mean = accuracies.mean() variance = accuracies.std() # Predicting the Test set results import sklearn y_pred = classifier.predict(X_test) y_pred = (y_pred > 0.5) # Making the Confusion Matrix from sklearn.metrics import confusion_matrix cm = confusion_matrix(y_test, y_pred) # Predicting new observations test = pd.read_csv('test.csv',encoding = "cp1252") test = test.iloc[:, 1:].values test[:, 0] = labelencoder_X_0.transform(test[:, 0]) test[:, 1] = labelencoder_X_1.transform(test[:, 1]) test[:, 2] = labelencoder_X_2.transform(test[:, 2]) test[:, 3] = labelencoder_X_3.transform(test[:, 3]) test = onehotencoder.transform(test).toarray() test = test[:, 1:] new_prediction = classifier.predict_classes(sc.transform(test)) new_prediction1 = (new_prediction > 0.5) 

Porque aún no has montado el classifier . Para que el classifier tenga disponible la variable de modelo, debe llamar

 classifier.fit(X_train, y_train) 

Aunque ha utilizado cross_val_score() sobre el classifier y ha encontrado precisiones, pero el punto principal a tener en cuenta aquí es que cross_val_score el modelo suministrado y los utilizará para los pliegues de validación cruzada. Por lo tanto, su classifier estimador original no ha sido modificado ni entrenado.

Puedes ver el funcionamiento de cross_val_score en mi otra respuesta aquí

Entonces, coloque la línea mencionada arriba justo arriba de la línea y_pred = classifier.predict(X_test) y y_pred = classifier.predict(X_test) listo. Espero que esto quede claro.

KerasClassifier el error porque en realidad no entrenaste el modelo devuelto de KerasClassifier que es un KerasClassifier de KerasClassifier de KerasClassifier para usar las funciones de aprendizaje de Scikit.

Por ejemplo, puedes hacer una búsqueda de cuadrícula (como deberías saber ya que el código parece ser del curso Udemy ML / DL):

 def build_classifier(optimizer): classifier = Sequential() classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu', input_dim = 11)) classifier.add(Dense(units = 6, kernel_initializer = 'uniform', activation = 'relu')) classifier.add(Dense(units = 1, kernel_initializer = 'uniform', activation = 'sigmoid')) classifier.compile(optimizer = optimizer, loss = 'binary_crossentropy', metrics = ['accuracy']) return classifier classifier = KerasClassifier(build_fn = build_classifier) parameters = {'batch_size': [25, 32], 'epochs': [100, 500], 'optimizer': ['adam', 'rmsprop']} grid_search = GridSearchCV(estimator = classifier, param_grid = parameters, scoring = 'accuracy', cv = 10) grid_search = grid_search.fit(X_train, y_train) 

Si no necesita la funcionalidad de aprendizaje de Scikit, sugiero evitar el envoltorio y simplemente construir su modelo con:

 model = Sequential() model.add(Dense(32, input_dim=784)) model.add(Activation('relu')) … 

y luego entrenar con:

 model.fit( … )