관리 메뉴

너와 나의 스토리

VotingClassifier.fit "The estimator KerasClassifier should be a classifier" 문제 해결 본문

Data Analysis/Machine learning

VotingClassifier.fit "The estimator KerasClassifier should be a classifier" 문제 해결

노는게제일좋아! 2020. 5. 3. 16:49
반응형
import numpy as np
from keras.models import Sequential
from keras import layers
#from keras.optimizers import SGD
from keras import optimizers
from keras.layers import Activation,BatchNormalization, Dropout, Dense
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.ensemble import VotingClassifier
from mlxtend.classifier import EnsembleVoteClassifier



def make_model(dense):
  N = len(white_wine)
  n_in=11
  n_hiddens=32
  n_out=11
  p_keep=0.5 # 드롭아웃 확률의 비율

  model = Sequential()

  model.add(Dense(dense,input_dim=n_in))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(Dense(dense))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(Dense(dense))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(Dense(dense))
  model.add(BatchNormalization())
  model.add(Activation('relu'))
  model.add(layers.Dense(units=n_out,activation='softmax'))

  sgd = optimizers.SGD(lr=0.001, decay=1e-6, momentum=0.9, nesterov=True)
  #model.compile(loss='sparse_categorical_crossentropy', optimizer='adam', metrics=['accuracy'])
  model.compile(loss='sparse_categorical_crossentropy', optimizer=sgd, metrics=['accuracy'])

  return model



epochs = 100
batch_size =150

# 서로 다른 모델을 만들어 합치기 (Model Ensemble)
model1 = KerasClassifier(build_fn=make_model(500),epochs=epochs, verbose=0)
model2 = KerasClassifier(build_fn=make_model(100),epochs=epochs, verbose=0)
model3 = KerasClassifier(build_fn=make_model(50),epochs=epochs, verbose=0)

ensemble_model=VotingClassifier(estimators = [('model1', model1), ('model2', model2), ('model3', model3)], voting = 'soft')
#ensemble_model= EnsembleVoteClassifier(clfs=[model1,model2,model3],weights=[1,1,1],voting='soft')


# Whole Wine Classifier
#y_pred = ensemble_model.predict(x_test)
ensemble_model.fit(x_train, y_train)
test_loss, test_acc = ensemble_model.evaluate(x_test,y_test)
print("Whole Wine Classifier")
print("test loss: ", test_loss)
print("test accuracy: ", test_acc)

 

해결 방법:

[model1._estimator_type="classifier"] 추가해주면 됨

model1 = KerasClassifier(build_fn=make_model(500),epochs=epochs, verbose=0)
model1._estimator_type="classifier"
model2 = KerasClassifier(build_fn=make_model(100),epochs=epochs, verbose=0)
model2._estimator_type="classifier"
model3 = KerasClassifier(build_fn=make_model(50),epochs=epochs, verbose=0)
model3._estimator_type="classifier"

 

반응형
Comments