亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

為什么我的預測值幾乎相同(并且與平均值相似)?

為什么我的預測值幾乎相同(并且與平均值相似)?

MMMHUHU 2022-07-12 10:17:28
我已經從包含特定城市的 911 次火災呼叫的數據集中刪除了趨勢和季節性,每小時記錄一次,超過 17 年。然后我用一個線性回歸器擬合它,并嘗試預測即將到來的 24 小時期間的值。但是,我的 R^2 值通常接近 0(通常為負),并且我的預測值都在彼此相差萬分之一(或更小)的范圍內,因此在繪制時,它基本上看起來像一條大致反映平均值的水平線.我究竟做錯了什么?這是我的代碼:from datetime import timedeltadef run_regression(df, dependent, label):    cut_datetime = df[dependent].max()-timedelta(hours=26) #24 hour lag plus 4 hours to predict    train = df[df[dependent] < cut_datetime][['julian_datetime', label]].dropna(how='any') #train == data before cut_datetime    test = df[df[dependent] >= cut_datetime][['julian_datetime', label]].dropna(how='any') #test == data after cut_datetime    regress = sklearn.linear_model.LinearRegression().fit(                                              X = train[['julian_datetime']],                                              y = train[label])    test['predicted_value'] = regress.predict(                                              X = test[['julian_datetime']])    #Plots    (test[label] - test['predicted_value']).plot()    test[[label, 'predicted_value']].plot()    #Metrics    print('MSE: ', sklearn.metrics.mean_squared_error(test[label], test['predicted_value']))    print('R^2: ', sklearn.metrics.r2_score(test[label], test['predicted_value']))    print('Sample of predicted values: ', '\n', test['predicted_value'][:10])run_regression(exp_model_df, 'incident_hour', 'label')incident_hourjulian_date-->函數開頭引用的日期時間格式這是數據集的示例:incident_hour   julian_datetime     label0   2003-11-07 09:00:00     2452950.87500000    6.6961361   2003-11-07 10:00:00     2452950.91666667    -5.2938842   2003-11-07 11:00:00     2452950.95833333    5.6796813   2003-11-07 12:00:00     2452951.00000000    4.4112784   2003-11-07 13:00:00     2452951.04166667    5.8374765   2003-11-07 14:00:00     2452951.08333333    6.469543這是結果圖:
查看完整描述

2 回答

?
慕尼黑的夜晚無繁華

TA貢獻1864條經驗 獲得超6個贊

您對時間序列使用了完全錯誤的方法。


讓我們看看線性回歸在做什么:


julian_datetime     label

0   2.452951e+06    6.696136

1   2.452951e+06    -5.293884

2   2.452951e+06    5.679681

3   2.452951e+06    4.411278

4   2.452951e+06    5.837476

所以基本上他會發現 你和f(x) = a*x +b你的功能。他會從 中最小化損失,所以問題是他會找到另一個數字。但在時間序列中,您必須處理數據流!現在根本沒有時間。x= julian_datetimef(x)= labellabel-prediction2.45,...,2.45


使其成為時間序列的一個示例(這不是最好的方法)是將所有前面的 2 個值作為特征添加到其中,使其看起來像:


julian_datetime     julian_datetime-1 julian_datetime-2 label

0   2.452951e+06                                         6.696136

1   2.452951e+06    2.452951e+06                         -5.293884

2   2.452951e+06    2.452951e+06     2.452951e+06       5.679681

3   2.452951e+06    2.452951e+06     2.452951e+06       4.411278

順便說一句,為什么朱利安日期時間總是相同的值?啊,更糟糕的是!您必須使用標簽列作為以前的值,以便它看起來像:


   y          y-1        y-2

0 6.696136

1 -5.293884  6.696136

2 5.679681   -5.293884           6.696136

3

那么你的試煉就是y-1, y-2你的預測y


查看完整回答
反對 回復 2022-07-12
?
慕森王

TA貢獻1777條經驗 獲得超3個贊

除非您提供產生這些預測值的測試集,否則我無法確定。

根據代碼,您正在擬合具有單個自變量的模型julian_datetime來預測您的因變量label。根據您的樣本數據,該julian_datetime變量具有大量重復值。julian_datetime如果您對測試集中的每個觀察值具有相同的值,我不會感到驚訝。這將導致相同的預測,因為每個輸入都是相同的。

如果是這種情況,并且您仍然不相信,請嘗試將一些觀察結果從您的訓練集中移動到具有不同julian_datetime值的測試集中,以查看您是否收到不同的預測。您很可能會注意到對這些新觀察結果的不同預測。結果,您將看到您的生產線發生了變化。

更新

我相信這條線沒有改變有幾個原因:

  1. 我相信您的訓練集總共包含大約 140000 個觀察值,而您的測試集包含 25-100 個觀察值。此外,您的繪圖僅包含有關測試集的數據。因此,您的預測似乎沒有變化,因為您在一個非常小的窗口上繪制了一條線性回歸線。

  2. 如果時間對您的反應完全沒有影響,您的線性回歸線將再次變得相當平坦。

如果您仍想繼續構建線性回歸模型,我建議您執行以下操作:

  • 確保你的測試集足夠大,可以注意到預測的變化,否則你會遇到同樣的問題。

  • 嘗試在模型中包含 sin 和 cos 函數,以考慮可能的季節性


查看完整回答
反對 回復 2022-07-12
  • 2 回答
  • 0 關注
  • 639 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號