前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >应用:商品需求预估

应用:商品需求预估

作者头像
sladesal
发布2018-08-27 11:24:14
4210
发布2018-08-27 11:24:14
举报
文章被收录于专栏:机器学习之旅机器学习之旅

摘要:想要更好的改变用户体验,非常重要的点在于在用户交易过程前,提前预测到用户的需求,做到“口未开,物先呈”

明确需求

1.用户会是哪些人?

假设现在有这么一个人,23岁,一线城市白领,常常出入城市CBD,之前没有任何的平台行为,刚刚注册app,那么他会买什么?

我们的用户

接下来,我们通过用户仅有的一些特征做一些角色分析:

(1)23岁+一线城市,这意味着他90%的可能以上是单身,90后且极有可能刚毕业不久,同时又在一线城市,属于中低收入但是中高开支。所以,可以排除该用户属于大家电、女性用品、奢侈品、旅游用品、理财等需求

(2)常常出入CBD,城市中心,这说明有稳定工作,稳定收入(虽然不多),饮食可能不规律,同时可能私人时间较少。所以,一定程度上可能用户对休闲夸张的服饰需求较少,对便携式的健身器材、速食品存在潜在的可能

(3)从未用过app,是app的新用户,根据app的定位,易购因为便利的物流体验,多吸引大家电、电子产品的目标用户,结合1、2两条,可能用户这次注册的可能需求是手机或者电脑这些电子产品较大

以上的过程其实是通过用户的特征画像对用户进行刻画,也就是特征筛选,从性别,年龄,角色等一些特征来划分群体,结合对应群体的购买行为,推荐群体契合度高的商品。


2.用户会买或者考虑买什么?

选择.png

这种过程也就是数据挖掘过程中的特征准备,根据历史经验看来,诸如:搜索、浏览、历史订单等,再加上用户的近期行为,我们可以得到几个方向:

物品喜好:一个月前他想买什么,近几天他想买什么样的东西,我们都有个大概的范围

风格喜好:有个大概的范围,分析用户的相应行为,比如对应的手机的话,可能带了一些关键词,简约,白色等等这些,所以我们不妨试试iphone或者锤子

价值喜好:到底是iphone或者是锤子,通过当前手机型号比如安卓旗舰机器,可能用户对ip好呢的需求会大一些,若是安卓千元款,用户可能更偏向一些相对廉价的手机

其实这样的过程,可以总结为:f(x)= R(a1*x1)+...,通过用户的行为x,用户行为的对需求结果的价值a,需求时效性R,综合判断出此刻,这个用户对各类产品的需求程度。

除此之外,有一些决定性因素,需要单独考虑:

a.商品周期性,假设用户最有可能购买的是冰箱,但是这个用户1周之前刚买了冰箱,那你此刻再给他推送冰箱,他购买的可能性几乎为0;而要是把冰箱换作是零食或者水,结果往往截然相反

b.商品合理性,夏天买取暖器,冬天买花露水等行为不是不可能发生,但是它发生的可能性要远远小于可接受的可信值,所以一定程度上,避免发生这种情况

其实这样的过程,可以总结为:g(x)=w' * f(x),通过w'压缩用户需求可能性f(x)变化区间在[0,1]上

3.那么如何实现呢?

现在,我们通过R语言实现一次简单的用户需求预测:

a.首先,我们对若干数据进行清洗,干掉不合理的异常值、缺失值、规范化数值特征等

读取历史上购买目标商品的用户(label=1)与未购买的用户(label=0)的特征数据 data_base<-read.table('supermarket_second_dried_milk_train_another.txt',header=T) 数据备份 train_data<-data_base 将是否老用户、是否目标类目下的老用户0-1化,将是否变成机器可读的语言 train_data$status<-as.factor(train_data$status) train_data$aimed_status<-as.factor(train_data$aimed_status) 根据特征量级,切分特征组

