
來源: 早起Python
作者: 蘿卜
推薦系統(tǒng)將成為未來十年里最重要的變革
社會化網(wǎng)站將由推薦系統(tǒng)所驅(qū)動
--- John Riedl明尼蘇達大學教授
01前言
智能推薦和泛的營銷完全不同,后者是將產(chǎn)品賣給客戶作為最終目標;而智能推薦是以“客戶需求”為導向的,是給客戶帶來價值的。常見的如淘寶的 “你可能還喜歡”,亞馬遜的 “購買此商品的用戶也購買了” 便是實例。本文就將詳細介紹如何用Python實現(xiàn)智能推薦算法,主要將分為兩個部分:
02常見的推薦系統(tǒng)與算法
常見的推薦系統(tǒng)分類有:
“ 京騰 ” 合作構(gòu)建用戶畫像標簽圖
常見的推薦算法有:
本文將專注于理解起來最容易且又十分經(jīng)典常用的基于關聯(lián)規(guī)則的購物籃推薦。商品的關聯(lián)度分析對于提高商品的活力、挖掘消費者的購買力、促進最大化銷售有很大幫助。其建模理念為:物品被同時購買的模式反映了客戶的需求模式,適用場景:無需個性化定制的場景;有銷售記錄的產(chǎn)品,向老客戶推薦;套餐設計與產(chǎn)品擺放。
03購物籃簡介
問:什么是購物籃?主要運用在什么場景?
答:單個客戶一次購買商品的綜合稱為一個購物籃,即某個客戶本次的消費小票。常用場景:超市貨架布局:互補品與互斥品;套餐設計。
問:購物籃的常用算法?
答:常用算法有
問:求出互補品與互斥品后對布局有什么用?
答:根據(jù)關聯(lián)規(guī)則求出的商品間的關聯(lián)關系后,可能會發(fā)現(xiàn)商品間存在強關聯(lián),弱關聯(lián)與排斥三種關系。每種清醒有各自對應的布局方式。
根據(jù)購物籃的信息來進行商品關聯(lián)度的分析不僅僅只有如上三種關系,它們僅代表商品關聯(lián)度分析的一個方面(可信度)。全面系統(tǒng)的商品關聯(lián)分析必須有三度的概念,三度包括支持度,可信度和提升度。
直接根據(jù)關聯(lián)三度所定義的概念去理解會有不少難度,尤其是可信度喝提升度中的“ 誰對誰 ”的問題。其實可以換一種方式來看:
為方便理解這些規(guī)則,我們通過下面五個購物籃的例子來練習一下
不難發(fā)現(xiàn),支持度的分母都是5,也就是購物籃的數(shù)量,分子則是選取這個規(guī)則中的所有商品同時出現(xiàn)在一個籃子的次數(shù)。以A->D為例,同時包含A和D的籃子有2個,總的交易數(shù)量(籃子總數(shù))有5個,所以規(guī)則A->D的支持度為2/5;有商品 A 的籃子個數(shù)為3,在這三個籃子中,其中2個籃子又包含商品D,所以該規(guī)則的置信度(可信度)為2/3。有關關聯(lián)規(guī)則,還有以下兩個問題想補充:
問:僅看支持度和置信度是否靠譜?
答:看一個案例:食堂賣飯,1000份打飯記錄中,買米飯的有800人次,買牛肉的有600人次,兩個共同買的有400人次,那么可以得出對于規(guī)則(牛肉 - > 米飯)Support=P(牛肉&米飯)= 400/1000=0.40;Confidence=P(米飯|牛肉)=400/600=0.67置信度和支持度都很高,但是給買牛肉的人推薦米飯有意義嗎?顯然是沒有任何意義的。因為無任何條件下用戶購買米飯的概率:P(米飯)=800/1000=0.8,都已經(jīng)大過買了牛肉的前提下再買米飯的概率 0.67,畢竟米飯本來就比牛肉要暢銷啊。
這個案例便引出了提升度的概念:提升度 = 置信度/無條件概率=0.67/0.8。規(guī)則 X(A→B) 的提升度為 n 時:向購買了 A 的客戶推薦 B 的話,這個客戶購買 B 的概率是 TA 自然而然購買 B 的 n × 100% 左右。生活理解:消費者平時較少單獨購買桌角防撞海綿,可能偶爾想到或自己小孩碰到的時候才會想起購買,如果我們在桌子(書桌飯桌)的成功下單頁面添加桌角防撞海綿的推薦,則很大程度上可以提高防撞海綿的銷量。這也符合我們希望通過暢銷商品帶動相對非暢銷商品的宗旨。
問:除了公式的含義,關聯(lián)三度(支持度,置信度,提升度)還有什么關聯(lián)嗎?
答:可以這樣理解:
所以 1.0 是提升度的一個分界值,剛才的買飯案例中給買了牛肉的用戶推薦米飯的這種騷操作的提升度小于 1 也就不難理解了。另外,高置信度的兩個商品(假設達到了 100%,意味著它們總是成雙成對的出現(xiàn)),但如果支持度很低(意味著份額低),那它對整體銷售提升的幫助也不會大。
05基于Apriori 算法的Python實戰(zhàn)
由于有關Apriori等算法的研究已經(jīng)很成熟,我們在用Python實戰(zhàn)時無需一步一步計算,直接調(diào)用現(xiàn)有函數(shù)即可,主要是要明白背后的原理與不同算法的使用場景與優(yōu)劣比較。
首先導入相關庫并進行數(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ù)解釋
接著來看看商品的種類
print(f"數(shù)據(jù)集中共有{df['Model'].nunique()}種商品") model_names = df['Model'].unique() print("商品名分別為:") # 5 個為一行顯示 for i in range(0, len(model_names), 5): print(model_names[i:i+5])
再來看看最暢銷的 15 種商品
再進行一些簡單的可視化
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)
首先生成購物籃,并將同一個客戶購買的所有商品放入同一個購物籃,需要提前使用pip install Apriori安裝,之后我們使用 Apriori 包中的 dataconvert 函數(shù),下面是需要傳入的參數(shù)解釋
注意:需要注意傳入的參數(shù)類型,只要對了,直接套用就不是什么難事
import Apriori as apri # 需要稍微等待一下 baskets = apri.dataconvert(arulesdata=df, tidvar='OrderNumber', itemvar='Model', data_type='inverted') # 返回的購物籃是一個大列表,大列表中的每一個小列表表示一個籃子 # 購物籃個數(shù)剛好等于數(shù)據(jù)集中的客戶數(shù)量 type(baskets), len(baskets) == df['OrderNumber'].nunique() # (list, True)
現(xiàn)在查看前五個購物籃中的物品
現(xiàn)在生成關聯(lián)規(guī)則,根據(jù)排列組合,可知這些交易將會產(chǎn)生 21255×21254÷2 這么多個關聯(lián)規(guī)則。首先就要滿足支持度的要求,太小則直接被刪去,支持度的大小可根據(jù)關聯(lián)規(guī)則的多少調(diào)整 如果關聯(lián)規(guī)則很少,可根據(jù)實際情況放寬支持度的要求。相關參數(shù)說明:
這里,minSupport 或 minConf 設定越低,產(chǎn)生的規(guī)則越多,計算量也就越大
結(jié)果說明: 以 result 第一行為例
現(xiàn)在我們篩選互補品和互斥品,代碼如下
# 互補品 # lift 提升度首先要大于1,然后再排序選擇自己希望深究的前 n 個 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é)果也合情合理
對結(jié)果簡單分析一些,不要期望每個規(guī)則都有意義,要結(jié)合業(yè)務思考,比如競速型賽道自行車與運動水壺互斥實屬正常,競速講究輕量化,還配個水壺干什么... 比如山地車配一個競速公路車用的運動型頭盔...互斥產(chǎn)品則是成對出現(xiàn)的!
需要結(jié)合業(yè)務需求
# 注意數(shù)據(jù)類型,frozenset,需要拆一下 result['lhs'][1], type(result['lhs'][1]) # (frozenset({'山地車內(nèi)胎'}), frozenset)
以獲得最高的營銷相應率為目標
如果一個新客戶剛剛下單了山地車英騎這個產(chǎn)品,如果希望獲得最高的營銷響應率,那在他付費成功頁面上最應該推薦什么產(chǎn)品?
目標:獲得最高的營銷響應率
以最大化總體銷售額為目標
如果一個新客戶剛下單了山地英騎這個產(chǎn)品,如果希望最大化提升總體的銷售額,那么在他付費成功的頁面上應該推薦什么產(chǎn)品?
目標:最大化銷售額
再次重申提升度通俗含義:提升度是相對于自然而然購買而言,A對B的提升度為4.0的理解如下:向購買了A的用戶推薦B,則該用戶購買B的概率是該用戶單獨(即自然而然的購買)購買B的概率的 400% 向購買了A的用戶推薦B,則該用戶購買B的概率比該用戶單獨(即自然而然的購買)購買B的概率高300%!
用戶并未產(chǎn)生消費,為其推薦某樣商品
最后總結(jié)一下,基于關聯(lián)規(guī)則的 Apriori 算法是智能推薦領域十分經(jīng)典的應用之一,簡單易上手。其實推薦領域的難點不一定在于算法,而在于過大的客戶量與其產(chǎn)生的數(shù)據(jù),所以一般到了最后用的都是混合推薦。至于更深層次的序貫模型與協(xié)同過濾,幾乎沒有人使用 Python 或 R 來實現(xiàn),大部分都是使用分布式框架如 Spark,后續(xù)也會推出相關文章。
數(shù)據(jù)分析咨詢請掃描二維碼
若不方便掃碼,搜微信號:CDAshujufenxi
SQL Server 中 CONVERT 函數(shù)的日期轉(zhuǎn)換:從基礎用法到實戰(zhàn)優(yōu)化 在 SQL Server 的數(shù)據(jù)處理中,日期格式轉(zhuǎn)換是高頻需求 —— 無論 ...
2025-09-18MySQL 大表拆分與關聯(lián)查詢效率:打破 “拆分必慢” 的認知誤區(qū) 在 MySQL 數(shù)據(jù)庫管理中,“大表” 始終是性能優(yōu)化繞不開的話題。 ...
2025-09-18CDA 數(shù)據(jù)分析師:表結(jié)構(gòu)數(shù)據(jù) “獲取 - 加工 - 使用” 全流程的賦能者 表結(jié)構(gòu)數(shù)據(jù)(如數(shù)據(jù)庫表、Excel 表、CSV 文件)是企業(yè)數(shù)字 ...
2025-09-18DSGE 模型中的 Et:理性預期算子的內(nèi)涵、作用與應用解析 動態(tài)隨機一般均衡(Dynamic Stochastic General Equilibrium, DSGE)模 ...
2025-09-17Python 提取 TIF 中地名的完整指南 一、先明確:TIF 中的地名有哪兩種存在形式? 在開始提取前,需先判斷 TIF 文件的類型 —— ...
2025-09-17CDA 數(shù)據(jù)分析師:解鎖表結(jié)構(gòu)數(shù)據(jù)特征價值的專業(yè)核心 表結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 規(guī)范存儲的結(jié)構(gòu)化數(shù)據(jù),如數(shù)據(jù)庫表、Excel 表、 ...
2025-09-17Excel 導入數(shù)據(jù)含缺失值?詳解 dropna 函數(shù)的功能與實戰(zhàn)應用 在用 Python(如 pandas 庫)處理 Excel 數(shù)據(jù)時,“缺失值” 是高頻 ...
2025-09-16深入解析卡方檢驗與 t 檢驗:差異、適用場景與實踐應用 在數(shù)據(jù)分析與統(tǒng)計學領域,假設檢驗是驗證研究假設、判斷數(shù)據(jù)差異是否 “ ...
2025-09-16CDA 數(shù)據(jù)分析師:掌控表格結(jié)構(gòu)數(shù)據(jù)全功能周期的專業(yè)操盤手 表格結(jié)構(gòu)數(shù)據(jù)(以 “行 - 列” 存儲的結(jié)構(gòu)化數(shù)據(jù),如 Excel 表、數(shù)據(jù) ...
2025-09-16MySQL 執(zhí)行計劃中 rows 數(shù)量的準確性解析:原理、影響因素與優(yōu)化 在 MySQL SQL 調(diào)優(yōu)中,EXPLAIN執(zhí)行計劃是核心工具,而其中的row ...
2025-09-15解析 Python 中 Response 對象的 text 與 content:區(qū)別、場景與實踐指南 在 Python 進行 HTTP 網(wǎng)絡請求開發(fā)時(如使用requests ...
2025-09-15CDA 數(shù)據(jù)分析師:激活表格結(jié)構(gòu)數(shù)據(jù)價值的核心操盤手 表格結(jié)構(gòu)數(shù)據(jù)(如 Excel 表格、數(shù)據(jù)庫表)是企業(yè)最基礎、最核心的數(shù)據(jù)形態(tài) ...
2025-09-15Python HTTP 請求工具對比:urllib.request 與 requests 的核心差異與選擇指南 在 Python 處理 HTTP 請求(如接口調(diào)用、數(shù)據(jù)爬取 ...
2025-09-12解決 pd.read_csv 讀取長浮點數(shù)據(jù)的科學計數(shù)法問題 為幫助 Python 數(shù)據(jù)從業(yè)者解決pd.read_csv讀取長浮點數(shù)據(jù)時的科學計數(shù)法問題 ...
2025-09-12CDA 數(shù)據(jù)分析師:業(yè)務數(shù)據(jù)分析步驟的落地者與價值優(yōu)化者 業(yè)務數(shù)據(jù)分析是企業(yè)解決日常運營問題、提升執(zhí)行效率的核心手段,其價值 ...
2025-09-12用 SQL 驗證業(yè)務邏輯:從規(guī)則拆解到數(shù)據(jù)把關的實戰(zhàn)指南 在業(yè)務系統(tǒng)落地過程中,“業(yè)務邏輯” 是連接 “需求設計” 與 “用戶體驗 ...
2025-09-11塔吉特百貨孕婦營銷案例:數(shù)據(jù)驅(qū)動下的精準零售革命與啟示 在零售行業(yè) “流量紅利見頂” 的當下,精準營銷成為企業(yè)突圍的核心方 ...
2025-09-11CDA 數(shù)據(jù)分析師與戰(zhàn)略 / 業(yè)務數(shù)據(jù)分析:概念辨析與協(xié)同價值 在數(shù)據(jù)驅(qū)動決策的體系中,“戰(zhàn)略數(shù)據(jù)分析”“業(yè)務數(shù)據(jù)分析” 是企業(yè) ...
2025-09-11Excel 數(shù)據(jù)聚類分析:從操作實踐到業(yè)務價值挖掘 在數(shù)據(jù)分析場景中,聚類分析作為 “無監(jiān)督分組” 的核心工具,能從雜亂數(shù)據(jù)中挖 ...
2025-09-10統(tǒng)計模型的核心目的:從數(shù)據(jù)解讀到?jīng)Q策支撐的價值導向 統(tǒng)計模型作為數(shù)據(jù)分析的核心工具,并非簡單的 “公式堆砌”,而是圍繞特定 ...
2025-09-10