使用Scikit-learn使用Date变量进行回归

Nyx*_*nyx 21 python numpy python-2.7 pandas scikit-learn

我有一个数据帧大熊猫与date列(如2013-04-01D型细胞)datetime.date.当我包含该列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)
Run Code Online (Sandbox Code Playgroud)

错误

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
Run Code Online (Sandbox Code Playgroud)

ogr*_*sel 29

最好的方法是使用1-of-K编码将日期分解为以布尔形式编码的一组分类特征(例如,由DictVectorizer完成).以下是可以从日期中提取的一些功能:

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

这应该可以识别典型人类生命周期中对周期性事件的线性依赖性.

此外,您还可以提取单个浮动的日期:将每个日期转换为自训练集的最小日期以来的天数,并除以最大日期与最小日期的天数之间的天数之差.该数字特征应该可以识别事件日期输出之间的长期趋势:例如,回归问题中的线性斜率,以更好地预测未来年份的演变,这些年度无法使用年份特征的布尔分类变量进行编码.

  • 你的答案非常好.但是,我认为在某些情况下维持秩序很重要,例如:日期的顺序,或者一周的日期.我认为这取决于问题并尝试不同的方式. (4认同)

And*_*bas 11

你有两个选择.您可以将日期转换为序,即表示自1 1年的一天你可以通过做这个天数的整数datetime.datetoordinal函数.

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

toordinal如果您有许多不同的日期,我建议使用这种方法,如果不同日期的数量很小,我建议使用一个热编码器(假设最多10到100,具体取决于您的数据大小以及日期具有哪种关系)用输出变量).