【问题标题】:Fit a regression model over sequenced data在序列数据上拟合回归模型
【发布时间】:2020-03-27 16:35:24
【问题描述】:

我目前正在尝试查找站点之间的通勤时间。我想使用回归模型或神经网络来预测时间,但我不确定如何在数据上拟合模型。我的数据如下:

Route  Station    Trip_ID  Time   Day_Week
1      Station 1  XXX_1    02:30  0       
1      Station 2  XXX_1    02:40  0
1      Station 3  XXX_1    02:55  0
1      Station 4  XXX_1    02:58  0
1      Station 5  XXX_1    03:10  0

我希望能够输入任意两组站点,例如 (3, 5) 或 (1, 4),并获得这两个站点之间通勤时间的估计值。我有超过 40,000 个数据点和 80 个不同的行程 ID,每次行程中都有不同的站点组合。我想知道如何在这些数据上拟合回归模型或任何类型的预测模型。

令我困惑的是排序部分。模型是否必须预测 Station 3 -> Station 4 + Station 4 -> Station 5 之间的通勤时间才能得到 Station 3 -> Station 5 的通勤时间?

【问题讨论】:

  • 如果顺序是困扰您的问题,您可以重新组织数据,使数据框的每一行都代表一个可能的站点组合。因此,在上面的示例中,Station 1 -> Station 2、Station 1 -> Station 3 等。然后您可以在起始站和结束站之间包含交互项,以获得任何组合的估计值。不过,显然这会扩大数据集的大小。请注意,您将需要以某种方式考虑 Trip_ID 中的集群。打破系统固有秩序时的建模并不简单。

标签: python pandas regression linear-regression lasso-regression


【解决方案1】:

您的模型必须预测起点站和终点站之间的通勤时间。您可以计算每两个站点之间的时间差:

df['Time'] = pd.to_datetime(df['Time'])
X = df['Station']
y = df['Time'].diff().dt.seconds.fillna(0).div(60).cumsum()
m, b = np.polyfit(X, y, deg=1)

print(y)

输出:

1     0.0
1    10.0
1    25.0
1    28.0
1    40.0
Name: Time, dtype: float64

然后你可以拟合,例如,一个线性函数:

m, b = np.polyfit(X, y, deg=1)

X_test = np.linspace(1, 5, 1000)
y_test = m * X_test + b

plt.scatter(X, y)
plt.plot(X_test, y_test)
plt.xlabel('station')
plt.ylabel('min')

要估算通勤时间,您需要将斜率 m 乘以车站数量:

def predict_time(st1, st2):
    return (st2 - st1) * m

print(predict_time(2, 5))
# 29.4

【讨论】:

    猜你喜欢
    • 2020-11-20
    • 2016-09-03
    • 2020-05-11
    • 2015-08-09
    • 2021-12-08
    • 2021-02-06
    • 2014-04-25
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多