探索推荐系统(附R语言实战案例)

来源:sjfxjx    发布时间:2019-03-14 20:27:26


引言

在生活中我们怎样给别人推荐呢?是根据我们过去的经验。


现在想象一下,如果现在在现实生活中我们依据数据做我们及时的推荐会怎么样?首先,我们会感觉像一个明智的建议者。其次,我们不再是人类。因此,我们的目的是构建聪明的软件,这个软件要能给我们提供一些令人信服的推荐。


当我们访问像亚马逊、Netflix、imdb等网站时,我们下意识的暴露在推荐系统中。很显然,他们已经变成了网上营销不可缺少的一部分(在线推销产品)。我们在这里对他们做一下进一步的了解。


在这篇文章里,我已经利用了一个真实生活的例子解释推荐系统的工作方法,就是要告诉你不局限于在线营销。而且,通过在R中的实际练习,我们会学习它的各种各样的类型。“推荐引擎&推荐系统”这个短语已经被互换的使用了。不要混淆!

银行的推荐系统-举例

现在,每个企业都充分利用他们定制版本的推荐系统。我们以银行为例。


银行X想要利用交易信息来给现有的信用卡和借记卡用户提供定制的优惠。下面是这个问题的分析最终状态:


顾客Z走进一个披萨店。他通过银行X的卡付了食物的账单。通过过去的交易信息,银行X知道顾客Z在吃完披萨后喜欢吃一个冰淇淋。利用在披萨店的交易信息,银行已经定位了顾客的具体位置。接下来,它找到了5个离顾客足够近的冰淇淋店,其中3个和银行有联系。


这是很有趣的部分。现在,这里是和冰淇淋店的协议:

商店1:银行利润-$2,顾客花费-$10,顾客选择的可能性-20%

商店2:银行利润-$2,顾客花费-$10,顾客选择的可能性-20%

商店3:银行利润-$5,顾客花费-$12,顾客选择的可能性-20%

商店4:银行利润-$6,顾客花费-$12,顾客选择的可能性-20%

商店5:银行利润-$4,顾客花费-$11,顾客选择的可能性-20%


我们假设顾客买冰淇淋的需求和冰淇淋价格是均衡的,因此顾客纠结于是花额外的钱来满足他的需求还是买便宜点的冰淇淋。银行X想要顾客去商店3、4或者5(更高的利润)。如果给他一个合理的协议,它能提高顾客花费的数目。我们假设折扣总是整数。现在,期望值是


期望值=20%*[2+2+5+6+4]=$19/5=$3.8


我们能通过打折提高期望值么?商店(3,4,5)的花费变化:

商店3:花费增加了5%多$1的折扣,增加了7.5%多$2的折扣,增加了10%多$3的折扣

商店4:花费增加了25%多$1的折扣,增加了30%多$2的折扣,增加了35%多$3的折扣,增加了80%多$4的折扣

商店5:任何的折扣都没有改变


期望值=50%/4*(2+2+5+4)+50%*5=$13/8+$2.5=$1.6+$2.5=$4.1


思考:

还有更好的可行性建议能保证银行更高的利润么?我很想知道!


你看,做推荐,不是提取数据,编写代码并实现它。反而,它需要数学(很显然),逻辑思维和使用编程语言的天赋。相信我,第三个是这里面最简单的。感觉到自信了么?我们继续。

推荐引擎的工作具体是什么?

之前的例子会给你一个合理的想法。是时候把它弄清楚了。让我们解释这个例子(银行X)中一个推荐引擎能做的所有的事:


1.在顾客购买了某件东西之后,找到顾客可能会感兴趣的零售商/物品。


2.如果许多竞争性物品都被推荐给顾客,它可以估计利益和损失。现在依据顾客的利益,推荐一个以顾客为中心或以产品为中心的用品。对于高价值客户,其他银行也有兴趣获得钱包份额,你可能要给出你最好的报价。


3.通过提供报价来提升顾客互动,能够吸引客户。这样,他(她)不论以何种方式购买商品,但只要有额外优惠,银行就可能知道他/她这种属性的客户的兴趣。

搜索引擎的类别是什么?

大体上有两种类别的搜索引擎,根据我们的企业做选择。在之前的文章里我们已经解释了每一个算法,但是在这里我尝试给出一个实际的解释来帮助你们更好的理解。


我已经在它们应用的行业里面解释了这些算法还有什么使它们对这个行业是恰当的。

基于上下文的算法
1

正如其名称所示,这些算法强烈依赖于推动商品的环境。一旦你收集了这个商品的环境信息,你尝试去找相似的商品并且推荐它们。比如在Youtube上,你能够找到一个视频的类型,语言,主演。现在依据这些信息,我们能找到和这个视频类似的视频。一旦我们有了相似的,我们可以轻易地把它推荐给原来只看这个视频的顾客。这样的算法在视频在线频道,歌曲在线商店等是很普遍的。这是一个很有道理的,当这个产品/项目能够被低维所解释的话,这样的环境信息是很容易得到的。

协同过滤算法
2

这是最普遍使用的算法之一,因为它不依赖于附加信息。你所需要的所有的东西就是行业的交易水平信息。例如,像亚马逊这样的电子商业角色、美国运通这样的银行经常使用这些算法来推荐批发商/产品。更进一步,有几种类型的协同过滤算法。


