集成學習模型stack方法實現

基模型爲神經網絡,元模型爲其它的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
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章