天天看點

手把手教你用Python實作智能推薦算法

“ 

推薦系統将成為未來十年裡最重要的變革

社會化網站将由推薦系統所驅動

--- John Riedl明尼蘇達大學教授

01

前言

智能推薦和泛的營銷完全不同,後者是将産品賣給客戶作為最終目标;而智能推薦是以“客戶需求”為導向的,是給客戶帶來價值的。常見的如淘寶的 “你可能還喜歡”,亞馬遜的 “購買此商品的使用者也購買了” 便是執行個體。本文就将詳細介紹如何用Python實作智能推薦算法,主要将分為兩個部分:

詳細原理介紹

Python代碼實戰

02

常見的推薦系統與算法

常見的推薦系統分類有:

基于應用領域: 電子商務/社交好友推薦等

基于設計思想: 基于協同過濾的推薦等

基于使用資料: 基于使用者标簽的推薦等

手把手教你用Python實作智能推薦算法

“ 京騰 ” 合作建構使用者畫像标簽圖

常見的推薦算法有:

手把手教你用Python實作智能推薦算法

本文将專注于了解起來最容易且又十分經典常用的基于關聯規則的購物籃推薦。商品的關聯度分析對于提高商品的活力、挖掘消費者的購買力、促進最大化銷售有很大幫助。其模組化理念為:物品被同時購買的模式反映了客戶的需求模式,适用場景:無需個性化定制的場景;有銷售記錄的産品,向老客戶推薦;套餐設計與産品擺放。

03

購物籃簡介

問:什麼是購物籃?主要運用在什麼場景?

答:單個客戶一次購買商品的綜合稱為一個購物籃,即某個客戶本次的消費發票。常用場景:超市貨架布局:互補品與互斥品;套餐設計。

手把手教你用Python實作智能推薦算法

問:購物籃的常用算法?

答:常用算法有

不考慮購物順序:關聯規則。購物籃分析其實就是一個因果分析。關聯規則其實是一個很友善的發現兩樣商品關系的算法。共同提升的關系表示兩者是正相關,可以作為互補品,如豆瓣醬和蔥一起賣也才是最棒的。替代品的概念便是我買了這個就不用買另外一個。

考慮購物順序:序貫模型。多在電商中使用,比如今天你将這個商品加入了購物車,過幾天又将另一個商品加入了購物車,這就有了一個前後順序。但許多實體商店因為沒有實名認證,是以無法記錄使用者的消費順序。

手把手教你用Python實作智能推薦算法

問:求出互補品與互斥品後對布局有什麼用?

答:根據關聯規則求出的商品間的關聯關系後,可能會發現商品間存在強關聯,弱關聯與排斥三種關系。每種清醒有各自對應的布局方式。

強關聯:關聯度的值需要視實際情況而定,在不同的行業不同的也業态是不同的。強關聯的商品彼此陳列在一起會提高雙方的銷售量。雙向關聯的商品如果陳列位置允許的話應該相關聯陳列,即A産品旁邊有B,B産品邊上也一定會有A,比如常見的剃須膏與刮胡刀,男士發油與定型梳;而對于那些單向關聯的商品,隻需要被關聯的商品陳列在關聯商品旁邊就行,如大瓶可樂旁邊擺紙杯,而紙杯旁邊則不擺大瓶可樂,畢竟買大可樂的消費者大機率需要紙杯,而購買紙杯的顧客再購買大可樂的機率不大。

弱關聯:關聯度不高的商品,可以嘗試擺在一起,然後再分析關聯度是否有變化,如果關聯度大幅提高,則說明原來的弱關聯有可能是陳列的原因造成的。

排斥關系:指兩個産品基本上不會出現在同一張購物發票中,這種商品盡量不要陳列在一起。

根據購物籃的資訊來進行商品關聯度的分析不僅僅隻有如上三種關系,它們僅代表商品關聯度分析的一個方面(可信度)。全面系統的商品關聯分析必須有三度的概念,三度包括支援度,可信度和提升度。

04

關聯規則 

