使用Scikit learn进行日期变量回归

2024-04-23 10:14:12 发布

您现在位置:Python中文网/ 问答频道 /正文

我有一个Pandas数据框,它有一个数据类型为date的列(例如:2013-04-01)。当我将该列包含在X_train中并尝试拟合回归模型时,会得到错误float() argument must be a string or a number。删除date列可避免此错误。

在回归模型中考虑date的正确方法是什么?

代码

data = sql.read_frame(...)
X_train = data.drop('y', axis=1)
y_train = data.y

rf = RandomForestRegressor().fit(X_train, y_train)

错误

TypeError                                 Traceback (most recent call last)
<ipython-input-35-8bf6fc450402> in <module>()
----> 2 rf = RandomForestRegressor().fit(X_train, y_train)

C:\Python27\lib\site-packages\sklearn\ensemble\forest.pyc in fit(self, X, y, sample_weight)
    292                 X.ndim != 2 or
    293                 not X.flags.fortran):
--> 294             X = array2d(X, dtype=DTYPE, order="F")
    295 
    296         n_samples, self.n_features_ = X.shape

C:\Python27\lib\site-packages\sklearn\utils\validation.pyc in array2d(X, dtype, order, copy)
     78         raise TypeError('A sparse matrix was passed, but dense data '
     79                         'is required. Use X.toarray() to convert to dense.')
---> 80     X_2d = np.asarray(np.atleast_2d(X), dtype=dtype, order=order)
     81     _assert_all_finite(X_2d)
     82     if X is X_2d and copy:

C:\Python27\lib\site-packages\numpy\core\numeric.pyc in asarray(a, dtype, order)
    318 
    319     """
--> 320     return array(a, dtype, copy=False, order=order)
    321 
    322 def asanyarray(a, dtype=None, order=None):

TypeError: float() argument must be a string or a number

Tags: orindatadatelibpackages错误site
3条回答

最好的方法是使用1/K编码(例如通过DictVectorizer)将日期分解成一组以布尔形式编码的分类特征。以下是一些可以从日期中提取的特征:

  • 一天中的一小时(24个布尔特征)
  • 星期几(7个布尔特征)
  • 每月的第几天(最多31个布尔特征)
  • 一年中的月份(12个布尔特征)
  • 年份(数据集中不同年份的布尔特征数量) ...

这将使我们有可能确定典型人类生命周期中周期性事件的线性依赖关系。

此外,您还可以提取一个浮动日期:将每个日期转换为训练集的最小日期之后的天数,并除以最大日期与最小日期之间的天数之差。该数值特征应能确定事件日期输出之间的长期趋势:例如,回归问题中的线性斜率,以便更好地预测未来几年的演变,而这种演变不能用年份特征的布尔分类变量编码。

你有两个选择。您可以将日期转换为序数,即表示自第1年第1天起的天数的整数。您可以通过datetime.datetoordinal函数来完成此操作。

或者,可以使用sklearn的OneHotEncoder将日期转换为分类变量。它所做的是为每个不同的日期创建一个新变量。因此,与值为['2013-04-01', '2013-05-01']的列date不同,您将有两个值为[1, 0]的列date_2013_04_01和值为[0, 1]的列date_2013_05_01

如果有许多不同的日期,我建议使用toordinal方法;如果不同日期的数量很小,建议使用一个热编码器(根据数据的大小和日期与输出变量之间的关系,可以选择10-100)。

在使用@ogrisel建议的1/K编码进行布尔编码之前,您可以尝试丰富您的数据并使用可以从datetime类型中提取的功能数,即星期几、月日、年日、年周、季度等。 请参见示例https://pandas.pydata.org/pandas-docs/stable/generated/pandas.DatetimeIndex.weekofyear.html和指向其他函数的链接。

相关问题 更多 >