2017-06-19 16 views
2

Dies ist der Code und ich bekomme den Fehler nur in der letzten Zeile, die y_pred = classifier.predict(X_test) ist. Der Fehler Ich erhalte ist AttributeError: 'KerasClassifier' object has no attribute 'model'Warum bekomme ich AttributeError: 'KerasClassifier' Objekt hat kein Attribut 'Modell'?

# 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) 

Antwort

4

Da Sie die classifier noch nicht eingebaut haben. Für classifier die Modellgröße zur Verfügung zu haben, müssen Sie

classifier.fit(X_train, y_train) 

nennen Obwohl Sie cross_val_score() über die classifier verwendet haben, und Genauigkeiten gefunden, aber der wichtigste Punkt hier ist zu beachten, dass die cross_val_score das mitgelieferte Modell Klon und sie für Kreuzvalidierungsfaltungen verwenden. Ihr ursprünglicher Schätzer classifier ist also unberührt und untrainiert.

Sie können die Bearbeitung von cross_val_score in meinen andere sehen answer here

So legen Sie die oben genannte Zeile direkt oberhalb y_pred = classifier.predict(X_test) Linie und Sie sind alle gesetzt. Hoffe das macht es klar.

+0

thankyou vivek den Wrapper und einfach bauen Sie Ihr Modell mit zu vermeiden. – Vijay

1

Sie erhalten den Fehler, weil Sie das zurückgegebene Modell aus KerasClassifier, das ein Scikit-learn Wrapper ist, um Scikit-learn-Funktionen zu verwenden, nicht trainiert haben.

Sie könnten zum Beispiel tun, um eine Gridsearch (wie Sie vielleicht wissen, da der Code aus dem Udemy ML/DL Kurs zu sein scheint):

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) 

Wenn Sie dont Funktionalität-Scikit lerne ich vorschlagen

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

und dann mit dem Zug mit:

model.fit(…) 
+1

danke @petezurich wirklich schätze deine hilfe .. – Vijay

Verwandte Themen