Reputation: 23
I got an error about KerasClassifer and VotingClassifer. At the first, I used MNIST dataset and split it then fit xtrain and ytrain by Voting classifer. If I put their estimator type into Classifier from different models, I got
'super' object has no attribute '__sklearn_tags__'
# Recreate the models to ensure compatibility
model1 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
model2 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
model3 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
model1._estimator_type = "classifier"
model2._estimator_type = "classifier"
model3._estimator_type = "classifier"
ensemble_clf = VotingClassifier(estimators=[('model1', model1), ('model2', model2), ('model3', model3)], voting='soft')
# Fit the ensemble classifier
ensemble_clf.fit(X_train, y_train)
But When I commented _estimator_type, I got ** VotingClassifier only supports binary or multiclass classification. Multilabel and multi-output classification are not supported. **
# Recreate the models to ensure compatibility
model1 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
model2 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
model3 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
# model1._estimator_type = "classifier"
# model2._estimator_type = "classifier"
# model3._estimator_type = "classifier"
ensemble_clf = VotingClassifier(estimators=[('model1', model1), ('model2', model2), ('model3', model3)], voting='soft')
# Fit the ensemble classifier
ensemble_clf.fit(X_train, y_train)
I also tried on Pipeline and skl2onnx but I got the same thing.
this is all of my code
import numpy as np
import pandas as pd
from tensorflow.keras.models import Sequential
from tensorflow.keras.layers import Dense, Activation
from tensorflow.keras import optimizers
from scikeras.wrappers import KerasClassifier
from sklearn.ensemble import VotingClassifier
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_digits, load_iris, fetch_openml
from sklearn.preprocessing import StandardScaler
from sklearn.pipeline import Pipeline
from sklearn.metrics import accuracy_score
import requests
from tensorflow.keras.utils import to_categorical
# Load MNIST dataset using tensorflow.keras.datasets
from tensorflow.keras.datasets import mnist
# Download the MNIST dataset
url = 'https://storage.googleapis.com/tensorflow/tf-keras-datasets/mnist.npz'
response = requests.get(url)
with open('mnist.npz', 'wb') as f:
f.write(response.content)
# Load the dataset
with np.load('mnist.npz') as data:
X_train, y_train = data['x_train'], data['y_train']
X_test, y_test = data['x_test'], data['y_test']
# Normalize the data
X_train = X_train.reshape((X_train.shape[0], -1)) / 255.0
X_test = X_test.reshape((X_test.shape[0], -1)) / 255.0
# Convert labels to categorical (one-hot encoding)
y_train = to_categorical(y_train)
y_test = to_categorical(y_test)
def mlp_model():
model = Sequential()
model.add(Dense(50, input_shape = (784, )))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(50))
model.add(Activation('sigmoid'))
model.add(Dense(10))
model.add(Activation('softmax'))
sgd = optimizers.SGD(learning_rate = 0.001, momentum=0.0)
model.compile(optimizer = sgd, loss = 'categorical_crossentropy', metrics = ['accuracy'])
return model
from scikeras.wrappers import KerasClassifier
from sklearn.ensemble import VotingClassifier
# Recreate the models to ensure compatibility
model1 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
model2 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
model3 = KerasClassifier(build_fn=mlp_model, epochs=100, verbose=0)
# model1._estimator_type = "classifier"
# model2._estimator_type = "classifier"
# model3._estimator_type = "classifier"
ensemble_clf = VotingClassifier(estimators=[('model1', model1), ('model2', model2), ('model3', model3)], voting='soft')
# Fit the ensemble classifier
ensemble_clf.fit(X_train, y_train)
y_pred = ensemble_clf.predict(X_test)
Upvotes: 0
Views: 32