數據挖掘——關聯算法
一、概念
關聯(Association)
關聯就是把兩個或兩個以上在意義上有密切聯系的項組合在一起。
關聯規則(AR,Assocaition Rules)
用於從大量數據中挖掘出有價值的數據項之間的相關關系。(購物籃分析)
協同過濾(CF,Collaborative Filtering)
協同過濾常常被用於分辨某位特定顧客可能感興趣的東西,這些結論來自於對其他相似顧客對哪些產品感興趣的分析。(推薦系統)
二、關聯規則
1、相關數據指標
兩個不相交的非空集合X、Y,如果X -> Y,就說X -> Y是一條關聯規則。
強度:支持度(Support):support({X -> Y}) = 集合X與集合Y中的項在一條記錄中同時出現的次數 / 數據記錄的個數
自信度(Confidence):confidence({X -> Y})集合X與集合Y中的項在一條記錄中同時出現的次數 / 集合X出現的次數
效度:提升度(Lift):度量規則是否可用的指標,描述的是相對於不用規則,使用規則可以提高多少,提升度大於1,規則有效
lift({X -> Y}) = confidence({X -> Y}) / support({X -> Y})
2、計算步驟
- 掃描數據集,統計一級候選集出現的次數
- 清除不滿足條件的候選項集,得到一級項集
- 從一級項集中國,組合二級候選項集,統計數據集中它們出現的次數
- 清除不滿足條件的候選項集,得到二級項集
- 從二級項集中,組合三級候選項集,統計數據集中他們出現的次數
- ……
- 將得到的項集作為結果返回
大致過程如下:
3、 使用python實現關聯算法(apriori算法)
!apriori 包不支持DataFrame的數據格式,需要將數據轉化為array數組
#導入如下格式的數據
#變換數據格式,然後通過apriori方法進行處理
transform = data.groupby(by=‘交易ID‘).apply(lambda x: list(x.購買商品)).values result = list(apriori(transform))
輸出result並觀察,發現如下規律
#該數據格式包含各種項集和所對應的支持度、自信度、提升度 ‘‘‘RelationRecord( items=frozenset({‘可樂‘}),
support=0.4, ordered_statistics=[OrderedStatistic(
items_base=frozenset(), items_add=frozenset({‘可樂‘}),
confidence=0.4,
lift=1.0
)
]
)‘‘‘ #items = items_base + items_add
#遍歷result,得到每個項集(X 與 Y ,並得到相對應的支持度、自信度和提升度
supports = [] confidences = [] lifts = [] bases = [] adds = [] for i in result: supports.append(i.support) confidences.append(i.ordered_statistics[0].confidence) lifts.append(i.ordered_statistics[0].lift) bases.append(list(i.ordered_statistics[0].items_base)) adds.append(list(i.ordered_statistics[0].items_add)) #將結果轉化為容易處理的數據框 get_result = pd.DataFrame({ ‘base‘: bases, ‘add‘: adds, ‘support‘: supports, ‘confidence‘: confidences, ‘lift‘: lifts})
#得到如下的數據框,其中有不同項集及其對應結果,可通過關聯規則得到符合的關聯項
三、 協同過濾
1、 相關數據指標
協同過濾簡單來說就是利用某興趣相投、擁有共同經驗的群體的喜好來推薦用戶感興趣的信息。
協同過濾主要收集每個用戶對使用過的物品的評價(打分或星級等)。
通過用戶對各種商品評分的高低,得到用戶的喜好並,根據相似喜好的用戶歷史數據,從而推薦一些信息
優點:
- 能夠過濾機器難以自動分析的信息,如藝術品、音樂等
- 共用其他人的講演,避免了內容分析的不完全或不精確,能夠基於一些復雜的,難以表述的概念(如個人品味)進行過濾
- 有推薦新信息的能力,可以發現用戶潛在的但自己尚未發現的興趣偏好
- 推薦個性化、自動化程度高,能夠有效的利用其他相似用戶的回饋信息,加快個性化學習的速度
缺點:
- 新用戶在開始時推薦質量較差
- 新項目的推薦難度大,因為推薦質量取決於歷史數據集
2、 計算步驟
- 收集用戶信息,必須數據基礎:用戶、商品、評分
- 根據以上數據得到用戶評分向量和商品評分向量(用戶評分盡量使用標準化評分,消除用戶因打分習慣而導致的差異)
- 根據用戶評分向量計算距離(如歐式距離)
- 計算用戶相似度
- 兩種方法計算相似鄰居
- A)固定數量的鄰居(K-neighborhoods)
- 不考慮鄰居的距離差異,只取當前點最近的 K 個點作為其鄰居
- B)基於相似度門檻的鄰居(Threshold-based neighborhoods)
- 以當前點為中心,距離為 K 的區域內的所有點作為當前點的鄰居
3、 使用python實現協同過濾算法
#導入如下數據,含用戶ID,商品ID,用戶評分
#通過交叉表及變換形式得到用戶評分矩陣
userrate = data.pivot_table(index=‘UserID‘, columns=‘ItemID‘, aggfunc=sum, fill_value=0) #將透視表轉為數據框,優化列名 userrate.columns = userrate.columns.droplevel(0) del userrate.columns.name
#計算每個用戶之間的距離和相似度
#計算每個用戶之間的距離 dist = pd.DataFrame(euclidean_distances(userrate)) dist.index = userrate.index dist.columns = userrate.index #計算每個用戶之間的相似度 sim = 1/(1+dist)
#設置參數,獲取相似用戶
#設置鄰居個數為3 用戶ID為1 k = 3 userId = 1 #獲取3個相似用戶並得到其相似度 simUserIds = sim.sort_values(userId, ascending=False)[userId].index[1:k+1] simUser = sim.ix[simUserIds, userId]
#根據相似用戶得到商品的推薦排序
#根據相似用戶,計算出每個物品的評分 score = pd.DataFrame(np.dot(simUser, userrate.ix[simUserIds])) #對結果排序,得到最終的結果 result = userrate.columns[score.sort_values(0, ascending=False).index.values]
數據挖掘——關聯算法