Predict Future Sales 读kernel之1

导航

 

原kernel地址

数据预处理

特征

特殊处理

编程技巧

待处理问题


原kernel地址

feature engineering ,xgboost

数据预处理

  • 察看数据的最值,比如price最小值为负,这就发现了异常
  • 查看数据的箱型图,可以发现离群点。
  • 缺失值
import missingno
missingno.matrix(train)

特征

要预测第34个月的销量,test只给了 item id , shop id, date block num。除了固有的商品和店铺的属性(比如,商品的种类,店铺所在城市)可以在train 和test 同时得到外,其他的train有而test没有的特征(比如,商品价格,每日销量)只能用Lag

对于lag型特征,首先,因为是针对每月销量进行预测,所以,先将原始数据文件的每日销量整合成每月销量。

针对每个date block - item,可以计算lag = [1,2,3,6,12]的每月销量。

同理的,对于 date block - shop,  date block - shop - item 也可以计算lag = [1,2,3,6,12]的每月销量

上述特征的lag取值是因为销量有明显的周期性,并且,这几个特征相对比较重要,所以lag取了6个值。

有的特征作者直观感觉或者模型重要性不高,就只有lag = 1。

对于price 变量,作者只计算了有记录的差值,表示价格的趋势

此外,还有item-first-sale, item-last-sale, item-shop-first/last-sale记录上一次卖出是多少个月前等等。

特殊处理

  • 测试集中出现了训练集没有的商品共300+,这些商品的相关lag为0,模型要对lag为0的商品进行预测,为保证准确性,训练集中也该包含这种lag为0的数据。作者对训练集的date block   ,shop , item 做笛卡尔积,缺失值用0填充。这样保证了训练集和测试集的分布相同。
  • 题目要求最终结果clip到(0,20),即小于0的全部取值为0,大于20的全部取值为20。所以先把train的每月销量clip。

编程技巧

  • loc标签数组
train.loc[train.item_price<0, 'item_price'] = median
  •  为节省内存,可以转换数据类型。
matrix['shop_id'] = matrix['shop_id'].astype(np.int8)
matrix['item_id'] = matrix['item_id'].astype(np.int16)

注意,“I use floats instead of ints for item_cnt_month to avoid downcasting it after concatination with the test set later. If it would be int16, after concatination with NaN values it becomes int64, but foat16 becomes float16 even with NaNs.

matrix = pd.merge(matrix, group, on=cols, how='left')
matrix['item_cnt_month'] = (matrix['item_cnt_month']
                                .fillna(0)
                                .clip(0,20) # NB clip target here
                                .astype(np.float16))
  • 巧妙的lag,避免了一个个的取填充,效率大大提高。下面对比两种方法:
def lag_feature(df, lags, col):
    tmp = df[['date_block_num','shop_id','item_id',col]]
    for i in lags:
        shifted = tmp.copy()
        shifted.columns = ['date_block_num','shop_id','item_id', col+'_lag_'+str(i)]
        shifted['date_block_num'] += i
        df = pd.merge(df, shifted, on=['date_block_num','shop_id','item_id'], how='left')
    return df
ts = time.time()
matrix = lag_feature(matrix, [1,2,3,6,12], 'item_cnt_month')
time.time() - ts

 用时40秒

for i in range(len(data)):
    id = data.iat[i,0]
    date = data.iat[i,1]
    if date>=12:
        data.iat[i,5] = data[(data.item_id==id)&(data.date_block_num==date-2)].item_cnt_day if len(data[(data.item_id==id)&(data.date_block_num==date-2)])==1 else 0
        data.iat[i,6] = data[(data.item_id==id)&(data.date_block_num==date-3)].item_cnt_day if len(data[(data.item_id==id)&(data.date_block_num==date-3)])==1 else 0
        data.iat[i,7] = data[(data.item_id==id)&(data.date_block_num==date-7)].item_cnt_day if len(data[(data.item_id==id)&(data.date_block_num==date-7)])==1 else 0
        data.iat[i,8] = data[(data.item_id==id)&(data.date_block_num==date-10)].item_cnt_day if len(data[(data.item_id==id)&(data.date_block_num==date-10)])==1 else 0
        data.iat[i,9] = data[(data.item_id==id)&(data.date_block_num==date-12)].item_cnt_day if len(data[(data.item_id==id)&(data.date_block_num==date-12)])==1 else 0

用时二十分钟 

待处理问题

  • id类特征(item- id,shop-id)作者都保留下来,没有独热编码,简单的放在那里,并且用xgboost输出重要性。
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值