1.推荐系统中的常见的几种算法:
- 基于内容的推荐:内容特征表示,特征学习,推荐列表
- 基于协同过滤的推荐:群体智能,用户历史行为
- 基于关联规则的推荐:Transactions,频繁项集,关联规则挖掘
- ?基于效用的推荐 :效用函数的定义
- 基于知识的推荐 知识图谱的创建
- 组合推荐 实际工作中经常采用 每种推荐算法都有自己的使用场景,可以综合考虑
2.关联规则:
(1)含义:关联规则是形如X→Y的蕴涵式,反映一个事物与其他事物之间的相互依存性和关联性。通俗来讲,就是两个商品或者两种交易之间所具有的某种联系
(2)几个概念:
- 支持度:是个百分比,指的是某个商品组合出现的次数与总次数之间的比例。支持度越高,代表这个组合出现的频率越大。
- 置信度:是个条件概念 指的是当你购买了商品A,会有多大的概率购买商品B
- 提升度:商品A的出现,对商品B的出现概率提升的程度,提升度(A→B)=置信度(A→B)/支持度(B)
- 频繁项集:支持度大于等于最小支持度(Min Support)阈值的项集。
(3)Apriori算法:查找频繁项集(frequent itemset)的过程
????????算法的流程:
- Step1,K=1,计算K项集的支持度;
- Step2,筛选掉小于最小支持度的项集;
- Step3,如果项集为空,则对应K-1项集的结果为最终结果。 否则K=K+1,重复1-3步。
3.关联规则和协同过滤的比较:
关联规则是基于transaction,没有利用“用户偏好”,而是基于购物订单进行的频繁项集挖掘;而协同过滤基于用户偏好(评分),协同过滤计算的是相似度。
4.参数确定:
最小支持度,最小置信度是实验出来的 ,不同的数据集,最小值支持度差别较大。可能是0.01到0.5之间 可以从高到低输出前20个项集的支持度作为参考。
最小置信度:可能是0.5到1之间 提升度:表示使用关联规则可以提升的倍数,是置信度与期望置信度的比值 提升度至少要大于1。
5.关联分析案例:
工具包1:
from efficient_apriori import apriori:速度较快,但是返回的结果数据较少
使用:
itemsets,rules = apriori(transactions,min_support=0.5,min_confidence=0.5)
参数:
apriori(
transactions:交易数据,即扔进去训练的数据,格式为:每行为交易订单记录,每列为每条订单具体购买的商品。
min_support:最小支持度,
min_confidence:最小置信度
return:返回参数itemsets:频繁项集;rules:在设置的最小支持度和置信度下筛选出来的关联规则
)
工具包2:速度较慢,返回结果多
from mlxtend.frequent_patterns import association_rules
from mlxtend.frequent_patterns import apriori
使用:
items = apriori(movies_hot_encoded,use_colnames=True,min_support=0.05)
rules = association_rules(items,metric='lift',min_threshold=2)
参数:
apriori(
movies_hot_encoded:交易数据集,先将数据集进行one-hot编码,形成的数据格式为行为每条订单,列为所有订单中出现的商品,每个订单购买了什么商品,则编码为1,否则为0。
use_colnames=True:设置为True时,返回列名,而不是列索引值
min_support:最小支持度
return:返回一个频繁项集
)
association_rules(
items:上面得到的频繁项集
metric='lift':设置的规则,这里设置为提升度
min_threshold:最小提升度的值
return:返回一个关联规则
)
test1:
# test1:利用Apriori进行简单关联分析
from efficient_apriori import apriori
transations = [('牛奶','面包','尿布'),
('可乐','面包', '尿布', '啤酒'),
('牛奶','尿布', '啤酒', '鸡蛋'),
('面包', '牛奶', '尿布', '啤酒'),
('面包', '牛奶', '尿布', '可乐')]
#挖掘频繁项集和频繁规则
itemsets,rules = apriori(transactions,min_support=0.5,min_confidence=1)
for i in itemsets:
print(itemsets[i])
print("min_support=0.5,min_confidence=1,rules长度:",len(rules))
print("rules",rules)
print("*********************************")
itemsets,rules = apriori(transactions,min_support=0.5,min_confidence=0.8)
print("itemsets:")
for i in itemsets:
print(itemsets[i])
print("min_support=0.5,min_confidence=0.8,rules长度:",len(rules))
print("rules",rules)
"""
output:
{('牛奶',): 4, ('面包',): 4, ('尿布',): 5, ('啤酒',): 3}
{('啤酒', '尿布'): 3, ('尿布', '牛奶'): 4, ('尿布', '面包'): 4, ('牛奶', '面包'): 3}
{('尿布', '牛奶', '面包'): 3}
min_support=0.5,min_confidence=1,rules长度: 4
rules [{啤酒} -> {尿布}, {牛奶} -> {尿布}, {面包} -> {尿布}, {牛奶, 面包} -> {尿布}]
*********************************
itemsets:
{('牛奶',): 4, ('面包',): 4, ('尿布',): 5, ('啤酒',): 3}
{('啤酒', '尿布'): 3, ('尿布', '牛奶'): 4, ('尿布', '面包'): 4, ('牛奶', '面包'): 3}
{('尿布', '牛奶', '面包'): 3}
min_support=0.5,min_confidence=0.8,rules长度: 6
rules [{啤酒} -> {尿布}, {牛奶} -> {尿布}, {尿布} -> {牛奶}, {面包} -> {尿布}, {尿布} -> {面包}, {牛奶, 面包} -> {尿布}]
"""
test2:
#电影中得到关联规则:MovieLens 主要使用 Collaborative Filtering 和 Association Rules 相结合的技术,向用户推荐他们感兴趣的电影。
import pandas as pd
from mlxtend.frequent_patterns import association_rules
from mlxtend.frequent_patterns import apriori
#数据加载
movies = pd.read_csv(r'.\MovieLens/movies.csv')
movies.head(10)
#进行独热值编码
movies_hot_encoded = movies.drop('genres',1).join(movies.genres.str.get_dummies(sep='|'))
pd.options.display.max_columns = 100
#将其中的movies和title设置为下标
movies_hot_encoded.set_index(['movieId','title'],inplace=True)
#进行频繁项集的挖掘,并进行支持度的排序
itemsets = apriori(movies_hot_encoded,use_colnames=True,min_support=0.02)
itemsets = itemsets.sort_values(by='support',ascending=False)
#将频繁数据集扔进并联规则中,设置指标为提升度,并设置最小提升度为2
rules = association_rules(itemsets,metric='lift',min_threshold=2)
rules = rules.sort_values(by='lift',ascending=True)
print('-'*20, '频繁项集', '-'*20)
print(itemsets)
print('-'*20, '关联规则', '-'*20)
rules
|