如何解析 sklearns 线性回归的日期值?

Posted

技术标签:

【中文标题】如何解析 sklearns 线性回归的日期值?【英文标题】:How can I parse date values for sklearns linear regression? 【发布时间】:2018-07-26 08:46:26 【问题描述】:

我正在使用以下 Pandas DataFrame index = groupedCrimes.index:

DatetimeIndex(['2014-06-30', '2014-07-31', '2014-08-31', '2014-09-30',
               '2014-10-31', '2014-11-30', '2014-12-31', '2015-01-31',
               '2015-02-28', '2015-03-31', '2015-04-30', '2015-05-31',
               '2015-06-30', '2015-07-31', '2015-08-31', '2015-09-30',
               '2015-10-31', '2015-11-30', '2015-12-31', '2016-01-31',
               '2016-02-29', '2016-03-31', '2016-04-30', '2016-05-31',
               '2016-06-30', '2016-07-31', '2016-08-31', '2016-09-30',
               '2016-10-31', '2016-11-30', '2016-12-31', '2017-01-31',
               '2017-02-28', '2017-03-31', '2017-04-30', '2017-05-31'],
              dtype='datetime64[ns]', name='Month', freq='M')

我正在从 datetime64[ns] 转换它的类型,以便我可以在它上面使用 sklearns 线性回归。

#I change the dates to be integers, I am not sure this is the best way    
groupedCrimes.index = pd.to_datetime(groupedCrimes.index)  
groupedCrimes.index = (groupedCrimes.index - groupedCrimes.index.min())  / np.timedelta64(1,'D')

这会将其转换为以下内容:

[[0.00000000e+00]
 [3.58796296e-13]
 [7.17592593e-13]
 [1.06481481e-12]
 [1.42361111e-12]
 [1.77083333e-12]
 [2.12962963e-12]
 [2.48842593e-12]
 [2.81250000e-12]
 [3.17129630e-12]
 [3.51851852e-12]
 [3.87731481e-12]
 [4.22453704e-12]
 [4.58333333e-12]
 [4.94212963e-12]
 [5.28935185e-12]
 [5.64814815e-12]
 [5.99537037e-12]
 [6.35416667e-12]
 [6.71296296e-12]
 [7.04861111e-12]
 [7.40740741e-12]
 [7.75462963e-12]
 [8.11342593e-12]
 [8.46064815e-12]
 [8.81944444e-12]
 [9.17824074e-12]
 [9.52546296e-12]
 [9.88425926e-12]
 [1.02314815e-11]
 [1.05902778e-11]
 [1.09490741e-11]
 [1.12731481e-11]
 [1.16319444e-11]
 [1.19791667e-11]
 [1.23379630e-11]]

然后例如我可以将这些值之一预测为日期:

[in] model.predict(3.58796296e-13)
[out] array([5990.81354452])

我该怎么做:

    A) 将这些数字转换回日期,以便我知道我是哪个日期 预测。 B) 将未来的日期转换为这种格式,以便我可以预测 未来的日期?

我有更好的方法来转换和处理日期吗?

【问题讨论】:

【参考方案1】:

简单地将日期时间转换为自1970-01-01 以来的天数怎么样?

In [386]: df
Out[386]:
                 val
2014-06-30  0.156202
2014-07-31  0.416251
2014-08-31  0.649295
2014-09-30  0.402265
2014-10-31  0.983870
2014-11-30  0.773942
2014-12-31  0.327271
2015-01-31  0.813580
2015-02-28  0.292830
2015-03-31  0.848269
...              ...
2016-08-31  0.595301
2016-09-30  0.171903
2016-10-31  0.355610
2016-11-30  0.477474
2016-12-31  0.517182
2017-01-31  0.891583
2017-02-28  0.591066
2017-03-31  0.799293
2017-04-30  0.225473
2017-05-31  0.444644

[36 rows x 1 columns]

In [387]: df.index = (df.index - pd.to_datetime('1970-01-01')).days

In [388]: df
Out[388]:
            val
16251  0.156202
16282  0.416251
16313  0.649295
16343  0.402265
16374  0.983870
16404  0.773942
16435  0.327271
16466  0.813580
16494  0.292830
16525  0.848269
...         ...
17044  0.595301
17074  0.171903
17105  0.355610
17135  0.477474
17166  0.517182
17197  0.891583
17225  0.591066
17256  0.799293
17286  0.225473
17317  0.444644

[36 rows x 1 columns]

将其转换回来:

In [392]: pd.to_datetime(df.index, unit='D')
Out[392]:
DatetimeIndex(['2014-06-30', '2014-07-31', '2014-08-31', '2014-09-30', '2014-10-31', '2014-11-30', '2014-12-31',
               '2015-01-31', '2015-02-28', '2015-03-31', '2015-04-30', '2015-05-31', '2015-06-30', '2015-07-31',
               '2015-08-31', '2015-09-30', '2015-10-31', '2015-11-30', '2015-12-31', '2016-01-31', '2016-02-29',
               '2016-03-31', '2016-04-30', '2016-05-31', '2016-06-30', '2016-07-31', '2016-08-31', '2016-09-30',
               '2016-10-31', '2016-11-30', '2016-12-31', '2017-01-31', '2017-02-28', '2017-03-31', '2017-04-30',
               '2017-05-31'],
              dtype='datetime64[ns]', freq=None)

【讨论】:

这可以完成这项工作,但让我思考......是否可以将日期 2017-05-31 设置为 20170531?这样可以节省我转换任何日期的时间吗? @maxu @Sledro,这是可能的,但仅适用于分类模型,不适用于回归。对于线性回归,您需要连续值 太棒了!感谢您的解决方案和回复:) @Sledro 但是你想做什么?如果你有 1970 年以来的日子,你基本上都在模仿趋势。但通常还希望从时间戳中导出变量,例如星期几、一年中的月份等,以做一些有用的事情(例如,对季节性进行建模)。

以上是关于如何解析 sklearns 线性回归的日期值?的主要内容,如果未能解决你的问题,请参考以下文章

使用sklearn进行线性回归时遇到值错误

当 p > n 时,sklearn 如何进行线性回归?

Sklearn 或 Pandas,用简单的线性回归估算缺失值

Python Sklearn 线性回归产生不正确的系数值

线性回归系数如何存储在 Sklearn 管道中?

使用 sklearn 线性回归,如何将计算出的回归系数约束为大于 0?