練習題︱基於今日頭條開源數據(二)——兩款Apriori演算法實踐
來自專欄素質雲筆記
?> Apriori演算法是通過限制候選產生髮現頻繁項集。總的來說,Apriori演算法其實效率並不高,大規模數據計算的時候,需要考慮性能問題。
code + data可見:mattzheng/AprioriDemo
盜圖盜圖:
在R語言裡面有非常好的package,可見我之前的博客:
R語言實現關聯規則與推薦演算法(學習筆記)該packages能夠實現以下一些可視化:
但是好像Python裡面沒有這樣封裝比較好的庫...搜颳了一下,發現很多人寫了,但是沒有可視化模塊,不過先拿著用唄。
筆者參考這兩位大神的作品:- 用Pandas實現高效的Apriori演算法
- asaini/Apriori
當然也會結合今日頭條數據來做,之前做過一個練習,可見我之前博客:
練習題︱基於今日頭條開源數據的詞共現、新熱詞發現、短語發現一、Apriori關聯演算法一:asaini/Apriori
因為該大神寫的時候用得py2,我現在習慣py3;同時對一些細節進行一些調整。主要以介紹案例為主。
整體來看,效率還是很不錯的,要比第二款效率高。1.1 主函數介紹
runApriori(inFile, minSupport, minConfidence)
輸入的內容有三樣:
- inFile:數據集輸入,迭代器
- minSupport:最小支持度閾值,作者推薦:0.1-0.2之間
- minConfidence:最小置信度閾值,作者推薦:0.5-0.7之間
輸出內容兩樣:
- items ,支持度表,形式為:(tuple, support),一個詞的支持度、一對詞的支持度【無指向】
- rules ,置信度表,形式為((pretuple, posttuple), confidence),(起點詞,終點詞),置信度【有指向】
1.2 改編兩函數:dataFromFile、transferDataFrame
為了更便於使用,同時筆者改編了一個函數 dataFromFile + 新寫了一個函數 transferDataFrame。
dataFromFile(fname,extra = False)
作者函數中只能從外部讀入,如果筆者要對數據集做點操作,就可以使用extra = True,當然只適用dataframe,可見下面的今日頭條數據例子。
transferDataFrame(items, rules,removal = True)
items、rules計算出來之後,作者只是print出來,並沒有形成正規的格式輸出,這裡寫了一個變成dataframe的格式。可見下面例子的格式。
同時,這邊的removal =True,是因為會出現:『A->B』,『B->A』的情況,這邊True就是只保留一個。1.3 作者提供的數據實踐
作者的數據為,而且可以支持不對齊、不等長:
inFile = dataFromFile(INTEGRATED-DATASET.csv,extra = False)minSupport = 0.15minConfidence = 0.6items, rules = runApriori(inFile, minSupport, minConfidence)# ------------ print函數 ------------printResults(items, rules)# ------------ dataframe------------ items_data,rules_data = transferDataFrame(items, rules)
這裡的支持度、置信度都還挺高的,得出的結果:
items_data的支持度的表格,其中Len,代表詞表中的詞個數。word_x->word_y
1.4 今日頭條二元組詞條
今日頭條的數據處理,主要參考上一篇練習題。然後把二元組的內容,截取前800個,放在此處。
其中第一列為共現頻數,其他為共現詞,在這裡面不用第一列共現頻數。data = pd.read_csv(CoOccurrence_data_800.csv,header = None)inFile = dataFromFile(data[[1,2]],extra = True)data_iter = dataFromFile(data[[1,2]],extra = True)#list(inFile)minSupport = 0.0minConfidence = 0.0items, rules = runApriori(inFile, minSupport, minConfidence)print(--------items number is: %s , rules number is : %s--------%(len(items),len(rules)))# ------------ print函數 ------------printResults(items, rules)# ------------ dataframe------------ items_data,rules_data = transferDataFrame(items, rules)
此時,因為詞語與詞語之間的關係很稀疏,支持度與置信度都不會高的,所以練習題中要把兩個比例都設置為0比較好。
items_data的支持度的表格,其中Len,代表詞表中的詞個數。word_x->word_y
.
二、Apriori關聯演算法二:Pandas實現高效的Apriori演算法
用Pandas寫的,效率在生成頻繁集的時候會爆炸,所以合理選擇支持度很重要。
大神寫的很服從中文環境,所以不用改啥,給贊!2.1 官方案例
所使用的數據比較規則:
# ------------ 官方 ------------ d = pd.read_csv(apriori.txt, header=None, dtype = object) d = ToD(d) support = 0.06 #最小支持度 confidence = 0.75 #最小置信度 output = find_rule(d, support, confidence) output.to_excel(rules.xls)
大神已經整理好結果,可見:
2.2 今日頭條數據
今日頭條的數據處理,主要參考上一篇練習題。然後把二元組的內容,截取前800個,放在此處。
其中第一列為共現頻數,其他為共現詞,在這裡面不用第一列共現頻數。
# ------------自己 ------------data = pd.read_csv(CoOccurrence_data_800.csv,header = None)support = 0.002 #最小支持度confidence = 0.0 #最小置信度d = ToD(data[[1,2]])output = find_rule(d, support, confidence)
因為詞條之間非常稀疏,支持度與置信度需要設置非常小,如果support設置為0的話,又會超級慢,筆者實驗的數據,支持度比較合適在0.002。
最終輸出的結果如下:推薦閱讀:
※【翻譯】Brian2高級指導_Brian如何工作
※知識布局-tensorflow-梯度下降
※從零開始實現KNN分類演算法
※大話凝聚式層次聚類