<kbd id="afajh"><form id="afajh"></form></kbd>
<strong id="afajh"><dl id="afajh"></dl></strong>
    <del id="afajh"><form id="afajh"></form></del>
        1. <th id="afajh"><progress id="afajh"></progress></th>
          <b id="afajh"><abbr id="afajh"></abbr></b>
          <th id="afajh"><progress id="afajh"></progress></th>

          原理 + 代碼|手把手教你用Python實(shí)現(xiàn)智能推薦算法

          共 4663字,需瀏覽 10分鐘

           ·

          2020-08-11 00:15

          點(diǎn)擊上方“Python爬蟲(chóng)與數(shù)據(jù)挖掘”,進(jìn)行關(guān)注

          回復(fù)“書(shū)籍”即可獲贈(zèng)Python從入門(mén)到進(jìn)階共10本電子書(shū)

          離離原上草,一歲一枯榮。
          ?


          推薦系統(tǒng)將成為未來(lái)十年里最重要的變革

          社會(huì)化網(wǎng)站將由推薦系統(tǒng)所驅(qū)動(dòng)

          --- John Riedl明尼蘇達(dá)大學(xué)教授





          01


          前言


          智能推薦和泛的營(yíng)銷(xiāo)完全不同,后者是將產(chǎn)品賣(mài)給客戶(hù)作為最終目標(biāo);而智能推薦是以“客戶(hù)需求”為導(dǎo)向的,是給客戶(hù)帶來(lái)價(jià)值的。常見(jiàn)的如淘寶的 “你可能還喜歡”,亞馬遜的 “購(gòu)買(mǎi)此商品的用戶(hù)也購(gòu)買(mǎi)了” 便是實(shí)例。本文就將詳細(xì)介紹如何用Python實(shí)現(xiàn)智能推薦算法,主要將分為兩個(gè)部分:
          • 詳細(xì)原理介紹
          • Python代碼實(shí)戰(zhàn)



          02


          常見(jiàn)的推薦系統(tǒng)與算法


          常見(jiàn)的推薦系統(tǒng)分類(lèi)有:

          • 基于應(yīng)用領(lǐng)域:?電子商務(wù)/社交好友推薦等

          • 基于設(shè)計(jì)思想:?基于協(xié)同過(guò)濾的推薦等

          • 基于使用數(shù)據(jù):?基于用戶(hù)標(biāo)簽的推薦等

          “ 京騰 ” 合作構(gòu)建用戶(hù)畫(huà)像標(biāo)簽圖

          常見(jiàn)的推薦算法有:

          本文將專(zhuān)注于理解起來(lái)最容易且又十分經(jīng)典常用的基于關(guān)聯(lián)規(guī)則的購(gòu)物籃推薦。商品的關(guān)聯(lián)度分析對(duì)于提高商品的活力、挖掘消費(fèi)者的購(gòu)買(mǎi)力、促進(jìn)最大化銷(xiāo)售有很大幫助。其建模理念為:物品被同時(shí)購(gòu)買(mǎi)的模式反映了客戶(hù)的需求模式,適用場(chǎng)景:無(wú)需個(gè)性化定制的場(chǎng)景;有銷(xiāo)售記錄的產(chǎn)品,向老客戶(hù)推薦;套餐設(shè)計(jì)與產(chǎn)品擺放。


          03


          購(gòu)物籃簡(jiǎn)介


          問(wèn)什么是購(gòu)物籃?主要運(yùn)用在什么場(chǎng)景?

          :?jiǎn)蝹€(gè)客戶(hù)一次購(gòu)買(mǎi)商品的綜合稱(chēng)為一個(gè)購(gòu)物籃,即某個(gè)客戶(hù)本次的消費(fèi)小票。常用場(chǎng)景:超市貨架布局:互補(bǔ)品與互斥品;套餐設(shè)計(jì)。

          問(wèn)購(gòu)物籃的常用算法?

          :常用算法有

          • 不考慮購(gòu)物順序關(guān)聯(lián)規(guī)則。購(gòu)物籃分析其實(shí)就是一個(gè)因果分析。關(guān)聯(lián)規(guī)則其實(shí)是一個(gè)很方便的發(fā)現(xiàn)兩樣商品關(guān)系的算法。共同提升的關(guān)系表示兩者是正相關(guān),可以作為互補(bǔ)品,如豆瓣醬和蔥一起賣(mài)也才是最棒的。替代品的概念便是我買(mǎi)了這個(gè)就不用買(mǎi)另外一個(gè)。

          • 考慮購(gòu)物順序序貫?zāi)P?/span>。多在電商中使用,比如今天你將這個(gè)商品加入了購(gòu)物車(chē),過(guò)幾天又將另一個(gè)商品加入了購(gòu)物車(chē),這就有了一個(gè)前后順序。但許多實(shí)體商店因?yàn)闆](méi)有實(shí)名認(rèn)證,所以無(wú)法記錄用戶(hù)的消費(fèi)順序。

          問(wèn)求出互補(bǔ)品與互斥品后對(duì)布局有什么用?

          根據(jù)關(guān)聯(lián)規(guī)則求出的商品間的關(guān)聯(lián)關(guān)系后,可能會(huì)發(fā)現(xiàn)商品間存在強(qiáng)關(guān)聯(lián),弱關(guān)聯(lián)與排斥三種關(guān)系。每種清醒有各自對(duì)應(yīng)的布局方式。

          • 強(qiáng)關(guān)聯(lián):關(guān)聯(lián)度的值需要視實(shí)際情況而定,在不同的行業(yè)不同的也業(yè)態(tài)是不同的。強(qiáng)關(guān)聯(lián)的商品彼此陳列在一起會(huì)提高雙方的銷(xiāo)售量。雙向關(guān)聯(lián)的商品如果陳列位置允許的話應(yīng)該相關(guān)聯(lián)陳列,即A產(chǎn)品旁邊有B,B產(chǎn)品邊上也一定會(huì)有A,比如常見(jiàn)的剃須膏與剃須刀,男士發(fā)油與定型梳;而對(duì)于那些單向關(guān)聯(lián)的商品,只需要被關(guān)聯(lián)的商品陳列在關(guān)聯(lián)商品旁邊就行,如大瓶可樂(lè)旁邊擺紙杯,而紙杯旁邊則不擺大瓶可樂(lè),畢竟買(mǎi)大可樂(lè)的消費(fèi)者大概率需要紙杯,而購(gòu)買(mǎi)紙杯的顧客再購(gòu)買(mǎi)大可樂(lè)的概率不大。

          • 弱關(guān)聯(lián):關(guān)聯(lián)度不高的商品,可以嘗試擺在一起,然后再分析關(guān)聯(lián)度是否有變化,如果關(guān)聯(lián)度大幅提高,則說(shuō)明原來(lái)的弱關(guān)聯(lián)有可能是陳列的原因造成的。

          • 排斥關(guān)系:指兩個(gè)產(chǎn)品基本上不會(huì)出現(xiàn)在同一張購(gòu)物小票中,這種商品盡量不要陳列在一起。

          根據(jù)購(gòu)物籃的信息來(lái)進(jìn)行商品關(guān)聯(lián)度的分析不僅僅只有如上三種關(guān)系,它們僅代表商品關(guān)聯(lián)度分析的一個(gè)方面(可信度)。全面系統(tǒng)的商品關(guān)聯(lián)分析必須有三度的概念,三度包括支持度可信度提升度


          04


          關(guān)聯(lián)規(guī)則?


          直接根據(jù)關(guān)聯(lián)三度所定義的概念去理解會(huì)有不少難度,尤其是可信度喝提升度中的“ 誰(shuí)對(duì)誰(shuí) ”的問(wèn)題。其實(shí)可以換一種方式來(lái)看:

          • 規(guī)則 X 的支持度?= 規(guī)則 X 的交易次數(shù) / 交易的總數(shù)。理解:支持度表示規(guī)則 X 是否普遍

          • 規(guī)則 X(A→B) 的置信度?= 規(guī)則 X 的交易次數(shù)/規(guī)則X中商品B 的交易次數(shù)。理解:置信度是一種條件概率,表示購(gòu)買(mǎi)了A產(chǎn)品的客戶(hù)再購(gòu)買(mǎi)B產(chǎn)品的概率。

          為方便理解這些規(guī)則,我們通過(guò)下面五個(gè)購(gòu)物籃的例子來(lái)練習(xí)一下

          不難發(fā)現(xiàn),支持度的分母都是5,也就是購(gòu)物籃的數(shù)量,分子則是選取這個(gè)規(guī)則中的所有商品同時(shí)出現(xiàn)在一個(gè)籃子的次數(shù)。以A->D為例,同時(shí)包含A和D的籃子有2個(gè),總的交易數(shù)量(籃子總數(shù))有5個(gè),所以規(guī)則A->D的支持度為2/5;有商品 A 的籃子個(gè)數(shù)為3,在這三個(gè)籃子中,其中2個(gè)籃子又包含商品D,所以該規(guī)則的置信度(可信度)為2/3。有關(guān)關(guān)聯(lián)規(guī)則,還有以下兩個(gè)問(wèn)題想補(bǔ)充

          問(wèn):僅看支持度和置信度是否靠譜?

          答:看一個(gè)案例:食堂賣(mài)飯,1000份打飯記錄中,買(mǎi)米飯的有800人次,買(mǎi)牛肉的有600人次,兩個(gè)共同買(mǎi)的有400人次,那么可以得出對(duì)于規(guī)則(牛肉 - > 米飯)Support=P(牛肉&米飯)= 400/1000=0.40;Confidence=P(米飯|牛肉)=400/600=0.67置信度支持度都很高,但是給買(mǎi)牛肉的人推薦米飯有意義嗎?然是沒(méi)有任何意義的。因?yàn)闊o(wú)任何條件下用戶(hù)購(gòu)買(mǎi)米飯的概率:P(米飯)=800/1000=0.8,都已經(jīng)大過(guò)買(mǎi)了牛肉的前提下再買(mǎi)米飯的概率 0.67,畢竟米飯本來(lái)就比牛肉要暢銷(xiāo)啊。

          這個(gè)案例便引出了提升度的概念:提升度 = 置信度/無(wú)條件概率=0.67/0.8。規(guī)則 X(A→B) 的提升度為 n 時(shí):向購(gòu)買(mǎi)了 A 的客戶(hù)推薦 B 的話,這個(gè)客戶(hù)購(gòu)買(mǎi) B 的概率是 TA 自然而然購(gòu)買(mǎi) B 的 n × 100% 左右。生活理解:消費(fèi)者平時(shí)較少單獨(dú)購(gòu)買(mǎi)桌角防撞海綿,可能偶爾想到或自己小孩碰到的時(shí)候才會(huì)想起購(gòu)買(mǎi),如果我們?cè)谧雷?書(shū)桌飯桌)的成功下單頁(yè)面添加桌角防撞海綿的推薦,則很大程度上可以提高防撞海綿的銷(xiāo)量。這也符合我們希望通過(guò)暢銷(xiāo)商品帶動(dòng)相對(duì)非暢銷(xiāo)商品的宗旨。

          問(wèn):除了公式的含義,關(guān)聯(lián)三度(支持度,置信度,提升度)還有什么關(guān)聯(lián)嗎?

          答:可以這樣理解:

          • 支持度代表這組關(guān)聯(lián)商品的份額是否夠大

          • 置信度(可信度)代表關(guān)聯(lián)度的強(qiáng)弱

          • 而提升度則是看該關(guān)聯(lián)規(guī)則是否有利用價(jià)值和值得推廣,用了(客戶(hù)購(gòu)買(mǎi)后推薦)比沒(méi)用(客戶(hù)自然而然的購(gòu)買(mǎi))要提高多少。

          所以 1.0 是提升度的一個(gè)分界值,剛才的買(mǎi)飯案例中給買(mǎi)了牛肉的用戶(hù)推薦米飯的這種騷操作的提升度小于 1 也就不難理解了。另外,高置信度的兩個(gè)商品(假設(shè)達(dá)到了 100%,意味著它們總是成雙成對(duì)的出現(xiàn)),但如果支持度很低(意味著份額低),那它對(duì)整體銷(xiāo)售提升的幫助也不會(huì)大。


          05


          基于Apriori 算法的Python實(shí)戰(zhàn)


          由于有關(guān)Apriori等算法的研究已經(jīng)很成熟,我們?cè)谟肞ython實(shí)戰(zhàn)時(shí)無(wú)需一步一步計(jì)算,直接調(diào)用現(xiàn)有函數(shù)即可,主要是要明白背后的原理與不同算法的使用場(chǎng)景與優(yōu)劣比較

          探索性分析


          首先導(dǎo)入相關(guān)庫(kù)并進(jìn)行數(shù)據(jù)探索性分析

          import?pandas?as?pd
          import?numpy?as?np

          df?=?pd.read_csv('bike_data.csv',?encoding='gbk')
          df.info();?df.head()

          數(shù)據(jù)參數(shù)解釋

          • OrderNumber:客戶(hù)昵稱(chēng)

          • LineNumber:購(gòu)買(mǎi)順序,如前三行分別表示同一個(gè)客戶(hù)購(gòu)買(mǎi)的三樣商品的順序

          • Model:商品名

          接著來(lái)看看商品的種類(lèi)

          print(f"數(shù)據(jù)集中共有{df['Model'].nunique()}種商品")

          model_names?=?df['Model'].unique()
          print("商品名分別為:")
          #?5?個(gè)為一行顯示
          for?i?in?range(0,?len(model_names),?5):
          ??????print(model_names[i:i+5])

          再來(lái)看看最暢銷(xiāo)的 15 種商品

          再進(jìn)行一些簡(jiǎn)單的可視化

          top_15?=?grouped.sort_values(by='count',?ascending=False).head(15)

          plt.figure(figsize=(8,?6))
          sns.barplot(data=top_15,?x='count',?y='Model')
          plt.grid(True)

          使用 Apriori 算法求解關(guān)聯(lián)規(guī)則


          首先生成購(gòu)物籃,并將同一個(gè)客戶(hù)購(gòu)買(mǎi)的所有商品放入同一個(gè)購(gòu)物籃,需要提前使用pip install Apriori安裝,之后我們使用 Apriori 包中的 dataconvert 函數(shù),下面要傳入的參數(shù)解釋

          • arulesdata:數(shù)據(jù)集 -- DataFrame

          • tidvar: “分類(lèi)的索引”,即劃分購(gòu)物籃的標(biāo)準(zhǔn),本案例是根據(jù)客戶(hù) OrderNumber -- object類(lèi)型

          • itemvar將什么東西放進(jìn)籃子里,本案例是將數(shù)據(jù)集中的商品,就是 Model 列放入籃子 -- object類(lèi)型

          • data_type: 默認(rèn)選擇 'inverted',庫(kù)中提供的不變

          注意:需要注意傳入的參數(shù)類(lèi)型,只要對(duì)了,直接套用就不是什么難事

          import?Apriori?as?apri
          #?需要稍微等待一下
          baskets?=?apri.dataconvert(arulesdata=df,?tidvar='OrderNumber',?
          ???????????????????????????itemvar='Model',?data_type='inverted')
          #?返回的購(gòu)物籃是一個(gè)大列表,大列表中的每一個(gè)小列表表示一個(gè)籃子
          #?購(gòu)物籃個(gè)數(shù)剛好等于數(shù)據(jù)集中的客戶(hù)數(shù)量
          type(baskets),?len(baskets)?==?df['OrderNumber'].nunique()
          #?(list,?True)

          現(xiàn)在查看前五個(gè)購(gòu)物籃中的物品

          現(xiàn)在生成關(guān)聯(lián)規(guī)則,根據(jù)排列組合,可知這些交易將會(huì)產(chǎn)生 21255×21254÷2 這么多個(gè)關(guān)聯(lián)規(guī)則。首先就要滿(mǎn)足支持度的要求,太小則直接被刪去,支持度的大小可根據(jù)關(guān)聯(lián)規(guī)則的多少調(diào)整 如果關(guān)聯(lián)規(guī)則很少,可根據(jù)實(shí)際情況放寬支持度的要求。相關(guān)參數(shù)說(shuō)明:

          • + minSupport:最小支持度閾值

          • + minConf:最小置信度閾值

          • + minlen:規(guī)則最小長(zhǎng)度

          • + maxlen:規(guī)則最大長(zhǎng)度,一般2就夠了

          這里,minSupport 或 minConf 設(shè)定越低,產(chǎn)生的規(guī)則越多,計(jì)算量也就越大

          結(jié)果說(shuō)明: 以 result 第一行為例

          • + lhs: 被稱(chēng)為左手規(guī)則,通俗理解即用戶(hù)購(gòu)買(mǎi)的商品 - 山地車(chē)內(nèi)胎

          • + rhs: 被稱(chēng)為右手規(guī)則,通俗理解即根據(jù)用戶(hù)購(gòu)買(mǎi)某商品來(lái)推薦的另一件商品 - ll山地胎

          • + support: 支持度,山地車(chē)內(nèi)胎 和 ll山地胎 同時(shí)出現(xiàn)在一張購(gòu)物小票中的概率

          • + confidence: 置信度,購(gòu)買(mǎi)了 山地車(chē)內(nèi)胎 的前提下,同時(shí)購(gòu)買(mǎi) ll山地胎 的概率

          • + lift:向購(gòu)買(mǎi)了 山地車(chē)內(nèi)胎 的客戶(hù)推薦 ll山地胎 的話,這個(gè)客戶(hù)購(gòu)買(mǎi) ll山地胎 的概率是這個(gè)客戶(hù)自然而然購(gòu)買(mǎi) ll山地胎 的 400% 左右,即高了300% 多!

          現(xiàn)在我們篩選互補(bǔ)品和互斥品,代碼如下

          #?互補(bǔ)品
          #?lift?提升度首先要大于1,然后再排序選擇自己希望深究的前?n?個(gè)
          hubu?=?result[result['lift']?>?1].sort_values(by='lift',?
          ????????????????????ascending=False).head(20)

          #?互斥品
          huchi?=?result[result['lift']?1].sort_values(by='lift',?
          ????????????????????ascending=True).head(20)
          hubu.head(5)?#?結(jié)果也合情合理

          對(duì)結(jié)果簡(jiǎn)單分析一些,不要期望每個(gè)規(guī)則都有意義,要結(jié)合業(yè)務(wù)思考,比如競(jìng)速型賽道自行車(chē)與運(yùn)動(dòng)水壺互斥實(shí)屬正常,競(jìng)速講究輕量化,還配個(gè)水壺干什么... 比如山地車(chē)配一個(gè)競(jìng)速公路車(chē)用的運(yùn)動(dòng)型頭盔...互斥產(chǎn)品則是成對(duì)出現(xiàn)的!

          根據(jù)關(guān)聯(lián)規(guī)則結(jié)果推薦產(chǎn)品


          需要結(jié)合業(yè)務(wù)需求

          • 獲得最大營(yíng)銷(xiāo)響應(yīng)度?-- 看置信度,越高越好

          • 銷(xiāo)售最大化?-- 看提升度,越高越好

          • 用戶(hù)未產(chǎn)生消費(fèi),我們向其推薦商品?

          #?注意數(shù)據(jù)類(lèi)型,frozenset,需要拆一下
          result['lhs'][1],?type(result['lhs'][1])

          #?(frozenset({'山地車(chē)內(nèi)胎'}),?frozenset)

          以獲得最高的營(yíng)銷(xiāo)相應(yīng)率為目標(biāo)

          如果一個(gè)新客戶(hù)剛剛下單了山地車(chē)英騎這個(gè)產(chǎn)品,如果希望獲得最高的營(yíng)銷(xiāo)響應(yīng)率,那在他付費(fèi)成功頁(yè)面上最應(yīng)該推薦什么產(chǎn)品?

          目標(biāo):獲得最高的營(yíng)銷(xiāo)響應(yīng)率

          以最大化總體銷(xiāo)售額為目標(biāo)

          如果一個(gè)新客戶(hù)剛下單了山地英騎這個(gè)產(chǎn)品,如果希望最大化提升總體的銷(xiāo)售額,那么在他付費(fèi)成功的頁(yè)面上應(yīng)該推薦什么產(chǎn)品?

          目標(biāo):最大化銷(xiāo)售額

          再次重申提升度通俗含義:提升度是相對(duì)于自然而然購(gòu)買(mǎi)而言,A對(duì)B的提升度為4.0的理解如下:向購(gòu)買(mǎi)了A的用戶(hù)推薦B,則該用戶(hù)購(gòu)買(mǎi)B的概率是該用戶(hù)單獨(dú)(即自然而然的購(gòu)買(mǎi))購(gòu)買(mǎi)B的概率的 400% 向購(gòu)買(mǎi)了A的用戶(hù)推薦B,則該用戶(hù)購(gòu)買(mǎi)B的概率比該用戶(hù)單獨(dú)(即自然而然的購(gòu)買(mǎi))購(gòu)買(mǎi)B的概率高300%

          用戶(hù)并未產(chǎn)生消費(fèi),為其推薦某樣商品

          最后總結(jié)一下,基于關(guān)聯(lián)規(guī)則的 Apriori 算法是智能推薦領(lǐng)域十分經(jīng)典的應(yīng)用之一,簡(jiǎn)單易上手。其實(shí)推薦領(lǐng)域的難點(diǎn)不一定在于算法,而在于過(guò)大的客戶(hù)量與其產(chǎn)生的數(shù)據(jù),所以一般到了最后用的都是混合推薦。至于更深層次的序貫?zāi)P团c協(xié)同過(guò)濾,幾乎沒(méi)有人使用 Python 或 R 來(lái)實(shí)現(xiàn),大部分都是使用分布式框架如 Spark,后續(xù)也會(huì)推出相關(guān)文章。


          -------------------?End?-------------------

          往期精彩文章推薦:

          歡迎大家點(diǎn)贊,留言,轉(zhuǎn)發(fā),轉(zhuǎn)載,感謝大家的相伴與支持

          想加入Python學(xué)習(xí)群請(qǐng)?jiān)诤笈_(tái)回復(fù)【入群

          萬(wàn)水千山總是情,點(diǎn)個(gè)【在看】行不行

          /今日留言主題/

          隨便說(shuō)一兩句吧~~

          瀏覽 61
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          評(píng)論
          圖片
          表情
          推薦
          點(diǎn)贊
          評(píng)論
          收藏
          分享

          手機(jī)掃一掃分享

          分享
          舉報(bào)
          <kbd id="afajh"><form id="afajh"></form></kbd>
          <strong id="afajh"><dl id="afajh"></dl></strong>
            <del id="afajh"><form id="afajh"></form></del>
                1. <th id="afajh"><progress id="afajh"></progress></th>
                  <b id="afajh"><abbr id="afajh"></abbr></b>
                  <th id="afajh"><progress id="afajh"></progress></th>
                  亚洲性无码视频 | 999精品在线视频 | 国产99欧洲在线 | 中文在线最新版天堂8 | 不卡的av天天在线影院 |