为了账号安全,请及时绑定邮箱和手机立即绑定

为什么我的预测值几乎相同(并且与平均值相似)?

为什么我的预测值几乎相同(并且与平均值相似)?

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 关注
  • 551 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号