大數據挖掘: 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
  • 移動開發(一):使用.NET MAUI開發第一個安卓APP 對於工作多年的C#程式員來說,近來想嘗試開發一款安卓APP,考慮了很久最終選擇使用.NET MAUI這個微軟官方的框架來嘗試體驗開發安卓APP,畢竟是使用Visual Studio開發工具,使用起來也比較的順手,結合微軟官方的教程進行了安卓 ...
  • 前言 QuestPDF 是一個開源 .NET 庫,用於生成 PDF 文檔。使用了C# Fluent API方式可簡化開發、減少錯誤並提高工作效率。利用它可以輕鬆生成 PDF 報告、發票、導出文件等。 項目介紹 QuestPDF 是一個革命性的開源 .NET 庫,它徹底改變了我們生成 PDF 文檔的方 ...
  • 項目地址 項目後端地址: https://github.com/ZyPLJ/ZYTteeHole 項目前端頁面地址: ZyPLJ/TreeHoleVue (github.com) https://github.com/ZyPLJ/TreeHoleVue 目前項目測試訪問地址: http://tree ...
  • 話不多說,直接開乾 一.下載 1.官方鏈接下載: https://www.microsoft.com/zh-cn/sql-server/sql-server-downloads 2.在下載目錄中找到下麵這個小的安裝包 SQL2022-SSEI-Dev.exe,運行開始下載SQL server; 二. ...
  • 前言 隨著物聯網(IoT)技術的迅猛發展,MQTT(消息隊列遙測傳輸)協議憑藉其輕量級和高效性,已成為眾多物聯網應用的首選通信標準。 MQTTnet 作為一個高性能的 .NET 開源庫,為 .NET 平臺上的 MQTT 客戶端與伺服器開發提供了強大的支持。 本文將全面介紹 MQTTnet 的核心功能 ...
  • Serilog支持多種接收器用於日誌存儲,增強器用於添加屬性,LogContext管理動態屬性,支持多種輸出格式包括純文本、JSON及ExpressionTemplate。還提供了自定義格式化選項,適用於不同需求。 ...
  • 目錄簡介獲取 HTML 文檔解析 HTML 文檔測試參考文章 簡介 動態內容網站使用 JavaScript 腳本動態檢索和渲染數據,爬取信息時需要模擬瀏覽器行為,否則獲取到的源碼基本是空的。 本文使用的爬取步驟如下: 使用 Selenium 獲取渲染後的 HTML 文檔 使用 HtmlAgility ...
  • 1.前言 什麼是熱更新 游戲或者軟體更新時,無需重新下載客戶端進行安裝,而是在應用程式啟動的情況下,在內部進行資源或者代碼更新 Unity目前常用熱更新解決方案 HybridCLR,Xlua,ILRuntime等 Unity目前常用資源管理解決方案 AssetBundles,Addressable, ...
  • 本文章主要是在C# ASP.NET Core Web API框架實現向手機發送驗證碼簡訊功能。這裡我選擇是一個互億無線簡訊驗證碼平臺,其實像阿裡雲,騰訊雲上面也可以。 首先我們先去 互億無線 https://www.ihuyi.com/api/sms.html 去註冊一個賬號 註冊完成賬號後,它會送 ...
  • 通過以下方式可以高效,並保證數據同步的可靠性 1.API設計 使用RESTful設計,確保API端點明確,並使用適當的HTTP方法(如POST用於創建,PUT用於更新)。 設計清晰的請求和響應模型,以確保客戶端能夠理解預期格式。 2.數據驗證 在伺服器端進行嚴格的數據驗證,確保接收到的數據符合預期格 ...