大數據挖掘: FPGrowth初識--進行商品關聯規則挖掘

@(hadoop)[Spark, MLlib, 數據挖掘, 關聯規則, 算法]node


〇、簡介

經典的關聯規則挖掘算法包括Apriori算法和FP-growth算法。Apriori算法屢次掃描交易數據庫,每次利用候選頻繁集產生頻繁集;而FP-growth則利用樹形結構,無需產生候選頻繁集而是直接獲得頻繁集,大大減小掃描交易數據庫的次數,從而提升了算法的效率。可是apriori的算法擴展性較好,能夠用於並行計算等領域。算法

關聯規則的目的就是在一個數據集中找出項與項之間的關係,適用於在大數量的項集中發現關聯共現的項。也被稱爲購物籃分析 (Market Basket analysis),由於「購物籃分析」很貼切的表達了適用該算法情景中的一個子集。sql

購物網站裏你買了一個商品,旁邊列出一系列買過該商品的人還買的其餘商品,而且按置信度高低排序,通常會發現買手機的還會買充電器(買充電器的人不必定會買手機),買牙刷的還會買牙膏,這大概就是關聯規則的用處。數據庫

基礎環境:
CentOS-6.5
JDK-1.7
spark:spark-1.2.0+cdh5.3.6+379數據結構

1、Apriori算法

支持度(Support):定義爲
$$supp(X) = \frac{包含X的記錄數}{數據集記錄總數}= P(X)=\frac{occur(X)}{count(D)}$$
置信度(Confidence): 定義爲
$$ conf(X=>Y) = \frac{同時包含X和Y的記錄數}{數據集中包含X的記錄數}=P(Y|X)=\frac{P(X \cap Y)}{P(X)} = \frac{occur(X \cap Y)}{occur(X)}$$
FP-growth算法是Apriori算法的優化。ide

2、MLlib實現

spark-1.2.0 版本中Mliib的FPGrowthModel並無generateAssociationRules(minConfidence)方法。所以要引用高版本的jar包,並在提交任務時指定才行。這是能夠實現的。oop

Ⅰ、獲取購買歷史數據

下面共選取了6931條購買歷史記錄,做爲關聯規則挖掘的數據集。優化

一、產生源數據

咱們可能須要使用類Mysql中的group_concat()來產生源數據。在Hive中的替代方案是concat_ws()。但若要鏈接的列是非string型,會報如下錯誤:Argument 2 of function CONCAT_WS must be "string or array<string>", but "array<bigint>" was found.。使用如下hiveSQL能夠避免此問題:網站

SELECT concat_ws(',', collect_set(cast(item_id AS String))) AS items FROM ods_angel_useritem tb GROUP BY tb.user_id;

獲得item1,item2,item3式數據結構。
數據結構以下所示:

731478,732986,733494
731353
732985,733487,730924
731138,731169
733850,733447
731509,730796,733487
731169,730924,731353
730900
733494,730900,731509
732991,732985,730796,731246,733850

二、構造JavaRDD

JavaRDD<List<String>> transactions = ...;

Ⅱ、過濾掉出現頻率較低的數據

Java代碼:

//設置頻率(支持率)下限
FPGrowth fpg = new FPGrowth().setMinSupport(0.03).setNumPartitions(10);
FPGrowthModel<String> model = fpg.run(transactions);

List<FPGrowth.FreqItemset<String>> list_freqItem = model.freqItemsets().toJavaRDD().collect();
System.out.println("list_freqItem .size: " + list_freqItem .size());

for (FPGrowth.FreqItemset<String> itemset : list_freqItem) {
    System.out.println("[" + itemset.javaItems() + "], " + itemset.freq());
}

結果:

[[734902]], 275
[[733480]], 1051
[[734385]], 268
[[733151]], 895
[[733850]], 878
[[733850, 733480]], 339
[[733152]], 266
[[733230]], 243
[[731246]], 500
[[731246, 733480]], 233
[[734888]], 231
[[734894]], 483
[[733487]], 467
[[740697]], 222
[[733831]], 221
[[734900]], 333
[[731353]], 220
[[731169]], 311
[[730924]], 308
[[732985]], 212
[[732994]], 208
[[730900]], 291

$$\frac{208}{6931}=0.03001>0.03$$,6931是交易的訂單數量,即數據源總條數。

