上篇说到了数据预处理和EDA,数据预处理是为了提高数据的可用性,而EDA则可以挖掘数据的规律,便于构造特征。在一个机器学习数据竞赛任务中,有句话叫做“特征决定任务能达到的高度,而模型和算法包括调参只是逼近这个高度”。特征工程的重要性是不言而喻的。对于我们这个任务而言,由于是时间序列问题,很多地方和其他类问题的处理不一样,比如时间序列问题在构造特征的时候就要包括到历史特征,还有时间窗特征,包括时间窗的sum,mean,median,std等,而线下验证集的划分则需要根据时间线来,不能用以往的交叉验证。


首先是构造label特征,由于训练数据给的是13年1月到15年10月的数据,需要我们预测的是15年11月份的数据,所以我们将每组数据在时间线上向后平移,即1月份的label是2月份的销量,依此类推,如下:

train_monthly['item_cnt_month'] = train_monthly.sort_values('date_block_num').groupby(['shop_id', 'item_id'])['item_cnt'].shift(-1)   #下个月的销量

构造商品的单位价格特征,即收入//销量,缺失数据采用零填充:

train_monthly['item_price_unit'] = train_monthly['item_price'] // train_monthly['item_cnt']
train_monthly['item_price_unit'].fillna(0, inplace=True)

对于每一个产品,计算产品的价格波动特征,包括最高价格和最低价格,以及价格增量和价格减量。

gp_item_price = train_monthly.sort_values('date_block_num').groupby(['item_id'], as_index=False).agg({'item_price':[np.min, np.max]})
gp_item_price.columns = ['item_id', 'hist_min_item_price', 'hist_max_item_price']train_monthly = pd.merge(train_monthly, gp_item_price, on='item_id', how='left')train_monthly['price_increase'] = train_monthly['item_price'] - train_monthly['hist_min_item_price']
train_monthly['price_decrease'] = train_monthly['hist_max_item_price'] - train_monthly['item_price']

看一下此时的数据:

接下来构造时间窗特征,窗口大小设置为3,时间窗可以对数据起到平滑的效果,同时也包含了一定的历史信息。这里我们用时窗构造出min,max,mean以及std特征,并对缺失数据进行零填充。

# Min value
f_min = lambda x: x.rolling(window=3, min_periods=1).min()
# Max value
f_max = lambda x: x.rolling(window=3, min_periods=1).max()
# Mean value
f_mean = lambda x: x.rolling(window=3, min_periods=1).mean()
# Standard deviation
f_std = lambda x: x.rolling(window=3, min_periods=1).std()function_list = [f_min, f_max, f_mean, f_std]
function_name = ['min', 'max', 'mean', 'std']for i in range(len(function_list)):train_monthly[('item_cnt_%s' % function_name[i])] = train_monthly.sort_values('date_block_num').groupby(['shop_id', 'item_category_id', 'item_id'])['item_cnt'].apply(function_list[i])# Fill the empty std features with 0
train_monthly['item_cnt_std'].fillna(0, inplace=True)

构造滞后历史特征,也就是将历史三个月的数据平移过来:

lag_list = [1, 2, 3]for lag in lag_list:ft_name = ('item_cnt_shifted%s' % lag)train_monthly[ft_name] = train_monthly.sort_values('date_block_num').groupby(['shop_id', 'item_category_id', 'item_id'])['item_cnt'].shift(lag)# Fill the empty shifted features with 0train_monthly[ft_name].fillna(0, inplace=True)

构造销量变化特征,通过计算滞后历史特征的变化量来得出:

train_monthly['item_trend'] = train_monthly['item_cnt']for lag in lag_list:ft_name = ('item_cnt_shifted%s' % lag)train_monthly['item_trend'] -= train_monthly[ft_name]train_monthly['item_trend'] /= len(lag_list) + 1

下面先划分数据集和验证集,这里由于我们使用了滞后平移操作以及时间窗的计算,所以我们丢弃前三个月的数据,同时将date_block_sum介于27到33之间的数据划分为线下的验证集。

train_set = train_monthly.query('date_block_num >= 3 and date_block_num < 28').copy()
validation_set = train_monthly.query('date_block_num >= 28 and date_block_num < 33').copy()
test_set = train_monthly.query('date_block_num == 33').copy()train_set.dropna(subset=['item_cnt_month'], inplace=True)
validation_set.dropna(subset=['item_cnt_month'], inplace=True)train_set.dropna(inplace=True)
validation_set.dropna(inplace=True)

分别对商店,商品,年和月构造销量的均值特征。

