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

来源:http://www.cnblogs.com/wgp13x/archive/2016/02/02/5176980.html
-Advertisement-
Play Games

關聯規則的目的就是在一個數據集中找出項與項之間的關係,適用於在大數量的項集中發現關聯共現的項。也被稱為購物籃分析 (Market Basket analysis),因為“購物籃分析”很貼切的表達了適用該演算法情景中的一個子集。購物網站里你買了一個商品,旁邊列出一系列買過該商品的人還買的其他商品,並且按...


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

[TOC]


〇、簡介

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

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

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

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

一、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演算法的優化。

二、MLlib實現

spark-1.2.0 版本中Mliib的FPGrowthModel並沒有generateAssociationRules(minConfidence)方法。因此要引用高版本的jar包,併在提交任務時指定才行。這是可以實現的。

Ⅰ、獲取購買歷史數據

下麵共選取了6931條購買歷史記錄,作為關聯規則挖掘的數據集。

1、產生源數據

我們可能需要使用類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

2、構造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。

三、提交任務

Ⅰ、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

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

在實際情況中,真實的業務數據處處都是雜訊。活用數據,設計有業務含義的特征體系,是構造魯棒模型的基礎!

具體的解決辦法,我們可以多演算法並用,這些將在後續的aitanjupt文章中詳述。

五、綜上所述

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

關聯規則挖掘演算法不只是能用在商品銷售,使用它我們可以挖掘出更多的關聯關係,比如我們可以挖掘出,溫度、天氣、性別等等與心情之間是否有關聯關係,這是非常有意義的。

關聯規則挖掘演算法應用場景非常龐大,遙記多年前做的手機用戶關聯分析,那時尚未用到關聯規則挖掘演算法,用的是自己編寫的類join演算法,現在看起來,關聯規則挖掘演算法是再適合不過的了。

mllib

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

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


作者 @王安琪
我的頭像
http://www.cnblogs.com/wgp13x/
2016 年 02月 02日


您的分享是我們最大的動力!

-Advertisement-
Play Games
更多相關文章
  • 本文內容 創建 MySQL 用戶和組 解壓 MySQL 源代碼包 生成配置安裝文件 編譯和安裝 MySQL 配置文件 創建 MySQL 授權表 授權 啟動 MySQL 驗證安裝 設置訪問許可權 MySQL 開機自動啟動 最近做項目,出了一個事:之前我是用 Oracle 的,如果在 Windows 環境
  • CREATE OR REPLACE PACKAGE BODY BASE_INFO AS PROCEDURE insert_lapc(lapc In lapc_array) AS v_max number; v_result number; v_status number; BEGIN delete
  • a.安裝 本人下載的是windows版本的3.2.1mongo,路徑為https://fastdl.mongodb.org/win32/mongodb-win32-x86_64-2008plus-ssl-3.2.1-signed.msi 或者直接去官網也可以http://www.mongodb.or
  • Redis 持久化 Redis 提供了不同持久化範圍的選項: RDB 持久化以指定的時間間隔執行數據集的即時點(point-in-time)快照。 AOF 持久化在服務端記錄每次收到的寫操作,在伺服器啟動時會重放,以重建原始數據集。命令使用和 Redis 協議一樣的格式以追加的方式來記錄。當文件太大
  • dos中MySQL安裝服務成功--啟動服務成功--登錄MySQL成功後輸入:select version(); 如圖:
  • 之前現場反饋一個數據更新的問題,查看感覺是因為表空間滿了導致的(錯誤在之前的博客隨筆中寫過),因此遠程對伺服器進行查看。個人平常都是通過Oracle客戶端的Entreprise Manager Console進行查看的,但是發現伺服器上只安裝了Oracle服務端並且不能正常進行網頁登錄查看。 因此到
  • mysql,數據類型優先順序,不同類型比較
  • 版本是:Mongodb 3.2.1 本來是想用python做個爬蟲然後爬取一些數據放到資料庫上的,想著想著以為NoSQL會很流行,就用了Mongodb,結果,一折騰真是不容易。 遇到的第一個問題:官網上下載還有安裝什麼的就不說了。之後就遇到了Mongodb閃退的問題,沒有理,百度找資料直接做,把Mo
一周排行
    -Advertisement-
    Play Games
  • 示例項目結構 在 Visual Studio 中創建一個 WinForms 應用程式後,項目結構如下所示: MyWinFormsApp/ │ ├───Properties/ │ └───Settings.settings │ ├───bin/ │ ├───Debug/ │ └───Release/ ...
  • [STAThread] 特性用於需要與 COM 組件交互的應用程式,尤其是依賴單線程模型(如 Windows Forms 應用程式)的組件。在 STA 模式下,線程擁有自己的消息迴圈,這對於處理用戶界面和某些 COM 組件是必要的。 [STAThread] static void Main(stri ...
  • 在WinForm中使用全局異常捕獲處理 在WinForm應用程式中,全局異常捕獲是確保程式穩定性的關鍵。通過在Program類的Main方法中設置全局異常處理,可以有效地捕獲並處理未預見的異常,從而避免程式崩潰。 註冊全局異常事件 [STAThread] static void Main() { / ...
  • 前言 給大家推薦一款開源的 Winform 控制項庫,可以幫助我們開發更加美觀、漂亮的 WinForm 界面。 項目介紹 SunnyUI.NET 是一個基於 .NET Framework 4.0+、.NET 6、.NET 7 和 .NET 8 的 WinForm 開源控制項庫,同時也提供了工具類庫、擴展 ...
  • 說明 該文章是屬於OverallAuth2.0系列文章,每周更新一篇該系列文章(從0到1完成系統開發)。 該系統文章,我會儘量說的非常詳細,做到不管新手、老手都能看懂。 說明:OverallAuth2.0 是一個簡單、易懂、功能強大的許可權+可視化流程管理系統。 有興趣的朋友,請關註我吧(*^▽^*) ...
  • 一、下載安裝 1.下載git 必須先下載並安裝git,再TortoiseGit下載安裝 git安裝參考教程:https://blog.csdn.net/mukes/article/details/115693833 2.TortoiseGit下載與安裝 TortoiseGit,Git客戶端,32/6 ...
  • 前言 在項目開發過程中,理解數據結構和演算法如同掌握蓋房子的秘訣。演算法不僅能幫助我們編寫高效、優質的代碼,還能解決項目中遇到的各種難題。 給大家推薦一個支持C#的開源免費、新手友好的數據結構與演算法入門教程:Hello演算法。 項目介紹 《Hello Algo》是一本開源免費、新手友好的數據結構與演算法入門 ...
  • 1.生成單個Proto.bat內容 @rem Copyright 2016, Google Inc. @rem All rights reserved. @rem @rem Redistribution and use in source and binary forms, with or with ...
  • 一:背景 1. 講故事 前段時間有位朋友找到我,說他的窗體程式在客戶這邊出現了卡死,讓我幫忙看下怎麼回事?dump也生成了,既然有dump了那就上 windbg 分析吧。 二:WinDbg 分析 1. 為什麼會卡死 窗體程式的卡死,入口門檻很低,後續往下分析就不一定了,不管怎麼說先用 !clrsta ...
  • 前言 人工智慧時代,人臉識別技術已成為安全驗證、身份識別和用戶交互的關鍵工具。 給大家推薦一款.NET 開源提供了強大的人臉識別 API,工具不僅易於集成,還具備高效處理能力。 本文將介紹一款如何利用這些API,為我們的項目添加智能識別的亮點。 項目介紹 GitHub 上擁有 1.2k 星標的 C# ...