构造时间序列特征训练数据集时的几个trick

参考链接

1、评价指标RMSE/MAPE/MSE/MAE

计算RMSE/MAPE

2、构造lagging

def create_lagging(df,df_original,i):
    df1=df_original.copy()
    df1['time_interval_begin']=df1['time_interval_begin']+pd.DateOffset(minutes=i*2)
    df1=df1.rename(columns={'travel_time':'lagging'+str(i)})
    df2=pd.merge(df,df1[['link_ID','time_interval_begin','lagging'+str(i)]],on=['link_ID','time_interval_begin'],how='left')
    return df2
df1 = create_lagging(df, df, 1)
for i in range(2, 6):
    df1 = create_lagging(df1, df, i)
df1.head(6)
 link_IDtime_interval_begintravel_timedatelengthwidthlink_classin_linksout_linkslinks_numarealink_ID_enlagging1lagging2lagging3lagging4lagging5
043779062898695005142017-04-01 06:00:001.0266722017-04-0157311.01.01.0,1.017149NaNNaNNaNNaNNaN
143779062898695005142017-04-01 06:02:001.0266722017-04-0157311.01.01.0,1.0171491.026672NaNNaNNaNNaN
243779062898695005142017-04-01 06:04:001.0144542017-04-0157311.01.01.0,1.0171491.0266721.026672NaNNaNNaN
343779062898695005142017-04-01 06:06:001.0144542017-04-0157311.01.01.0,1.0171491.0144541.0266721.026672NaNNaN
443779062898695005142017-04-01 06:08:001.0144542017-04-0157311.01.01.0,1.0171491.0144541.0144541.0266721.026672NaN
543779062898695005142017-04-01 06:10:001.0144542017-04-0157311.01.01.0,1.0171491.0144541.0144541.0144541.0266721.026672

3、 ①构造训练集,②模型调参找到合适的参数,③测试集导出未来几个时刻的结果;以上为接下来详述的三个部分

①构造训练集:

数据正则化,删除离群点。

找到缺失值,填充缺失值。

构造时间特征:lagging(12345)、day_of_week(这一天是周几,可以聚类减少分类)、hour_en(是一天的第几个小时,可以聚类)、week_hour(这个是由day_of_week和hour_en合并得到的,之后要独热编码)、vocation(是否为国家法定假期)......

构造相关重要特征(比如天池智慧交通中要构造与路况相关的特征):length(路长)、width(路宽)、in_links\out_links(出入度)、link_nums(这个是由in_links和out_links合并得到的,之后要进行独热编码)、ID_en(根据travel_time对ID进行排序生成新的id并作为特征)

独热编码和label编码的区别

什么情况下进行one hot 编码?。。。。

(1)解决类别型数据的离散值问题。

(2)离散特征编码,离散特征的取值之间没有大小的意义,比如color:[red,blue],那么就选择独热编码。使得非偏序关系的变量取值不具有偏序性,编码后的特征可以看做连续的特征,可以进行归一化。这里选择对week_hour进行独热编码。

(3)对ID进行one-hot编码,如果要进行label encode的话这里选择了和travel time相关的排序编码,缺点是这样容易过拟合。

(4)xgboost和随机森林能够同时处理连续和离散的特征,但是以现在的实现来看,这两者还不具备对把这1到132数字当做类别去看待,因为这两者(scikit的random forest和官方xgboost)对特征划分方式的实现(回归)是基于Numerical的, 与基于信息熵的决策树不同,他们会认为根据id的大小去选择划分点,因此对于想要使用scikit的随机森林和xgboost来说,onehot是必要的。

(5)基于numerical和基于信息熵有什么区别,为什么前者不能进行label编码,后者可以?

df2.loc[df2['day_of_week'].isin([1, 2, 3]), 'day_of_week_en'] = 1
df2.loc[df2['day_of_week'].isin([4, 5]), 'day_of_week_en'] = 2
df2.loc[df2['day_of_week'].isin([6, 7]), 'day_of_week_en'] = 3
df2.loc[df['time_interval_begin'].dt.hour.isin([6, 7, 8]), 'hour_en'] = 1
df2.loc[df['time_interval_begin'].dt.hour.isin([13, 14, 15]), 'hour_en'] = 2
df2.loc[df['time_interval_begin'].dt.hour.isin([16, 17, 18]), 'hour_en'] = 3
df2['week_hour'] = df2["day_of_week_en"].astype('str') + "," + df2["hour_en"].astype('str')
df2.loc[df2['links_num'].isin(['0.0,2.0', '2.0,0.0', '1.0,0.0']), 'links_num'] = 'other'
df2 = pd.get_dummies(df2, columns=['week_hour', 'links_num', 'width'])
df2.head()

 

②得到训练集之后进行train and cross valid,关键是分几个cross valid(5~10个)

关键是cross valid的作用是什么?。。。。

(1)数据集较小时防止overfitting过拟合;找到合适的模型参数(可以选择平均n次训练的模型参数);

(2)数据集足够大时不需要交叉验证,因为训练时间要加倍,而数据集较大的时候训练时间成本太大并且没必要。

(3)天池的这个比赛当中可以选择进行交叉验证,采用5-交叉验证,并用平均值作为模型参数,训练的时候可以采用ParameterGrid()进行网格调参

③找到了合适的参数就可以在这个参数集的条件下进行训练和预测,预测的切片和长度可以在这个时候确定,输出格式也要注意。

 

  • 2
    点赞
  • 5
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值