# Shop mean encoding.
gp_shop_mean = train_set.groupby(['shop_id']).agg({'item_cnt_month': ['mean']})
gp_shop_mean.columns = ['shop_mean']
gp_shop_mean.reset_index(inplace=True)
# Item mean encoding.
gp_item_mean = train_set.groupby(['item_id']).agg({'item_cnt_month': ['mean']})
gp_item_mean.columns = ['item_mean']
gp_item_mean.reset_index(inplace=True)
# Shop with item mean encoding.
gp_shop_item_mean = train_set.groupby(['shop_id', 'item_id']).agg({'item_cnt_month': ['mean']})
gp_shop_item_mean.columns = ['shop_item_mean']
gp_shop_item_mean.reset_index(inplace=True)
# Year mean encoding.
gp_year_mean = train_set.groupby(['year']).agg({'item_cnt_month': ['mean']})
gp_year_mean.columns = ['year_mean']
gp_year_mean.reset_index(inplace=True)
# Month mean encoding.
gp_month_mean = train_set.groupby(['month']).agg({'item_cnt_month': ['mean']})
gp_month_mean.columns = ['month_mean']
gp_month_mean.reset_index(inplace=True)# Add meand encoding features to train set.
train_set = pd.merge(train_set, gp_shop_mean, on=['shop_id'], how='left')
train_set = pd.merge(train_set, gp_item_mean, on=['item_id'], how='left')
train_set = pd.merge(train_set, gp_shop_item_mean, on=['shop_id', 'item_id'], how='left')
train_set = pd.merge(train_set, gp_year_mean, on=['year'], how='left')
train_set = pd.merge(train_set, gp_month_mean, on=['month'], how='left')
# Add meand encoding features to validation set.
validation_set = pd.merge(validation_set, gp_shop_mean, on=['shop_id'], how='left')
validation_set = pd.merge(validation_set, gp_item_mean, on=['item_id'], how='left')
validation_set = pd.merge(validation_set, gp_shop_item_mean, on=['shop_id', 'item_id'], how='left')
validation_set = pd.merge(validation_set, gp_year_mean, on=['year'], how='left')
validation_set = pd.merge(validation_set, gp_month_mean, on=['month'], how='left')

分离出训练集和验证集的输入X和输出Y。

# Create train and validation sets and labels.
X_train = train_set.drop(['item_cnt_month', 'date_block_num'], axis=1)
Y_train = train_set['item_cnt_month'].astype(int)
X_validation = validation_set.drop(['item_cnt_month', 'date_block_num'], axis=1)
Y_validation = validation_set['item_cnt_month'].astype(int)

转换integer特征。

# Integer features (used by catboost model).
int_features = ['shop_id', 'item_id', 'year', 'month']X_train[int_features] = X_train[int_features].astype('int32')
X_validation[int_features] = X_validation[int_features].astype('int32')

对测试集进行缺失特征的填充,填充规则为最近的一个月的特征,所以这里构造了一个lastest_records,latest_records为每个shop_id,item_id组合的最新的特征记录,如果每验证集的最后一个月出现了某种组合,则该组合特征记录一定是在最有一个月,如果最后一个月没有,则找最近的一个月份的特征记录。

latest_records = pd.concat([train_set, validation_set]).drop_duplicates(subset=['shop_id', 'item_id'], keep='last')
#latest_records为每个shop_id,item_id组合的最新的特征记录,如果每验证集的最后一个月出现了某种组合,则该组合特征记录一定是在最有一个月,如果最后一个月没有,则找最近的一个月份的
#特征记录
X_test = pd.merge(test, latest_records, on=['shop_id', 'item_id'], how='left', suffixes=['', '_'])  #让每个组合拥有最近的记录
X_test.head().append(X_test.tail())
X_test['year'] = 2015
X_test['month'] = 9
X_test.drop('item_cnt_month', axis=1, inplace=True)
X_test[int_features] = X_test[int_features].astype('int32')
X_test = X_test[X_train.columns]

对缺失数据按照shop_id进行中位数填充。

sets = [X_train, X_validation, X_test]for dataset in sets:for shop_id in dataset['shop_id'].unique():for column in dataset.columns:shop_median = dataset[(dataset['shop_id'] == shop_id)][column].median()dataset.loc[(dataset[column].isnull()) & (dataset['shop_id'] == shop_id), column] = shop_median# Fill remaining missing values on test set with mean.
X_test.fillna(X_test.mean(), inplace=True)

丢弃无用的id。

X_train.drop(['item_category_id'], axis=1, inplace=True)
X_validation.drop(['item_category_id'], axis=1, inplace=True)
X_test.drop(['item_category_id'], axis=1, inplace=True)

查看一下测试集数据和验证集数据:

测试集:

验证集:

作者CSDN博客:

https://blog.csdn.net/wlx19970505​blog.csdn.net