代码语言:javascript
复制
data00<-subset(data_all,select = c(max_date_diff,aimed_max_date_diff))
data01<-subset(data_all,select = c(max_pay,per_pay,six_month_max_pay,six_month_per_pay...)
data02<-subset(data_all,select = c(cnt_time,six_month_cnt_time,three_month_cnt_time,...)
data03<-subset(data_all,select = c(pv_visit_last_period,search_last_period,...)

箱式理论,压缩特征范围

代码语言:javascript
复制
data_action00<-function(x){
        x<-as.numeric(as.character(x))
        y<-quantile(x,0.98,na.rm = T)
        x[x>y]<-y
        x[is.na(x)]<-max(x[!is.na(x)&x>0])
        x[x<0]<-max(x[!is.na(x)&x>0])
        return(x)
}

for(i in 1:ncol(data00)){
        data00[,i]<-data_action00(data00[,i])
}```
*整理后的数据合并*

data_new<-cbind(date=train_dataaimed_date,label=train_datalabel,status=train_datastatus,aimed_status=train_dataaimed_status,data00,data01,data02,data03)

代码语言:javascript
复制
`data_action01`、`data_action02`、`data_action03`同理,此处的p值,根据业务实际选取,压缩p值以上的离群点
这边建议参考:
[[数据预处理-缺失值处理](http://www.jianshu.com/p/5d883a293730)](http://www.jianshu.com/p/5d883a293730)
[数据预处理-异常值处理](http://www.jianshu.com/p/b490ac402fe6)
****
通过table函数,我们发现,
![](http://upload-images.jianshu.io/upload_images/1129359-0f266d7c55f8d5ef.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)
用户数据数据极度不均匀,未购买的用户数量级:购买用户的数量级:未购买用户的数量级=33:1
关于数据预测中,数量级极度不平衡的处理方式通过交叉抽样的方法,及随机有放回抽取label=0、1的用户数据,组成新数据集

library(ROSE) data_balanced_both <- ovun.sample(label ~ ., data = data_new, method = "both",p=0.3,N = 8*nrow(data_new[data_newlabel==1,]),seed = 1)data```

这边method=‘both’为双向采样,‘under’为欠采样,通常为常见采样方法。p=0.3为label=1的采样结果占比,N为总采样用户数据量 接下来在通过lasso压缩特征个数:

代码语言:javascript
复制
library(glmnet)
y<-data_balanced_both$label
x<-data_balanced_both[,5:ncol(data_balanced_both)]
x<-as.matrix(x)
las1 <- glmnet(x,y, family = "binomial", alpha = 1)
las1.cv <- cv.glmnet(x = x, y = y, family = "binomial", alpha = 1, nfold = 10)
las1.1se <- glmnet(x = x, y = y, family = "binomial", alpha = 1, lambda = las1.cv$lambda.1se)```

我们,先看下las1.cv中,随着lambda变化,损失函数变化情况:
![](http://upload-images.jianshu.io/upload_images/1129359-bc4008a23efad142.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

可以看到,`log(lambda)`在-6与-7之间时,为损失函数可接受范围内,惩罚力度较大的参数值,再通过`coef(las1.1se)`观察如下:

![](http://upload-images.jianshu.io/upload_images/1129359-709c4d28e3488406.png?imageMogr2/auto-orient/strip%7CimageView2/2/w/1240)

再删除被lasso剔除掉的变量,诸如six_month_per_pay等,得到新的数据集:
`data_balanced_both_new_one<-subset(data_balanced_both,select=-c(six_month_per_pay,...)`

再通过logistic模型计算用户的下单概率,并通过逐步回归剔除不显著的变量:

model<-glm(label~.,data = data_balanced_both_new_one[,-1],family = binomial(link='logit')) step(model)```

保证得到的变量系数均显著,每个变量存在均有意义 最后得到的model即为目标函数R(x)

在通过sigmod变形即可得到f(x),再考虑最初我们提到的商品周期性、商品合理性的g(x)压缩,这边最简单的就是:

当用户触发商品周期性或商品合理性原则的时候采取第二个公式,否则第一个公式

本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2017.07.03 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 1.用户会是哪些人?
  • 2.用户会买或者考虑买什么?
  • 3.那么如何实现呢?
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档