问题描述
我有一个Keras模型,想使用sklearn的AdaBootClassifier增强它。不幸的是,我收到以下错误消息,却不知道如何解决。如果有任何帮助,我将非常高兴!
ValueError跟踪(最近一次通话最近) 在()中 ----> 1个boosted_classifier.fit(X,y)
3帧 _boost_discrete中的/usr/local/lib/python3.6/dist-packages/sklearn/ensemble/_weight_boosting.py(self,iboost,X,y,sample_weight,random_state) 602#仅增加正重 (603)第603章 -> 604(sample_weight> 0)) 605 606返回sample_weight,estimator_weight,estimator_error
ValueError:形状为(670,)的不可广播的输出操作数与广播形状(670,670)不匹配
这是我的代码:
import sklearn
from sklearn.ensemble import AdaBoostClassifier
from sklearn.ensemble import AdaBoostRegressor
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification
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 keras.wrappers.scikit_learn import KerasRegressor
import matplotlib.pyplot as plt
import numpy as np
import math
X_all,y_all = make_classification(n_samples=1000,n_features=50,n_informative=20,n_redundant=0,random_state=0,shuffle=False,class_sep=1)
X,X_test,y,y_test = train_test_split(X_all,y_all,test_size=0.33,random_state=42)
def simple_model():
# create model
model = Sequential()
model.add(Dense(25,input_dim=50,activation='relu'))
model.add(Dropout(0.2,input_shape=(50,)))
model.add(Dense(100,input_shape=(100,)))
model.add(Dense(50,activation='relu'))
model.add(Dense(1,activation='sigmoid'))
# Compile model
model.compile(loss='mean_squared_error',optimizer='adam',metrics=['accuracy'])
return model
class MyKerasClassifier(KerasClassifier):
def fit(self,x,sample_weight=None,**kwargs):
y = np.array(y)
if len(y.shape) == 2 and y.shape[1] > 1:
self.classes_ = np.arange(y.shape[1])
elif (len(y.shape) == 2 and y.shape[1] == 1) or len(y.shape) == 1:
self.classes_ = np.unique(y)
y = np.searchsorted(self.classes_,y)
else:
raise ValueError('Invalid shape for y: ' + str(y.shape))
self.n_classes_ = len(self.classes_)
if sample_weight is not None:
kwargs['sample_weight'] = sample_weight
print(type(sample_weight))
return super(MyKerasClassifier,self).fit(x,**kwargs)
#return super(KerasClassifier,sample_weight=sample_weight)
boosted_classifier = AdaBoostClassifier(
base_estimator=MyKerasClassifier(build_fn=simple_model,epochs=5,batch_size=32,verbose=0),n_estimators=2,algorithm="SAMME")
boosted_classifier.fit(X,y)
解决方法
我为自己找到了一个简单的解决方案。我刚刚将以下预测函数添加到MyKerasClassifier类中,并且可以使用:)
def predict(self,x,**kwargs):
kwargs = self.filter_sk_params(Sequential.predict_classes,kwargs)
classes = self.model.predict_classes(x,**kwargs)
return self.classes_[classes].flatten()