kaggle房价预测特征意思_未来销量预测——Kaggle基础方案(三):特征工程及线下验证划分...相关推荐

  1. 根据历史数据预测未来数据_未来销量预测——Kaggle基础方案(一):赛题背景和数据字段分析...

    笔者将分享一次kaggle数据竞赛的实例,包括了数据竞赛的基本套路流程:赛题业务背景分析,数据探索(EDA),特征工程,单模预测(特征重要性分析)以及stacking模型融合. 本次赛题的链接: Pr ...

  2. Kaggle项目:Predict Future Sales(商品未来销量预测)

    Predict Future Sales(商品未来销量预测) 1. 关于项目 1.1 背景介绍 1.2项目数据集说明 2. 目标 3. 数据预处理 3.1 项目数据集预处理 3.1.1 训练集和测试集 ...

  3. 时间序列分析_餐厅销量预测_2022_5_14

    最近看到一个餐厅销量预测的代码,奈何目前statsmodels 版本已经是0.13.2,之前代码运行报错 p,q = bic_matrix.stack().idxmin() 一开始以为是数据类型问题, ...

  4. kaggle 猫狗数据标签_动手变形金刚(Kaggle Google QUEST问题与解答标签)。

    kaggle 猫狗数据标签 This is a 3 part series where we will be going through Transformers, BERT, and a hands ...

  5. 用python预测车牌价格_利用python预测二手车售价

    思路:影响二手汽车售价的特征很多,比如汽车品牌,汽车性能,上牌年限等,同样的零部件参数,不一样的品牌,对应的售价是不一样的,而车的品牌众多,不在参数范围之内,所以本文将售价与新车价的比例作为目标进行分 ...

  6. 华为麦芒5云空间升级_云+AI+5G 华为云联手中软国际引爆线下门店智能化升级

    一年一度的华为旗舰大会:2019华为全联接大会于9月18~20日在上海隆重举行.华为云和中软国际携手联合打造的智慧门店解决方案在这次盛会正式向零售行业发布.助力零售企业加速数字化.推进智能化,为顾客提 ...

  7. python预测足球比赛_机器学习算法预测足球赛事的模型比较(一)

    本文是作者前一段时间关注足球赛事时做的一点分析,内容涉及基于足球数据进行描述性统计分析.基于机器学习建模与传统的泊松模型建模三大部分,由于文章较长,将分两部分进行展现. 第一部分为前言与述性分析部分1 ...

  8. python预测随机数据_随机森林预测

    Python部落(python.freelycode.com)组织翻译,禁止转载,欢迎转发. 当涉及到预测数据(时间序列或其他类型的序列)时,人们会关注基本回归.ARIMA.ARMA.GARCH,甚至 ...

  9. 麦咭智能机器人宣传片_【头脑风暴】移动机器人能够撬动上亿线下流量,挖掘市场增量吗?...

    近年来,在智能制造背景下,对于移动机器人相关的产品的需求景气度显著上升.用于产品分拣.搬运的机器人在制造.物流等场景中的应用日益广泛,部署效果不断提升. 基于此,为更好的服务于机器人行业,给机器人行业 ...

  10. left join on多表关联_资深DBA整理MySQL基础知识三:迅速理解MySQL的关联和子查询...

    接上篇: 上篇主要介绍select的基本的构成,和一些简单常用条件语句.这篇着重说几种常用的多表关联关系. 前面入门只说了一种表的简单查询.但在实际工作几乎不会出现单表操作的情况,大多数还是多表的连接 ...

最新文章

  1. 深入理解JAVA虚拟机 虚拟机性能监控和故障处理工具
  2. 奖金16万!首届电子商务AI算法大赛ECAA报名开启
  3. 数据库性能检查指导方案
  4. 15年来这8门编程语言位置十分稳定,C#从低谷开始爬升
  5. android thread实例
  6. url传递中文的解决方案总结
  7. Spring Boot + Spring Data + Elasticsearch实例
  8. FreeRTOS的内存管理
  9. 复杂对象ibatis插入,属性为list,怎么一次性插入
  10. 蓝牙耳机性能测试软件,操作方便吗 蓝牙耳机横评之功能测试篇
  11. 佳能相机G7 Mark Ⅱ (测光与对焦)
  12. 网络创业者之家:普通人想要获得“第一桶金”,要记住这3点
  13. 古典密码分析(冗余度,唯一解距离,语言统计,重合指数)
  14. Android 相机预览 横屏竖屏 -- 显示
  15. C++编译器优化:Copy Elision
  16. pytorch第06天 图片分类器
  17. latex论文模板:中文小论文
  18. 如何运用政务智慧引导系统提升群众办事效率
  19. HUD2767 进阶版 [强连通分量]
  20. 计算机桌面怎么锁,电脑怎么上锁,详细教您怎么给电脑屏幕上锁

热门文章

  1. 毕设题目:Matlab三维装箱
  2. 【图像修复】基于matlab GUI维纳滤波图像复原【含Matlab源码 851期】
  3. python网络开发框架_宿迁python网站开发框架收费
  4. unityui计分_铅计分成长
  5. 图像增强python_Python图像增强简介(第1部分)
  6. oracle的double类型,JDBC中使用Oracle的binary_float和binary_double类型
  7. 显示lib包_Java 添加、删除、移动、隐藏/显示Excel工作表
  8. java map sort_Map 按值排序 (Map sort by value) – Java | 学步园
  9. corspost请求失败_利用CORS实现POST方式跨域请求数据
  10. kafka测试工具_kafka压测工具:同步方式2000+、异步方式10000+、带源码