摘要:想要更好的改变用户体验,非常重要的点在于在用户交易过程前,提前预测到用户的需求,做到“口未开,物先呈”
明确需求
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)
根据特征量级,切分特征组
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|imageView2/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|imageView2/2/w/1240)
可以看到,`log(lambda)`在-6与-7之间时,为损失函数可接受范围内,惩罚力度较大的参数值,再通过`coef(las1.1se)`观察如下:
![](http://upload-images.jianshu.io/upload_images/1129359-709c4d28e3488406.png?imageMogr2/auto-orient/strip|imageView2/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)
压缩,这边最简单的就是:
当用户触发商品周期性或商品合理性原则的时候采取第二个公式,否则第一个公式