直接根據關聯三度所定義的概念去了解會有不少難度,尤其是可信度喝提升度中的“ 誰對誰 ”的問題。其實可以換一種方式來看:

規則 X 的支援度 = 規則 X 的交易次數 / 交易的總數。了解:支援度表示規則 X 是否普遍。

規則 X(A→B) 的置信度 = 規則 X 的交易次數/規則X中商品B 的交易次數。了解:置信度是一種條件機率,表示購買了A産品的客戶再購買B産品的機率。

手把手教你用Python實作智能推薦算法

為友善了解這些規則,我們通過下面五個購物籃的例子來練習一下

手把手教你用Python實作智能推薦算法

不難發現,支援度的分母都是5,也就是購物籃的數量,分子則是選取這個規則中的所有商品同時出現在一個籃子的次數。以A->D為例,同時包含A和D的籃子有2個,總的交易數量(籃子總數)有5個,是以規則A->D的支援度為2/5;有商品 A 的籃子個數為3,在這三個籃子中,其中2個籃子又包含商品D,是以該規則的置信度(可信度)為2/3。有關關聯規則,還有以下兩個問題想補充:

問:僅看支援度和置信度是否靠譜?

答:看一個案例:食堂賣飯,1000份打飯記錄中,買米飯的有800人次,買牛肉的有600人次,兩個共同買的有400人次,那麼可以得出對于規則(牛肉 - > 米飯)Support=P(牛肉&米飯)= 400/1000=0.40;Confidence=P(米飯|牛肉)=400/600=0.67置信度和支援度都很高,但是給買牛肉的人推薦米飯有意義嗎?顯然是沒有任何意義的。因為無任何條件下使用者購買米飯的機率:P(米飯)=800/1000=0.8,都已經大過買了牛肉的前提下再買米飯的機率 0.67,畢竟米飯本來就比牛肉要暢銷啊。

這個案例便引出了提升度的概念:提升度 = 置信度/無條件機率=0.67/0.8。規則 X(A→B) 的提升度為 n 時:向購買了 A 的客戶推薦 B 的話,這個客戶購買 B 的機率是 TA 自然而然購買 B 的 n × 100% 左右。生活了解:消費者平時較少單獨購買桌角防撞海綿,可能偶爾想到或自己小孩碰到的時候才會想起購買,如果我們在桌子(書桌飯桌)的成功下單頁面添加桌角防撞海綿的推薦,則很大程度上可以提高防撞海綿的銷量。這也符合我們希望通過暢銷商品帶動相對非暢銷商品的宗旨。

手把手教你用Python實作智能推薦算法

問:除了公式的含義,關聯三度(支援度,置信度,提升度)還有什麼關聯嗎?

答:可以這樣了解:

支援度代表這組關聯商品的份額是否夠大

置信度(可信度)代表關聯度的強弱

而提升度則是看該關聯規則是否有利用價值和值得推廣,用了(客戶購買後推薦)比沒用(客戶自然而然的購買)要提高多少。

是以 1.0 是提升度的一個分界值,剛才的買飯案例中給買了牛肉的使用者推薦米飯的這種騷操作的提升度小于 1 也就不難了解了。另外,高置信度的兩個商品(假設達到了 100%,意味着它們總是成雙成對的出現),但如果支援度很低(意味着份額低),那它對整體銷售提升的幫助也不會大。

05

基于Apriori 算法的Python實戰

由于有關Apriori等算法的研究已經很成熟,我們在用Python實戰時無需一步一步計算,直接調用現有函數即可,主要是要明白背後的原理與不同算法的使用場景與優劣比較。

首先導入相關庫并進行資料探索性分析

手把手教你用Python實作智能推薦算法

資料參數解釋

OrderNumber:客戶昵稱

LineNumber:購買順序,如前三行分别表示同一個客戶購買的三樣商品的順序

Model:商品名

接着來看看商品的種類

手把手教你用Python實作智能推薦算法

再來看看最暢銷的 15 種商品

手把手教你用Python實作智能推薦算法

再進行一些簡單的可視化

手把手教你用Python實作智能推薦算法

