Python数据分析-基于超参数优化的Gradient Boosting 的销售预测

案例背景

商品销售预测是每个运营部门的必备数据支持项目,无论是大型促销活动还是单品营销均为如此。该案例是针对某单品做的订单量预测应用。

案例数据

案例数据来源于《python数据分析和数据化运营》第六章的products_sales.txt。以下是数据概况:
特征变量数:10
数据记录数:731
是否有Na值:是
是否有异常值:是
以下是本数据集10个特征变量:
~limit_info:是否有限购字样信息提示,1代表有,0代表无
~campaign_type:促销活动类型,分类型变量,值域为[0,6],代表7种不同的促销活动,例如单品活动、跨店铺活动、综合性活动和3C大品类活动。
~campaign_level:促销活动的重要性,分类型变量,值域为[0,1],分别代表不重要和重要。
~product_level:产品重要性分级:分类型变量,值域为[1,3],分别代表运营部门对于商品重要性的分级。
~resource_amount:促销资源位数量,整数型变量,代表每次该商品在参加促销活动时有多少个资源位入口。
~email_rate:发送电子邮件中包含该商品的比例,浮点型变量,值越大代表包含该商品的电子邮件越多。值域为[0,1]
~price:单品价格,整数型变量,代码商品在不同阶段的实际销售价格。
~discount_rate:折扣率,浮点型变量,值域为[0,1],值越大代表折扣力度越大。
~hour_resources:在促销活动中展示的小时数,整数型变量,值越大代表展示的时间越长。
~campaign_fee:该单品的促销费用,整数型变量,值越大代表用于该单品的综合促销费用越高,这里面包含促销费用、广告费用、优惠券费用等综合摊牌费用。
目标变量:orders,代表该单品在每次活动中形成的订单量。

案例数据分析

1.库的导入

基本的数据处理需要导入numpy库,数据审查、异常值处理等需要导入pandas库,实现销售量的预测需要导入GradientBoosting的回归库,实现对超参数的交叉检验需要导入GridSearchCV库,最后展示销售量的变化需要用到Matplotlib库。

import pandas as pd
import numpy as np
from sklearn.ensemble import GradientBoostingRegressor
from sklearn.model_selection import GridSearchCV
import matplotlib.pyplot as plt

2.数据导入与数据审查

采用pandas的read_table方法读取txt文件,并对导入的数据进行数据概率、缺失值查看等。

data=pd.read_table('products_sales.txt',delimiter=',')
#数据审查和检验,包括缺失值,异常值等
#数据基本信息描述
def data_overview(data):
    print('{:*^60}'.format('Data Overviw'))
    print(data.shape[0],'*',data.shape[1])
    print('{:*^60}'.format('Data types'))
    print(data.dtypes)
    print('{:*^60}'.format('Data DESC'))
    print(data.describe().round(1).T)

data_overview(data)

#缺失值审查
print('有缺失值的列:')
print(data.isnull().any(axis=0))
na_rows=data.isnull().any(axis=1)
print('有缺失值的行的总数:')
print(na_rows.sum())
print(data[na_rows])

#异常值审查
cols=['limit_infor','campaign_type','campaign_level','product_level']
for col in cols:
    unique_value=np.sort(data[col].unique())
    print('{1} unique values {0}'.format(unique_value,col))

data[data['limit_infor']==10]

#相关性分析,做回归的共线性检验
short_name=['li','ct','cl','pl','ra','er','price','dr','hr','cf','orders']
long_name=data.columns
name_dict=dict(zip(long_name,short_name))

print(name_dict)
print(data.corr().round(2).rename(index=name_dict,columns=name_dict))

运行结果:
(1)异常值
异常值
~limit_info的值域为[0,1],最大值确出现了10
~campaign_fee的最大值为33380,严重超过均值
(2)缺失值
缺失值
price字段存在缺失值,且总共缺失2行。
(3)相关分析相关系数
‘email_rate’和’resource_amout’有着很高的相关性,这里先暂时不做处理。

3.数据预处理

(1)异常值、缺失值处理

sales_data=data.fillna(data['price'].mean())
sales_data=sales_data[sales_data['limit_infor'].isin((0,1))]
sales_data['campaign_fee']=sales_data['campaign_fee'].replace(33380,sales_data['campaign_fee'].mean())
print('transformed Data desc:')
print(sales_data.describe().round(2).T)

采用price的平均值填充缺失值;对limit_info中值域为10的记录做丢弃;
campaign_fee中的异常值采用该字段的均值替换。
(2)特征集和目标数据的分割

#数据集分割
X=sales_data.ix[:,:-1]
y=sales_data.ix[:,-1]

4.模型最优化参数训练及检验

(1)模型参数优选

#模型优选
md_gbr=GradientBoostingRegressor()
parameters={
        'loss':['ls','lad','huber','quantile'],
        'min_samples_leaf':[1,2,3,4,5],
        'alpha':[0.1,0.3,0.6,0.9]
        }
gs_cv=GridSearchCV(md_gbr,param_grid=parameters,cv=5)
gs_cv.fit(X,y)
print('最佳分数:',gs_cv.best_score_)
print('最佳参数:',gs_cv.best_params_)
print('交叉选择结果:',gs_cv.cv_results_)

在该步骤中,首先建立了GradientBoostingRegressor模型对象,然后设置交叉检验时用到的模型可选参数,并采用GridSearchCV建立交叉检验模型对象。交叉模型对象创建完成之后,使用fit方法做训练,然后分别通过训练后的对象的best_score_和best_params_属性获取最佳结果的得分以及最佳参数组合。

最佳分数: 0.931597523304
最佳参数: {'alpha': 0.9, 'loss': 'huber', 'min_samples_leaf': 3}

(2)获得最佳训练模型

#获得最佳训练模型
best_model=gs_cv.best_estimator_
best_model.fit(X,y)
plt.style.use('ggplot')
plt.figure()
plt.plot(np.arange(X.shape[0]),y,label='true y')
plt.plot(np.arange(X.shape[0]),best_model.predict(X),label='predicted y')
plt.legend(loc=0)
plt.show()

为了验证模型的效果,通过折线图来展示预测值与实际值的拟合程度。
图形结果如下图所示:
拟合情况图

5.新数据的预测

当给出新的需预测数据时,采用最佳模型的predict方法做预测,结果取整数。

#预测
New_X=np.array([[1,1,0,1,15,0.5,177,0.66,101,798],[0,1,0,1,15,0.8,177,0.66,101,798]])
print(best_model.predict(New_X).round(0))

预测结果:

[ 779.  797.]

通过预测发现,两条新的数据记录的订单预测量分别为:779和797。

注意点:在相关回归分析步骤中,我们发现其中的两个变量具有高相关性,但是却没有做任何处理。这是因为在交叉检验中使用的huber损失函数做回归评估时,它能够兼顾(一定程度上解决共线性的问题)。

注:以上分析案例摘自宋天龙所著《Python数据分析与数据化运营》

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值