簡體   English   中英

如何在 python 中使用 sklearn 回歸器正確預測目標變量?

[英]How to correctly predict target variables with sklearn regressor in python?

我想根據營銷時間序列數據預測未來價格。 為此,我使用sklearn來完成我的任務,因為它比statsmodelfbprophet更靈活。 然而,對於預處理,我通過對選定特征和目標變量取對數值來消除時間序列數據的季節性,然后使用對數值和滯后值進行預測。 我不明白的是每個單獨的特征(它具有滯后值和對數值)如何有助於預測目標變量。 在預測問題中,首先,我們對特征進行歸一化和預處理,然后根據特征重要性選擇性地選擇特征以減少訓練數據的dims,然后訓練model並得到相應的預測。

新更新

然而,在時間序列設置中,我們需要首先解決季節性問題,然后使用特征的對數值和滯后值進行預測。 在我的嘗試中,我只是通過不使用許多特征(沒有使用特征重要性)來簡化過程,只選擇了兩個特征,並嘗試預測目標變量(其中每個特征都有其對數值和滯后值以消除季節性). 為什么我預測目標變量的方法效率不高? 這樣做的更好方法是什么? 誰能指出任何可能的建議或編碼補救措施?

感謝@smci 鼓勵我在我的帖子中指定問題並只關注一個問題。 我確實指定了數據源鏈接並使用了時間序列數據,如下所示:

時間序列數據取自市場信息統計數據庫http://statistics.mla.com.au/Report/List 在此鏈接中共享了可重現的數據,並在此要點中共享了我的完整編碼嘗試

我的嘗試

import pandas as pd
from sklearn.model_selection import train_test_split
from sklearn.ensemble import AdaBoostRegressor

url = "https://gist.githubusercontent.com/adamFlyn/f71e2e0e66303df23dfc2f37ec98e8c7/raw/ba9e871e90201eb504e30127e99cf6179c3e3b18/tradedf.csv"

df = pd.read_csv(url, parse_dates=['dates'])
df.drop(columns=['Unnamed: 0'], inplace=True)

df['log_eyci'] = np.log(df.eyci)  ### Log value
df['log_aus_avg_rain'] = np.log(df['aus_avg_rain'])  ### Log value

for i in range(3):
    df[f'avgRain_lag_{i+1}'] = df['aus_avg_rain'].shift(i+1)   
    df.dropna(inplace=True)
    df[f'log_avgRain_lag_{i+1}'] = np.log(df[f'avgRain_lag_{i+1}'])
    
for i in range(3):
    df[f'eyci_lag_{i+1}'] = df.eyci.shift(i+1)   
    df.dropna(inplace=True)
    df[f'log_eyci_lag_{i+1}'] = np.log(df[f'eyci_lag_{i+1}'])
    df[f'log_difference_{i+1}'] = df.log_eyci - df[f'log_eyci_lag_{i+1}']

X,Y = df[['log_difference_2', 'log_difference_3', 'aus_avg_rain', 'aus_slg_fmCatl']] , df['log_difference_1']
X_train, X_test, Y_train, Y_test = train_test_split(X, Y, test_size=0.2, shuffle=False, random_state=42)

用 AdaBoost 回歸器擬合 model

mdl_adaboost = AdaBoostRegressor(n_estimators=100, learning_rate=0.01)
mdl_adaboost.fit(X_train, Y_train)   # Fit the data
pred = mdl_adaboost.predict(X_test)  # make predictions

當我嘗試為預測 output 制作 plot 時,我在下面嘗試了

## make plot
test_size = X_test.shape[0]
plt.plot(list(range(test_size)), np.exp(df.tail(test_size).log_eyci_lag_1  + pred), label='predicted', color='red')
plt.plot(list(range(test_size)), df.tail(test_size).eyci, label='real', color='blue')
plt.legend(loc='best')
plt.title('Predicted vs Real with log difference values')

@smci 指出使用train, test = X[0:size], X[size:len(X)]不是好主意。 我想知道我應該如何糾正我的方法的局限性。

我在這個問題中提出的一個問題是如何從可能具有季節性的時間序列數據中預測目標變量。 我確實對特征和目標變量使用了對數和滯后值。 現在我幾乎不知道如何使用它們進行預測,以及它們如何可能或可能不會有助於預測目標變量。

這背后的直覺

我憑直覺從這個網站預測商品價格,到目前為止,我對這項任務的建模方式仍然存在問題。 我也感謝@smci 提出這個來源 誰能建議一種可能的編碼補救措施或在scikit-learn中進行此類預測的正確方法? 任何的想法?

新更新:目標

我使用了澳大利亞市場信息數據庫,我想做的是預測澳大利亞牛肉價格,就像這個網站顯示的那樣。 歷史營銷價格數據來自澳大利亞營銷信息數據庫,我將通過簡單的特征(如牛屠宰數量、牛產量等)來預測澳大利亞牛肉價格。 由於我使用的是月度數據,我認為采用月度季節性數據會很好。 再次非常感謝@smci 促使我澄清我的帖子和他的有用反饋。

這主要與 SO 無關並且非常廣泛,您問的是多個問題,包括DataScience.SECrossValidated如何使用去趨勢、使用哪種類型的 model、如何在單個時間序列數據集上使用滾動窗口技術生成多個(train, test) slices ,從哪里獲取以下外部變量的每月數據集:

  • 您的數據集(請添加引文)是 2015 年 1 月... 2020 年 8 月的每月(批發)美國農業部牛肉價格。 這些價格是來自澳大利亞 ( https://www.agric.wa.gov.au/newsletters/wabc/western-australian-beef-commentary-issue-13?page=0%2C2 ) 還是美國? (請添加引文、數據字典解釋列等)。 對您正在嘗試的事情培養一種直覺是很好的 model,而不僅僅是向它投入更多數據和更復雜的模型。

  • 並且您想預測 12-18 個月的未來價格: 2020-09.. 2022-02

  • 所以我希望兩者都會有:

    • 年度季節性
    • 長期經濟供需波動
      • 對美國(?)/澳大利亞經濟的依賴
      • 依賴於任何外國經濟體美國(?)/澳大利亞將每種特定類型的牛肉出口到(中國,日本,韓國等)
    • 其他外部事件(經濟衰退、天氣危機、關稅、補貼、美國大豆貿易戰等)根本無法從歷史牛肉價格值中預測(如果你投入更多歷史數據集,或者 go 更進一步時間,你只會堵塞你的 model 而不會增加對未來的預測能力)。
  • 所以如果你想要更高的准確性,你真的需要一個包含所有這些外部事物的宏模型——而不僅僅是原始歷史數據集值本身。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM