基模型爲神經網絡,元模型爲其它的stack方法
class StackingAverageModels_build2():
'''
第一層的submodel是神經網絡
第二層的模型是其他模型。
'''
def __init__(self, X_train, y_train, X_test, y_test):
self.X_train = X_train
self.y_train = y_train
self.X_test = X_test
self.y_test = y_test
self.doc_dir = None
self.members = None
self.n_models = None
self.meta_model = None
def load_all_models(self, n_models, doc_dir):
all_models = list()
for i in range(n_models):
filename = os.path.join(doc_dir, 'model_'+ np.str(i + 1)+'.h5')
model = load_model(filename)
all_models.append(model)
print('>loaded %s' %(filename))
self.members = all_models
self.doc_dir = doc_dir
self.n_models = n_models
return all_models
def stacked_dataset(self, inputX):
'''
第一層模型-建立模型並訓練,輸出預測結果
'''
stackX = None
for model in self.members:
# 做預測
y_pred = model.predict(inputX, verbose=0)
# 預測結果重塑成[row, members, probalities]
if stackX is None:
stackX = y_pred
else:
stackX = np.dstack((stackX, y_pred))
# 將預測結果展開成,[rows, members * probalities]
stackX = stackX.reshape((stackX.shape[0], stackX.shape[1]*stackX.shape[2]))
return stackX
def fit_stacked_model(self, meta_model):
'''
第二層模型-基於第一層預測結果,建立模型並訓練
return: 已訓練好的模型
'''
inputX = self.X_test
inputy = self.y_test
# 創建訓練集
stackedX = self.stacked_dataset(inputX)
# 第二層的模型進行訓練
meta_model.fit(stackedX, inputy)
self.meta_model = meta_model
return meta_model
def stacked_prediction(self):
'''
基於第二層模型得到的預測結果
'''
# 創建訓練數據集
stackedX = self.stacked_dataset(self.X_test)
# 做預測
model = self.meta_model
y_pred = model.predict(stackedX)
return y_pred