首先生成購物籃,并将同一個客戶購買的所有商品放入同一個購物籃,需要提前使用pip install Apriori安裝,之後我們使用 Apriori 包中的 dataconvert 函數,下面是需要傳入的參數解釋

arulesdata:資料集 -- DataFrame

tidvar: “分類的索引”,即劃分購物籃的标準,本案例是根據客戶 OrderNumber -- object類型

itemvar:将什麼東西放進籃子裡,本案例是将資料集中的商品,就是 Model 列放入籃子 -- object類型

data_type: 預設選擇 'inverted',庫中提供的不變

注意:需要注意傳入的參數類型,隻要對了,直接套用就不是什麼難事

現在檢視前五個購物籃中的物品

手把手教你用Python實作智能推薦算法
手把手教你用Python實作智能推薦算法

現在生成關聯規則,根據排列組合,可知這些交易将會産生 21255×21254÷2 這麼多個關聯規則。首先就要滿足支援度的要求,太小則直接被删去,支援度的大小可根據關聯規則的多少調整 如果關聯規則很少,可根據實際情況放寬支援度的要求。相關參數說明:

+ minSupport:最小支援度門檻值

+ minConf:最小置信度門檻值

+ minlen:規則最小長度

+ maxlen:規則最大長度,一般2就夠了

這裡,minSupport 或 minConf 設定越低,産生的規則越多,計算量也就越大

手把手教你用Python實作智能推薦算法

結果說明: 以 result 第一行為例

+ lhs: 被稱為左手規則,通俗了解即使用者購買的商品 - 山地車内胎

+ rhs: 被稱為右手規則,通俗了解即根據使用者購買某商品來推薦的另一件商品 - ll山地胎

+ support: 支援度,山地車内胎 和 ll山地胎 同時出現在一張購物發票中的機率

+ confidence: 置信度,購買了 山地車内胎 的前提下,同時購買 ll山地胎 的機率

+ lift:向購買了 山地車内胎 的客戶推薦 ll山地胎 的話,這個客戶購買 ll山地胎 的機率是這個客戶自然而然購買 ll山地胎 的 400% 左右,即高了300% 多!

手把手教你用Python實作智能推薦算法

現在我們篩選互補品和互斥品,代碼如下

手把手教你用Python實作智能推薦算法

對結果簡單分析一些,不要期望每個規則都有意義,要結合業務思考,比如競速型賽道自行車與運動水壺互斥實屬正常,競速講究輕量化,還配個水壺幹什麼... 比如山地車配一個競速公路車用的運動型頭盔...互斥産品則是成對出現的!

需要結合業務需求

獲得最大營銷響應度?-- 看置信度,越高越好

銷售最大化?-- 看提升度,越高越好

使用者未産生消費,我們向其推薦商品?

以獲得最高的營銷相應率為目标

如果一個新客戶剛剛下單了山地車英騎這個産品,如果希望獲得最高的營銷響應率,那在他付費成功頁面上最應該推薦什麼産品?

目标:獲得最高的營銷響應率

手把手教你用Python實作智能推薦算法

以最大化總體銷售額為目标

如果一個新客戶剛下單了山地英騎這個産品,如果希望最大化提升總體的銷售額,那麼在他付費成功的頁面上應該推薦什麼産品?

目标:最大化銷售額

手把手教你用Python實作智能推薦算法

再次重申提升度通俗含義:提升度是相對于自然而然購買而言,A對B的提升度為4.0的了解如下:向購買了A的使用者推薦B,則該使用者購買B的機率是該使用者單獨(即自然而然的購買)購買B的機率的 400% 向購買了A的使用者推薦B,則該使用者購買B的機率比該使用者單獨(即自然而然的購買)購買B的機率高300%!

使用者并未産生消費,為其推薦某樣商品

手把手教你用Python實作智能推薦算法

最後總結一下,基于關聯規則的 Apriori 算法是智能推薦領域十分經典的應用之一,簡單易上手。其實推薦領域的難點不一定在于算法,而在于過大的客戶量與其産生的資料,是以一般到了最後用的都是混合推薦。