探索推薦系統(附R語言實戰案例)

探索推薦系統(附R語言實戰案例)

引言

在生活中我們怎樣給別人推薦呢?是根據我們過去的經驗。


現在想像一下,如果現在在現實生活中我們依據數據做我們及時的推薦會怎麼樣?首先,我們會感覺像一個明智的建議者。其次,我們不再是人類。因此,我們的目的是構建聰明的軟體,這個軟體要能給我們提供一些令人信服的推薦。
當我們訪問像亞馬遜、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語言等。



你喜歡閱讀這篇文章麼?
你過去構建過推薦系統麼?
在下方的評論區分享你的經驗/建議吧?

探索推薦系統(附R語言實戰案例)


點擊文字查看精選熱文
大數據 | 大數據分析 | 大數據技術

數據分析 | 阿里巴巴 | 數據分析師

數據分析能力 | 產品經理 | CEO

數據挖掘 | 商業智能 | 數據可視化

數據狗 | 數據科學家 | 必備工具

EXCEL | R語言 | Python

數據產品 | 機器學習 | 深度學習


點擊→加入大數據交流QQ群
點擊→了解如何入駐專欄

探索推薦系統(附R語言實戰案例)

閱讀原文


關於作者:
數據分析精選【人稱「數據哥」】:分享大數據挖掘與數據分析、電子商務、互聯網、移動互聯網行業的新聞、觀點、八卦、文章和乾貨。商務合作QQ:1339638765

微信號:sjfxjx