有时我们并不想寻找所有频繁项集,而只对包含某个特定元素项的项集感兴趣。在本章这个最后的例子中,我们会寻找毒蘑菇中的一些公共特征,利用这些特征就能避免吃到那些有毒的蘑菇。UCI的机器学习数据集合中有一个关于肋形蘑菇的23种特征的数据集,每一个特征都包含一个标称数据值。我们必须将这些标称值转化为一个集合,这一点与前面投票例子中的做法类似。幸运的是,已经有人已经做好了这种转换1。Roberto Bayardo对UCI蘑菇数据集进行了解析,将每个蘑菇样本转换成一个特征集合。其中,枚举了每个特征的所有可能值,如果某个样本包含特征,那么该特征对应的整数值被包含数据集中。下面我们近距离看看该数据集。它在源数据集合中是一个名为mushroom.dat
的文件。下面将它和原始数据集http://archive.ics.uci.edu/ml/machine-learning-databases/mushroom/agaricus-lepiota.data进行比较。
1. “Frequent Itemset Mining Dataset Repository” retrieved July 10, 2011; http://fimi.ua.ac.be/data/.
文件mushroom.dat
的前几行如下:
1 3 9 13 23 25 34 36 38 40 52 54 59 63 67 76 85 86 90 93 98 107 1132 3 9 14 23 26 34 36 39 40 52 55 59 63 67 76 85 86 90 93 99 108 1142 4 9 15 23 27 34 36 39 41 52 55 59 63 67 76 85 86 90 93 99 108 115
第一个特征表示有毒或者可食用。如果某样本有毒,则值为2。如果可食用,则值为1。下一个特征是蘑菇伞的形状,有六种可能的值,分别用整数3-8来表示。
为了找到毒蘑菇中存在的公共特征,可以运行Apriori算法来寻找包含特征值为2的频繁项集。
>>> mushDatSet = [line.split for line inopen('mushroom.dat').readlines]
在该数据集上运行Apriori算法:
>>> L,suppData=apriori.apriori(mushDatSet, minSupport=0.3)
在结果中可以搜索包含有毒特征值2的频繁项集:
>>> for item in L[1]:... if item.intersection('2'): print item...frozenset(['2', '59'])frozenset(['39', '2'])frozenset(['2', '67'])frozenset(['2', '34'])frozenset(['2', '23'])
也可以对更大的项集来重复上述过程:
>>> for item in L[3]:... if item.intersection('2'): print item...frozenset(['63', '59', '2', '93'])frozenset(['39', '2', '53', '34'])frozenset(['2', '59', '23', '85'])frozenset(['2', '59', '90', '85'])frozenset(['39', '2', '36', '34'])frozenset(['39', '63', '2', '85'])frozenset(['39', '2', '90', '85'])frozenset(['2', '59', '90', '86'])
接下来你需要观察一下这些特征,以便知道了解野蘑菇的那些方面。如果看到其中任何一个特征,那么这些蘑菇就不要吃了。当然,最后还要声明一下:尽管上述这些特征在毒蘑菇中很普遍,但是没有这些特征并不意味该蘑菇就是可食用的。如果吃错了蘑菇,你可能会因此而丧命。