Hello,大家好!我是MPIG2018級研究生高鴻宇。在前一章我們了解了Apriori算法。它可以通過尋找物品的不同組合,找到頻繁項以及頻繁項之間的關聯,今天為大家帶來的是Apriori算法的實際應用示例。我們會通過一個從毒蘑菇中尋找相似特徵的示例來看Apriori算法是如何發現頻繁項以及找到他們的關聯關係的。
關於本系列的往期內容請戳👇:
機器學習實戰(1):k-近鄰算法(上)
機器學習實戰(2):K-近鄰算法(2)
機器學習實戰(3):決策樹
機器學習實戰(4):決策樹(下)
機器學習實戰(5):樸素貝葉斯(上)
機器學習實戰(6):樸素貝葉斯(下)
機器學習實戰(7):logistic 回歸
機器學習實戰(8):支持向量機(上)
機器學習實戰(9):支持向量機(下)
機器學習實戰(10):Adaboost元算法(上)
機器學習實戰(11):AdaBoost元算法(下)
機器學習實戰(12) : 預測數值型數據:回歸
機器學習實戰(13) : 樹回歸
機器學習實戰(14.1):K均值聚類
機器學習實戰(14.2):二分K-均值算法
機器學習實戰(14.3):對地理位置進行聚類
機器學習實戰(15.1):Apriori算法
首先我們看下本章主要內容:
1.Apriori算法回顧
2.使用Apriori算法來解決實際問題——從毒蘑菇中找到相似特徵
3.尋找毒蘑菇相關特徵的Python代碼
一. Apriori算法回顧
1.Apriori算法的實際意義
「啤酒與尿布」的例子相信很多人都聽說過吧,故事是這樣的:在一家超市中,人們發現了一個特別有趣的現象,尿布與啤酒這兩種風馬牛不相及的商品居然擺在一起。但這一奇怪的舉措居然使尿布和啤酒的銷量大幅增加了。這可不是一個笑話,而是一直被商家所津津樂道的發生在美國沃爾瑪連鎖超市的真實案例。原來,美國的婦女通常在家照顧孩子,所以她們經常會囑咐丈夫在下班回家的路上為孩子買尿布,而丈夫在買尿布的同時又會順手購買自己愛喝的啤酒。如何從浩如煙海卻又雜亂無章的數據中,發現啤酒和尿布銷售之間的聯繫呢?這種從大規模的數據中發現物品間隱含關係的方法被稱為關聯分析,Apriori算法是最著名的關聯規則挖掘算法之一。
2.Apriori算法內容
在海量的數據中做關聯分析,從而找到頻繁項集和關聯規則。
頻繁項集:經常出現在一起的物品的集合。
關聯規則:暗示頻繁項集物品之間可能存在的關聯。
3.Apriori算法的過程:
(1) 收集數據
(2) 使用 Apriori 算法來找到頻繁項集
(3) 用於發現頻繁項集中物品之間的關聯規則
二. 使用Apriori算法來解決實際問題——從毒蘑菇中找到相似特徵
當我們只對包含某個特定元素項的項集感興趣的時候,我們可以不用尋找所有的頻繁項集。今天這個示例就是用來尋找毒蘑菇的一些公共特徵。在這個數據集中我們用每個數字代表蘑菇的每個特徵。
為了尋找蘑菇的公共特徵,我們可以用Apriori算法來尋找包含特徵值為2的頻繁項集。再利用找到的頻繁項集挖掘關聯規則。
三.尋找毒蘑菇相關特徵的Python代碼
1.讀取蘑菇數據集
DataSet = [line.split() for line in open('mushroom.dat').readlines()]
2.在得到候選項集C1與包含支持度的頻繁項集D1後再定義一個頻繁項集D,使裡面只包含具有特徵『2』的支持度。
def createC1(dataSet):
C1 = []
for transaction in dataSet:
for item in transaction:
if not [item] in C1:
C1.append([item])
C1.sort()
C1 = [frozenset(i) for i in C1]
return C1
def scanD_1(dataSet, Ck, minSupport):
ssCnt = {}
numItems = float(len( list(map(set, dataSet))))
D = map(set, dataSet)
for tid in D:
for can in Ck:
if can.issubset(tid):
if can not in ssCnt:
ssCnt[can] = 1
else:
ssCnt[can] += 1
rList = []
sData = {}
for key in ssCnt:
support = ssCnt[key] / numItems
sData[key] = support
if support >= minSupport:
rList.insert(0, key)
#sData[key] = support
return rList, sData
def scanD(dataSet, Ck, minSupport):
ssCnt = {}
numItems = float(len( list(map(set, dataSet))))
D = map(set, dataSet)
for tid in D:
for can in Ck:
if can.issubset(tid):
if can not in ssCnt:
ssCnt[can] = 1
else:
ssCnt[can] += 1
retList = []
Lk = []
supportData = {}
for key in ssCnt:
support = ssCnt[key] / numItems
supportData[key] = support
if support >= minSupport:
Lk.insert(0,key)
if key.intersection('2'):
retList.insert(0, key)
#supportData[key] = support
return retList,Lk, supportData
3.在得到符合支持度的頻繁項集後再重新定義候選項集使它只有包含『2』的頻繁項。
def getC1(L1):
List = []
for item in L1:
if item.intersection('2'):
List.append(item)
return List
4.設定支持度閾值為0.45,可信度閾值為0.8。輸出頻繁項集,並將得到的頻繁項集list與支持度列表supportDate帶入關聯關係代碼。輸出符合可信度的關聯規則。
List , supportDate = apriori(DataSet ,0.45)
generateRules(List,supportDate,0.8)
print('頻繁項集:',List)
def calcConf(freqSet, H, supportData, brl, minConf):
prunedH = []
for conseq in H:
conf = supportData[freqSet]/supportData[freqSet-conseq]
if conf >= minConf:
print(freqSet-conseq,'-->',conseq,'conf:',conf)
brl.append((freqSet-conseq, conseq, conf))
prunedH.append(conseq)
return prunedH
5.運行結果
可看到『2『關聯『34』的可信度為0.95,關聯『85』的可信度為1.0
因為數據量龐大,下面為部分結果展示
可更改支持度與可信度閾值,來篩選更符合需求的關聯規則。
想要更加詳細了解本講更多細節的內容嗎?那就一起來觀看下面的 Presentation的具體講解吧:
Github代碼下載連結:
https://github.com/MPIG-Robot/Machine-Learning-in-Action
百度雲盤presentation下載連結:
https://pan.baidu.com/s/1obxLBtUmMUzkL1HZ7JG6qA
百度雲盤視頻下載連結:
https://pan.baidu.com/s/1dtC17AE9otGvWVliNnDwSw
騰訊視頻下載連結:
https://v.qq.com/x/page/b0801xf3bql.html
另外,你還可以在騰訊視頻客戶端中搜索「機器學習實戰(15.2)Apriori算法示例「找到本視頻,也可以直接搜索MPIG Open Seminar頻道找到本視頻,這樣你可以痛快地將本視頻離線了!
有疑問?沒關係呀、趕緊聯繫我吧!我的團隊郵箱: ghy@mpig.com.cn 期待跟大家一起交流,共同討論!
什麼是MPIG Open Seminar?
這是Machine Perception and Interaction Group定期開展的內部學術交流會,開放開源,視頻會同時發布在優酷和騰訊視頻上,文稿公開分享在百度雲,如果有對應代碼會開源在github上。如果你在上海,想親臨現場,或想投稿,那請後臺留言或發郵件給szl@mpig.com.cn 期待與你交流,歡迎訪問www.mpig.com.cn獲取更多團隊信息。
歡迎關注MPIG公眾號可查找 mpig_robot
也可長按下面的二維碼關注,這裡有各種關於機器學習和機器人的乾貨知識: