亲和性分析面临的问题
亲和性分析比分类更具探索性,因为通常我们无法拿到像在很多分类任务中所用的那样完整 的数据集。例如,在电影推荐任务中,我们拿到的是不同用户对不同电影的评价。但是,每个用 户不可能评价过所有电影,这就给亲和性分析带来一个不容忽视的大难题。如果用户没有评价过一部电影,是因为他们不喜欢这部电影(据此就不推荐给他们),还是因为他们出于别的原因还没有评价?
思考数据集中类似潜在问题该怎么解决,这将帮助我们提升推荐算法的准确性。
另外一个问题在于https://mp.csdn.net/mdeditor/81013001,像这个链接中说的亲和性测试方法过于简单粗暴(用排列组合枚举的办法)。从排列组合的知识出发,我们知道,对于每一个商品,只存在买或者不买两种情况。于是,所有可能的规则数量是 2n−1 2 n − 1 。数据集有5个特征,可能的规则就有31条;有10个特征,可能的规则就有1023条;仅仅有100个特征,规则数就能达到30位数字。即使计算能力大幅提升也未 必能赶上在线商品的增长速度。因此,与其跟计算机过不去,不如寻找更加聪明的算法。
Apriori算法介绍
Apriori算法是经典的亲和性分析算法,它只从数据集中频繁出现的商品中选出共同出现的商品组成频繁项集(frequent itemset)避免了上述复杂度呈指数级增长的问题。一旦找到频繁项集,生成关联规则就很容易了。
Apriori算法的一个重要参数就是最小支持度。比如,要生成包含商品A、B的频繁项集(A, B), 要求支持度至少为30,那么A和B都必须至少在数据集中出现30次。更大的频繁项集也要遵守该 项约定,比如要生成频繁项集(A, B, C, D),那么子集(A, B, C)必须是频繁项集(当然D自己也 要满足最小支持度标准)。
生成频繁项集后,将不再考虑其他可能的却不够频繁的项集(这样的集合有很多),从而大 大减少测试新规则所需的时间。
其他亲和性分析算法有Eclat和频繁项集挖掘算法(FP-growth)。从数据挖掘角度看,这些 算法比起基础的Apriori算法有很多改进,性能也有进一步提升。
在这个电影推荐过程中,我们主要分两步走。第一步,找出频繁项集。第二步,根据置信度选取关联规则。可以设定最小置信度,返回一部分规则,或者返回所有规则,让用户自己选。
数据集介绍
首先,我们下载电影评分数据集:http://grouplens.org/datasets/movielens/
这个数据集是美国苏明达州一个研究团队公开的。下载ml-100k.zip这个数据集。
接着,我们导入数据集
import os
data_folder = os.path.join(os.path.expanduser("~"), "Data", "ml-100k")
print(data_folder)
ratings_filename = os.path.join(data_folder, "u.data")
print(ratings_filename)
输出结果是:
C:\Users\mi\Data\ml-100k
C:\Users\mi\Data\ml-100k\u.data
MovieLens数据集非常规整,但是有几点跟pandas.read_csv方法的默认设置有出入,所以 要调整参数设置。第一个问题是数据集每行的几个数据之间用制表符而不是逗号分隔。其次,没 有表头,这表示数据集的第一行就是数据部分,我们需要手动为各列添加名称。
加载数据集时,把分隔符设置为制表符,告诉pandas不要把第一行作为表头(header=None), 设置好各列的名称。
import pandas as pd
'''
pd.csv文件中参数:
names:指定列名,如果文件中不包含header的行,应该显性表示header=None
delimiter: 指定分割符,默