如图3所示,规则 ( A , B ) = > C (A,B)=>C (A,B)=>C:
设最小支持度为50%, 最小可信度为 50%, 则可得到 :
若关联规则 X = > Y X=>Y X=>Y的支持度和置信度分别大于或等于用户指定的最小支持度 m i n s u p p o r t minsupport minsupport和最小置信度 m i n c o n f i d e n c e minconfidence minconfidence,则称关联规则 X = > Y X=>Y X=>Y为强关联规则,否则称关联规则 X = > Y X=>Y X=>Y为弱关联规则。
由此可见, l i f t lift lift正是弥补了 c o n f i d e n c e confidence confidence的这一缺陷,如果 l i f t = 1 lift=1 lift=1,则 X X X与 Y Y Y独立, X X X对 Y Y Y出现的可能性没有提升作用,其值越大 ( l i f t > 1 ) (lift>1) (lift>1),则表明 X X X对 Y Y Y的提升程度越大,也表明关联性越强。
图4为一实例,可以看出, X X X对 Y Y Y的提升作用最大。
可以使用mlxtend工具包得出频繁项集与规则,导包如下:
import pandas as pd
from mlxtend.frequent_patterns import apriori
from mlxtend.frequent_patterns import association_rules
自定义一份购物数据集,即:
retail_shopping_basket = {'ID':[1,2,3,4,5,6],
'Basket':[['Beer', 'Diaper', 'Pretzels', 'Chips', 'Aspirin'],
['Diaper', 'Beer', 'Chips', 'Lotion', 'Juice', 'BabyFood', 'Milk'],
['Soda', 'Chips', 'Milk'],
['Soup', 'Beer', 'Diaper', 'Milk', 'IceCream'],
['Soda', 'Coffee', 'Milk', 'Bread'],
['Beer', 'Chips']]
}
展示一下:
retail = pd.DataFrame(retail_shopping_basket)
pd.options.display.max_colwidth=100
retail
需要将现实数据转换成one-hot编码格式。
首先,剔除无关特征。
retail_id = retail.drop('Basket',1)
retail_id
retail_Basket = retail['Basket'].str.join(',')
retail_Basket
然后,利用get_dummies()将分类变量转换为虚拟/指示符变量:
retail_Basket = retail_Basket.str.get_dummies(',')
retail_Basket
retail = retail_id.join(retail_Basket)
retail
frequent_itemsets = apriori(retail.drop('ID',1), use_colnames=True)
frequent_itemsets
如果光考虑支持度support(X>Y),[Beer, Chips]和[Beer, Diaper]一样,哪一种组合更相关呢?因此,需要计算提升度:
association_rules(frequent_itemsets,metric='lift')
数据集来源:https://grouplens.org/datasets/movielens/
查看该数据集前10项内容,显示如下:
数据集中包括电影名字与电影类型的标签,第一步还是先转换成one-hot格式,并把无关特征设置为索引:
movies_ohe = movies.drop('genres',1).join(movies.genres.str.get_dummies('|'))
movies_ohe.set_index(['movieId','title'],inplace=True)
pd.options.display.max_columns=100
movies_ohe.head()
movies_ohe.shape
(9125, 20),说明数据集包括9125部电影,一共有20种不同类型。
计算支持度大于0.015的频繁项集:
frequent_itemsets_movies = apriori(movies_ohe,min_support=0.015,use_colnames=True)
frequent_itemsets_movies
rules_movies = association_rules(frequent_itemsets_movies,metric='lift',min_threshold=1.25)
rules_movies
rules_movies[(rules_movies['lift']>8)].sort_values(by=['lift'], ascending=False)
这说明Children和Animation这两个题材是最相关的。
把包括{Children, Animation}的电影数据显示出来:
movies[(movies.genres.str.contains('Children')) & (movies.genres.str.contains('Animation'))]