可見,商品732994正好高於支持率下限。

Ⅲ、過濾掉可信度太低的判斷

Java代碼:

double minConfidence = 0.3; //置信下限
List<AssociationRules.Rule<String>> list_rule = model.generateAssociationRules(minConfidence).toJavaRDD().collect();
System.out.println("list_rule.size: " + list_rule.size());
for (AssociationRules.Rule<String> rule : list_rule) {
    System.out.println(
    rule.javaAntecedent() + " => " + rule.javaConsequent() + ", " + rule.confidence());
}

結果:

[733480] => [733850], 0.3225499524262607
[731246] => [733480], 0.466
[733850] => [733480], 0.38610478359908884
  1. $P(733850|733480)=\frac{occur(733850 \cap 733480)}{occur(733480)}=\frac{339}{1051}=0.3225499524262607$
  2. $P(733480|731246)=\frac{occur(733480 \cap 731246)}{occur(731246)}=\frac{233}{500}=0.466$
  3. $P(733480|733850)=\frac{occur(733850 \cap 733480)}{occur(733850)}=\frac{339}{878}=0.38610478359908884$

以上代表,用戶在購買商品733480後每每還會購買商品733480,可信度爲0.3225499524262607;用戶在購買商品731246後每每還會購買商品731246,可信度爲0.466;用戶在購買商品733850後每每還會購買商品733480,可信度爲0.38610478359908884。

3、提交任務

Ⅰ、Spark On Standalone

spark-submit --master spark://node190:7077 --class com.angel.mlib.FPGrowthTest --jars lib/hbase-client-0.98.6-cdh5.3.6.jar,lib/hbase-common-0.98.6-cdh5.3.6.jar,lib/hbase-protocol-0.98.6-cdh5.3.6.jar,lib/hbase-server-0.98.6-cdh5.3.6.jar,lib/htrace-core-2.04.jar,lib/zookeeper.jar,lib/spark-mllib_2.10-1.5.2.jar,lib/spark-core_2.10-1.5.2.jar spark-test-1.0.jar

Ⅱ、Spark On Yarn

spark-submit --master yarn-client --class com.angel.mlib.FPGrowthTest --jars lib/hbase-client-0.98.6-cdh5.3.6.jar,lib/hbase-common-0.98.6-cdh5.3.6.jar,lib/hbase-protocol-0.98.6-cdh5.3.6.jar,lib/hbase-server-0.98.6-cdh5.3.6.jar,lib/htrace-core-2.04.jar,lib/zookeeper.jar,lib/spark-mllib_2.10-1.5.2.jar,lib/spark-core_2.10-1.5.2.jar spark-test-1.0.jar

4、FPGrowth算法在現實中的應用調優

在實際狀況中,真實的業務數據到處都是噪聲。活用數據,設計有業務含義的特徵體系,是構造魯棒模型的基礎!

具體的解決辦法,咱們能夠多算法並用,這些將在後續的aitanjupt文章中詳述。

5、綜上所述

也就是說,「購買了該寶貝的人32%還購買了某某商品」就是使用商品關聯規則挖掘實現的;還有一些捆綁銷售,例如牙膏和牙刷一塊兒賣,尿布和啤酒放在一塊兒賣。

關聯規則挖掘算法不僅是能用在商品銷售,使用它咱們能夠挖掘出更多的關聯關係,好比咱們能夠挖掘出,溫度、天氣、性別等等與心情之間是否有關聯關係,這是很是有意義的。

關聯規則挖掘算法應用場景很是龐大,遙記多年前作的手機用戶關聯分析,那時還沒有用到關聯規則挖掘算法,用的是本身編寫的類join算法,如今看起來,關聯規則挖掘算法是再適合不過的了。

mllib

上面是mllib下全部的算法。
某一數據挖掘算法能夠作某種特定的分析,也能夠跨界使用,還能夠聯合應用,重要的是理解其思想以靈活運用。

幸福是有一顆感恩的心,健康的身體,趁心的工做,一位深愛你的人,一幫信賴的朋友!
祝你們小年快樂!


做者 @王安琪
個人頭像 http://www.cnblogs.com/wgp13x/ 2016 年 02月 02日

相關文章
相關標籤/搜索