猿问

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

我已经从包含特定城市的 911 次火灾呼叫的数据集中删除了趋势和季节性,每小时记录一次,超过 17 年。然后我用一个线性回归器拟合它,并尝试预测即将到来的 24 小时期间的值。但是,我的 R^2 值通常接近 0(通常为负),并且我的预测值都在彼此相差万分之一(或更小)的范围内,因此在绘制时,它基本上看起来像一条大致反映平均值的水平线.


我究竟做错了什么?


这是我的代码:


from datetime import timedelta

def 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     label

0   2003-11-07 09:00:00     2452950.87500000    6.696136

1   2003-11-07 10:00:00     2452950.91666667    -5.293884

2   2003-11-07 11:00:00     2452950.95833333    5.679681

3   2003-11-07 12:00:00     2452951.00000000    4.411278

4   2003-11-07 13:00:00     2452951.04166667    5.837476

5   2003-11-07 14:00:00     2452951.08333333    6.469543

这是结果图:

MMMHUHU
浏览 552回答 2
2回答

慕尼黑的夜晚无繁华

您对时间序列使用了完全错误的方法。让我们看看线性回归在做什么:julian_datetime&nbsp; &nbsp; &nbsp;label0&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; 6.6961361&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; -5.2938842&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; 5.6796813&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; 4.4112784&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; 5.837476所以基本上他会发现 你和f(x) = a*x +b你的功能。他会从 中最小化损失,所以问题是他会找到另一个数字。但在时间序列中,您必须处理数据流!现在根本没有时间。x= julian_datetimef(x)= labellabel-prediction2.45,...,2.45使其成为时间序列的一个示例(这不是最好的方法)是将所有前面的 2 个值作为特征添加到其中,使其看起来像:julian_datetime&nbsp; &nbsp; &nbsp;julian_datetime-1 julian_datetime-2 label0&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6.6961361&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; 2.452951e+06&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;-5.2938842&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; 2.452951e+06&nbsp; &nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; &nbsp; &nbsp;5.6796813&nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; 2.452951e+06&nbsp; &nbsp; &nbsp;2.452951e+06&nbsp; &nbsp; &nbsp; &nbsp;4.411278顺便说一句,为什么朱利安日期时间总是相同的值?啊,更糟糕的是!您必须使用标签列作为以前的值,以便它看起来像:&nbsp; &nbsp;y&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y-1&nbsp; &nbsp; &nbsp; &nbsp; y-20 6.6961361 -5.293884&nbsp; 6.6961362 5.679681&nbsp; &nbsp;-5.293884&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;6.6961363那么你的试炼就是y-1, y-2你的预测y

慕森王

除非您提供产生这些预测值的测试集,否则我无法确定。根据代码,您正在拟合具有单个自变量的模型julian_datetime来预测您的因变量label。根据您的样本数据,该julian_datetime变量具有大量重复值。julian_datetime如果您对测试集中的每个观察值具有相同的值,我不会感到惊讶。这将导致相同的预测,因为每个输入都是相同的。如果是这种情况,并且您仍然不相信,请尝试将一些观察结果从您的训练集中移动到具有不同julian_datetime值的测试集中,以查看您是否收到不同的预测。您很可能会注意到对这些新观察结果的不同预测。结果,您将看到您的生产线发生了变化。更新我相信这条线没有改变有几个原因:我相信您的训练集总共包含大约 140000 个观察值,而您的测试集包含 25-100 个观察值。此外,您的绘图仅包含有关测试集的数据。因此,您的预测似乎没有变化,因为您在一个非常小的窗口上绘制了一条线性回归线。如果时间对您的反应完全没有影响,您的线性回归线将再次变得相当平坦。如果您仍想继续构建线性回归模型,我建议您执行以下操作:确保你的测试集足够大,可以注意到预测的变化,否则你会遇到同样的问题。尝试在模型中包含 sin 和 cos 函数,以考虑可能的季节性
随时随地看视频慕课网APP

相关分类

Python
我要回答