久久精品精选,精品九九视频,www久久只有这里有精品,亚洲熟女乱色综合一区
    分享

    基于XGBoost和EMD的時(shí)序預(yù)測(cè)實(shí)現(xiàn)

     dxgung 2021-12-12

    基本思想:將序列分解成季節(jié)、趨勢(shì)和殘差,然后對(duì)殘差進(jìn)行EMD分解,再將這些成分作為特征輸入XGBoost模型,并對(duì)各個(gè)成分進(jìn)行預(yù)測(cè),最后相加得到預(yù)測(cè)值。

    emd代碼:經(jīng)驗(yàn)?zāi)B(tài)分解(EMD)實(shí)現(xiàn)

    GLM:[文獻(xiàn)復(fù)現(xiàn)]中長(zhǎng)期神經(jīng)網(wǎng)絡(luò)概率預(yù)測(cè)模型

    import warnings  # 忽略警告

    warnings.filterwarnings('ignore')
    import datetime as dt
    from EMD import emd
    from sklearn.linear_model import LinearRegression
    from sklearn.multioutput import MultiOutputRegressor
    from sklearn.pipeline import Pipeline
    from xgboost import XGBRegressor
    import pickle
    import pandas as pd
    import numpy as np
    import matplotlib.pyplot as plt
    import os
    from sklearn.impute import SimpleImputer
    from sklearn.metrics import mean_squared_error

    class GLM:
        def __init__(self, df):
            self.df = df

        def getXY(self):
            self.df['dayofyear'] = self.df.index.dayofyear
            self.x = self.df.dayofyear.values.reshape(len(self.df), 1)
            self.y = self.df.y.values.reshape(len(self.df), 1)

        def getSX(self):
            self.getXY()
            sat = self.df['sat'].values.reshape(len(self.df), 1)
            sun = self.df['sun'].values.reshape(len(self.df), 1)
            w = 2 * np.pi / 365
            x = self.x
            x = np.hstack([x, np.sin(w * x), np.sin(2 * w * x), np.cos(w * x), np.cos(2 * w * x), sat, sun])
            self.sx = x

        def Trend(self, season):
            '''trend = \beta_0+\beta_1*t'''
            model = LinearRegression()
            model.fit(self.x, self.y - season)
            return model

        def seasonality(self):
            '''season = \sum_{k=1}^{2}[\beta_{1+k}sin(kwt)+\beta_{2+k}sin(kwt)]+
                            \beta_6D_{sat}(t)+\beta_7D_{sun}(t)+\beta_8D_{Hol}(t)'''
            model = LinearRegression()
            model.fit(self.sx, self.y)
            return model

    xgboost_params = {
        'colsample_bynode': 0.8,
        'learning_rate': 0.01,
        'max_depth': 4,
        'objective': 'reg:squarederror',
        'subsample': 0.8,
        'reg_alpha': 0.005,
        'n_estimators': 200
    }


    class XGB:
        def fit(self, X_train, y_train, n=None):
            pipeline = [('SimpleImputer', SimpleImputer(missing_values=np.nan, strategy='mean'))
                        # ('scaler', StandardScaler()),
                        # ('pca', PCA(n_components=n))
                        ]
            multi_regressorr = MultiOutputRegressor(XGBRegressor(params=xgboost_params), 20)
            pipeline.append(('regressor', multi_regressorr))
            estimator = Pipeline(pipeline)
            self.xgb = estimator.fit(X_train, y_train)

        def predict(self, X_test):
            y_pred = self.xgb.predict(X_test)
            return y_pred

        def error(self, y_test, y_pred):
            error = mean_squared_error(y_test.values.flatten(), y_pred.flatten())
            return error


    class SaveAndLoadModel:
        def __init__(self, path):
            self.path = path
            if not os.path.exists(self.path):
                os.makedirs(self.path)

        def save_model(self, model):
            filename = 'model.pkl'
            save_name = os.path.join(self.path, filename)
            print('saving: -> exporting to %s' % save_name)

            with open(save_name, 'wb') as handle:
                pickle.dump(model, handle, protocol=pickle.HIGHEST_PROTOCOL)

        def load_model(self):
            filename = 'model.pkl'
            save_name = os.path.join(self.path, filename)
            print('loading: -> exporting to %s' % save_name)

            with open(save_name, 'rb') as handle:
                model = pickle.load(handle)
            return model
            

    def main(df):
        columns = ['y', 'season', 'trend', 'emd0', 'emd1', 'emd2', 'emd3', 'emd4']
        df_train = df[(df.index > dt.datetime(2015, 1, 1)) & (df.index <= dt.datetime(2017, 1, 1))]
        df_test = df[(df.index > dt.datetime(2017, 1, 1)) & (df.index <= dt.datetime(2018, 8, 1))]

        df_y_train = df_train[columns].shift(-24)[:-24]
        df_y_test = df_test[columns].shift(-24)[:-24]

        X_train, X_test, = df_train.values[:-24], df_test.values[:-24]
        y_train, y_test = df_y_train.values, df_y_test.values

        xgb = XGB()

        xgb.fit(X_train, y_train)

        y_pred = xgb.predict(X_test)

        error1 = xgb.error(df_y_test.y, y_pred[:, 0])

        y_pred2 = y_pred[:, 1:].sum(axis=1)

        error2 = xgb.error(df_y_test.y, y_pred2)

        plt.figure()
        plt.plot(y_pred[:, 0])
        plt.plot(y_pred2)
        plt.plot(df_y_test.y.values)
        plt.legend(['y', 'emd', 'true'])
        print(error1, error2)
        # 807037.8726142674 2487790.09234746
        # 直接預(yù)測(cè)比emd的誤差小


    if __name__ == '__main__':
        df = pd.read_csv('./AEP_hourly.csv', index_col=[0])
        df.columns = ['y']
        df.index = pd.to_datetime(df.index)
        df['weekday'] = df.index.weekday
        df['hour'] = df.index.hour
        df['sat'] = (df['weekday'] == 5) * 1
        df['sun'] = (df['weekday'] == 6) * 1

        glm = GLM(df)
        glm.getSX()
        glm.getXY()
        season_model = glm.seasonality()
        season = season_model.predict(glm.sx)
        trend_model = glm.Trend(season)
        trend = trend_model.predict(glm.x)
        residual = glm.y - season - trend
        df['season'] = season
        df['trend'] = trend
        df['residual'] = residual

        x = (glm.y - season - trend).flatten()
        t = np.arange(0, len(x) * .001, .001)
        imfs = emd(x, nIMF=5)

        for i in range(len(imfs)):
            df[f'emd{i}'] = imfs[i]

        for col in ['season', 'trend', 'emd0', 'emd1', 'emd2', 'emd3', 'emd4']:  # 'season',
            for i in range(24):
                df[f'{col}_lag{i}'] = df[col].shift(i)
        df.dropna(inplace=True)
        main(df)

    結(jié)果如下所示:

    圖片
    圖片
    數(shù)據(jù)如琥珀
    致力于讓數(shù)據(jù)科學(xué)與機(jī)器學(xué)習(xí)在工業(yè),商業(yè)落地。信奉:無(wú)代碼,不BB
    46篇原創(chuàng)內(nèi)容
    公眾號(hào)

      本站是提供個(gè)人知識(shí)管理的網(wǎng)絡(luò)存儲(chǔ)空間,所有內(nèi)容均由用戶(hù)發(fā)布,不代表本站觀點(diǎn)。請(qǐng)注意甄別內(nèi)容中的聯(lián)系方式、誘導(dǎo)購(gòu)買(mǎi)等信息,謹(jǐn)防詐騙。如發(fā)現(xiàn)有害或侵權(quán)內(nèi)容,請(qǐng)點(diǎn)擊一鍵舉報(bào)。
      轉(zhuǎn)藏 分享 獻(xiàn)花(0

      0條評(píng)論

      發(fā)表

      請(qǐng)遵守用戶(hù) 評(píng)論公約

      主站蜘蛛池模板: 菠萝菠萝蜜午夜视频在线播放观看 | 国产成人手机高清在线观看网站| 亚洲欧美日韩精品久久亚洲区| 免费吃奶摸下激烈视频| 久久五月丁香合缴情网| 18无码粉嫩小泬无套在线观看| 中文字幕在线精品国产| 午夜性爽视频男人的天堂| 免费看国产美女裸体视频| 日本高清色WWW在线安全| 久久夜色撩人精品国产小说| 国产永久免费高清在线| 最近中文字幕免费MV在线视频 | 中国熟妇毛多多裸交视频| 熟妇人妻中文字幕| 国产午夜亚洲精品国产成人| 欧洲人妻丰满AV无码久久不卡| 亚洲理论在线A中文字幕| 精品国产黑色丝袜高跟鞋| 蜜芽久久人人超碰爱香蕉| 老师在办公室被躁在线观看| 亚洲香蕉网久久综合影视| 亚洲国产精品一区二区WWW| 男人狂桶女人高潮嗷嗷| 99久久精品国产综合一区| 久久婷婷大香萑太香蕉AV人| 91中文字幕在线一区| 天天躁日日躁狠狠躁欧美老妇| 国内熟妇人妻色在线视频| 四虎成人精品无码| 999ZYZ玖玖资源站在线观看| 精品人妻中文字幕av| 少妇内射高潮福利炮| 九九热在线视频观看这里只有精品| 91中文字幕一区在线| 国产日产欧产精品精品软件| 免费国产午夜理论片不卡| 国产午夜福利视频在线| 国产AV激情久久无码天堂 | 尹人香蕉久久99天天拍| 美日韩在线视频一区二区三区|