① 用户-用户协同过滤算法:这里我们给每个顾客寻找面貌相似的顾客,并且提供第一个面貌相似顾客在过去购买过的东西。这个算法是有效的但它花费了大量的时间和资源,因为它需要计算每一个顾客的用户匹配信息。因此,对于大的基础平台,没有一个很强壮的平行系统,这个算法是很难实施的。


② 商品-商品协同过滤算法:它和之前的算法是很相似的,但不是寻找相似的顾客,我们转而寻找相似的商品。一旦我们找到了相似商品矩阵,那么可以很轻易推荐相似物品给那些已经从这个商店购买了哪些物品的顾客。这个算法比基于用户的协同过滤算法占更少的资源。因此对于一个新的顾客,这个算法比基于用户的协同过滤算法花费更少的时间,因为我们不需要比较顾客的所有相似点。利用固定数量的物品,商品-商品相似矩阵在一定时间就可以完成。


③ 其他更简单的算法:有其他的方法,例如购物篮分析,和上一个算法相比它通常不需要更高的预测能力。


我们如何决定搜索引擎的性能指标??

好问题!我们必须知道,性能指标在很大程度上受到业务目标驱动的。一般来说,您可能要优化三种可能的指标:


1.依据金钱价值:如果你全部的目标是使用推荐引擎增加利益/收益绩效,那么你的评估方法应该是每一个推荐等级的增长收益/利润/销量。每一个等级应该有一个完整的顺序,并且平均的收益/利润/销量应该在付出的花费和期望利益之上。


2.依据做出回馈的倾向:如果目的仅仅是使顾客活跃,或者是顾客探索新的商品/零售商,这个绩效可能会有用。在这里你需要追踪每一个等级顾客的回馈率。


3.依据交易数量:有的时候你对顾客的活跃度感兴趣。为了更高的活跃度,顾客需要实现更高数量的交易。所以我们追踪推荐等级的交易量。


4.其他度量:有一些其他的度量你可能会感兴趣,比如满意度或者是电话服务中心接受的电话数量。这些指标很少使用因为他们通常不会给你整个结果而是样本。

使用R构建一个商品-商品协同过滤算法

让我们动手建立一个搜索引擎。在这里我已经演示了构建一个商品-商品协同过滤算法的推荐引擎。数据仅仅包含两列,也就是单独-供货商和单独-顾客。这里的数据在这里下载(http://www.analyticsvidhya.com/wp-content/uploads/2016/03/data.csv)。


代码很容易理解。因此我没有很明确的解释。如果你发现任何部分的代码很难理解,可以在下方的评论区问我


#load libraries
> library(plyr)

> library("arules")
> library(readr)

#load data
#This file has two columns inidividual_merchant and inidividual_customer
> input <- read_csv("Transaction_file.csv")

#Get the list of merchants/items
> merchant <- unique(input$individual_merchant)
> merchant <- merchant[order(merchant)]
> target_merchants <- merchant
> sno <- 1:length(target_merchants)
> merchant_ident <- cbind(target_merchants,sno)

#Create a reference mapper for all merchant
> colnames(merchant_ident) <- c("individual_merchant","sno")

# Create a correlation matrix for these merchants

> correlation_mat = matrix(0,length(merchant),length(target_merchants))
> correlation_mat = as.data.frame(correlation_mat)
> trans = read.transactions("Transaction_file.csv", format = "single", sep = ",", cols =
c("inidividual_customer", "individual_merchant"))

> c <- crossTable(trans)
> rowitem <- rownames(c)
> columnitem <- colnames(c)
> correlation_mat <- c[order(as.numeric(rowitem)),order(as.numeric(columnitem))]
> for(i in 1:9822) {
        correlation_mat[i,] <- correlation_mat[i,]/correlation_mat[i,i]
   }
> colnames(correlation_mat) <- target_merchants
> rownames(correlation_mat) <- merchant

# Now let's start recommending for individual customer

> possible_slots <- 20
> avail <- 21
> merch_rec <- matrix(0, nrow = length(target_customers), ncol = avail)
> merch_rec[,1] <- unique(input3$Cust_map)
> correlation_mat <- as.matrix(correlation_mat)
> position <- 1
> for (i in 1:length(target_customers)) {
   been_thr <- input[position : (position + customer_merch_ct[i] - 1),'individual_merchant']
   merging <- as.data.frame(merchant_ident[merchant_ident[,'individual_merchant'] %in%          been_thr,])
   corel_subset <- correlation_mat[merging$sno,] 
   will_go <- colSums(corel_subset) 
   will_go_merch <- target_merchants[order(-will_go)]
   not_been_there <- will_go_merch[!will_go_merch %in% been_thr]
   will_go_propensity <- will_go[order(-will_go)][!will_go_merch %in% been_thr]
   merch_rec[i,2:avail] <- not_been_there[1:possible_slots] 
   position <- position + customer_merch_ct[i] 
 }


尾注

推荐引擎已经变得极其普遍,因为它们是解决所有行业常见的商业案例之一。替代这样的搜索引擎是非常困难的,它们同时预测多种商品/供应商。分类算法很难吸收这个多输出变量。


在本文中,我们学习了银行推荐系统的用法。也看了实施R推荐引擎的案例,他们正在整个行业的所有部门使用,而共同目标,就是提升客户体验。


数据分析网原创编译,翻译小组成员—于海燕,一名数学系研究生,正在学习SPSS、R语言等。


你喜欢阅读这篇文章么?

你过去构建过推荐系统么?

在下方的评论区分享你的经验/建议吧?



点击文字查看精选热文


| |

| |

| |

| |

| |

| |

| |



点击→

点击→