Python 3.x 包含Keras模型的网格搜索投票分类器

Python 3.x 包含Keras模型的网格搜索投票分类器,python-3.x,keras,scikit-learn,Python 3.x,Keras,Scikit Learn,我正在尝试使用GridSearchCV训练一个VotingClassifier,其中包含Keras模型 代码如下: from sklearn.pipeline import Pipeline from sklearn.preprocessing import StandardScaler from keras.models import Sequential from keras.layers import Dense from keras.optimizers import adam from

我正在尝试使用
GridSearchCV
训练一个
VotingClassifier
,其中包含
Keras
模型

代码如下:

from sklearn.pipeline import Pipeline
from sklearn.preprocessing import StandardScaler
from keras.models import Sequential
from keras.layers import Dense
from keras.optimizers import adam
from keras.wrappers.scikit_learn import KerasClassifier
from sklearn.ensemble import VotingClassifier
from sklearn import datasets
from sklearn.svm import SVC
from sklearn.model_selection import GridSearchCV

# pretend data
X, y = datasets.make_classification(n_samples=100, n_features=20)

scaler = StandardScaler()

# create model
def create_model():   
    
    model = Sequential()

    model.add(Dense(20, kernel_initializer="uniform", activation='relu', input_shape=(20,)))
    model.add(Dense(30, kernel_initializer="uniform", activation='relu'))
    model.add(Dense(10, kernel_initializer="uniform", activation='relu'))
    model.add(Dense(1,  activation='sigmoid'))

    # Compile model
    optimizer = adam(learning_rate=0.001, beta_1=0.9, beta_2=0.999, amsgrad=False)
    model.compile(loss='binary_crossentropy', optimizer=optimizer, metrics=['accuracy'])

    return model

keras_model = KerasClassifier(build_fn=create_model)
keras_model._estimator_type = "classifier"   

eclf = VotingClassifier(
          estimators=[('svc',SVC(probability=True)), ('keras_model', keras_model)]          
          , voting='soft')

#  Test - fit the viting classifier without grid search
eclf.fit(X, y)

print('The VotingClassifier can be fit outside of gridsearch\n')

# parameters to grid search
params = [{'svc__C':[0.01,0.1]}, ]

grid = GridSearchCV(eclf,params,cv=2,scoring='accuracy', verbose=1)
grid.fit(X,y)

我得到以下错误:

ValueError: The estimator KerasClassifier should be a classifier.
当我在
GridSearchCV
外部训练
VotingClassifier
时,不会发生错误,但是当我在
GridSearchCV
内部训练时,会收到错误消息。另一个问题也有相同的错误(不使用GridSearch),并通过一行断言keras模型是一个分类器得到修复,我还包括:

keras_model._estimator_type = "classifier"
这并没有解决这里的问题


有什么建议吗?

您使用的是什么keras版本?我运行了您共享的代码(没有
keras\u模型。\u estimator\u type=“classifier”
行),并且安装VotingClassifier没有问题(即,它运行得很好)。我的keras版本是2.2.4,sklearn是0.21.2。@我使用的是keras版本2.3.1和scikit learn版本0.22.2.post1。我将scikit learn降级为0.21.2版,现在它可以工作了。谢谢你的帮助!您使用的是什么keras版本?我运行了您共享的代码(没有
keras\u模型。\u estimator\u type=“classifier”
行),并且安装VotingClassifier没有问题(即,它运行得很好)。我的keras版本是2.2.4,sklearn是0.21.2。@我使用的是keras版本2.3.1和scikit learn版本0.22.2.post1。我将scikit learn降级为0.21.2版,现在它可以工作了。谢谢你的帮助!