讀古今文學網 > 機器學習實戰 > 11.6 示例:發現毒蘑菇的相似特徵 >

11.6 示例:發現毒蘑菇的相似特徵

有時我們並不想尋找所有頻繁項集,而只對包含某個特定元素項的項集感興趣。在本章這個最後的例子中,我們會尋找毒蘑菇中的一些公共特徵,利用這些特徵就能避免吃到那些有毒的蘑菇。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 113
2 3 9 14 23 26 34 36 39 40 52 55 59 63 67 76 85 86 90 93 99 108 114
2 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 in
open('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'])  
  

接下來你需要觀察一下這些特徵,以便知道瞭解野蘑菇的那些方面。如果看到其中任何一個特徵,那麼這些蘑菇就不要吃了。當然,最後還要聲明一下:儘管上述這些特徵在毒蘑菇中很普遍,但是沒有這些特徵並不意味該蘑菇就是可食用的。如果吃錯了蘑菇,你可能會因此而喪命。