日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Apache Mahout:适合所有人的可扩展机器学习框架

發(fā)布時(shí)間:2023/12/31 编程问答 33 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Apache Mahout:适合所有人的可扩展机器学习框架 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文鏈接:http://blog.csdn.net/gdp5211314/article/details/7173505

簡(jiǎn)介:?Apache Mahout 專家 Grant Ingersoll 引領(lǐng)您快速了解最新版本 Mahout 中的機(jī)器學(xué)習(xí)庫(kù),并通過示例說明如何部署和擴(kuò)展 Mahout 的某些最常用的算法。

在軟件的世界中,兩年就像是無比漫長(zhǎng)的時(shí)光。在過去兩年中,我們看到了社交媒體的風(fēng)生水起、大規(guī)模集群計(jì)算的商業(yè)化(歸功于 Amazon 和 RackSpace 這樣的參與者),也看到了數(shù)據(jù)的迅猛增長(zhǎng)以及我們?cè)忈屵@些數(shù)據(jù)的能力的顯著提升。“Apache Mahout 簡(jiǎn)介” 最初在 developerWorks 上發(fā)表也已經(jīng)是兩年之前的事情。這之后,Mahout 社區(qū)(以及項(xiàng)目的代碼庫(kù)和功能)取得了長(zhǎng)足的發(fā)展。Mahout 也得到了全球各地各種規(guī)模的企業(yè)的積極采用。

在我撰寫的?Apache Mahout 簡(jiǎn)介?中,我介紹了許多機(jī)器學(xué)習(xí)的概念以及使用 Mahout 提供的一套算法的基礎(chǔ)知識(shí)。我在那篇文章中介紹的概念仍然有效,但這套算法已經(jīng)發(fā)生了顯著的變化。這篇文章不會(huì)重述基礎(chǔ)知識(shí),而是重點(diǎn)關(guān)注 Mahout 的當(dāng)前狀態(tài),以及如何利用 Amazon 的 EC2 服務(wù)和包含 700 萬個(gè)電子郵件文檔的數(shù)據(jù)集在一個(gè)計(jì)算集群上擴(kuò)展 Mahout。如需回顧基礎(chǔ)知識(shí),請(qǐng)參閱?參考資料?部分,特別是《Mahout 實(shí)戰(zhàn)》?一書。此外,我假設(shè)讀者具備 Apache Hadoop 和 Map-Reduce 范式方面的基本知識(shí)。(有關(guān) Hadoop 的更多信息,請(qǐng)參閱?參考資料?部分。)

Mahout 現(xiàn)狀

Mahout 在極短的時(shí)間內(nèi)取得了長(zhǎng)足的發(fā)展。項(xiàng)目的關(guān)注點(diǎn)仍然可以歸納為我所說的 “3 個(gè)要點(diǎn)”:協(xié)同過濾(推薦機(jī)制)、聚類和分類。除此之外,這個(gè)項(xiàng)目還增加了其他一些功能。我將重點(diǎn)強(qiáng)調(diào)兩個(gè)領(lǐng)域中的一些關(guān)鍵擴(kuò)展和改進(jìn):機(jī)器學(xué)習(xí)的核心算法(實(shí)現(xiàn)),以及包括輸入/輸出工具、與其他庫(kù)的集成點(diǎn)和更多參考示例的支持基礎(chǔ)架構(gòu)。然而,務(wù)必注意,本文對(duì)于現(xiàn)狀的敘述并不完整。此外,由于篇幅有限,我只能通過寥寥數(shù)語簡(jiǎn)單介紹各項(xiàng)改進(jìn)。建議讀者閱讀 Mahout 網(wǎng)站的“新聞”部分和各 Mahout 發(fā)布版的發(fā)布說明,以了解這方面的更多信息。

算法,算法,還是算法

只要嘗試解決過機(jī)器學(xué)習(xí)問題,您就應(yīng)該認(rèn)識(shí)到,沒有任何一種能夠適合所有情況的萬能算法。為此,Mahout 添加了眾多新實(shí)現(xiàn)。表 1 包含我總結(jié)出的 Mahout 中最重要的新算法實(shí)現(xiàn),還列舉了一些用例示例。在這篇文章稍后的內(nèi)容中,我將實(shí)際運(yùn)用其中的幾個(gè)算法。


表 1. Mahout 中的新算法
算法簡(jiǎn)要描述用例
邏輯回歸,使用隨機(jī)梯度下降法 (SGD) 求解 速度超快、簡(jiǎn)單的順序分類器,能夠在要求嚴(yán)格的環(huán)境中實(shí)現(xiàn)在線學(xué)習(xí) 為用戶推薦廣告,將文本分類為多種類別
隱藏式馬可夫模型 (HMM) 經(jīng)典分類算法的順序和并行實(shí)現(xiàn),設(shè)計(jì)用于在基本生成過程不可知的情況下建模實(shí)際過程。 文本詞類標(biāo)注、語音識(shí)別
奇異值分解 (SVD) 旨在減少大型矩陣內(nèi)的噪聲,使噪音更小、更容易處理 作為聚類、推薦機(jī)制和分類的前導(dǎo),自動(dòng)執(zhí)行特性選擇
狄利克雷聚類 基于模型的聚類方法,根據(jù)數(shù)據(jù)是否適合基本模型來確定從屬關(guān)系 在數(shù)據(jù)存在重疊或?qū)哟螘r(shí)非常有用
譜聚類 一系列類似的方法,使用基于圖形的方法來確定聚類從屬關(guān)系 與所有聚類算法相似,適用于探索大規(guī)模、不可見的數(shù)據(jù)集
Minhash 聚類 利用散列戰(zhàn)略,將類似的項(xiàng)目組織在一起,從而生成聚類 與其他聚類方法相同
大量推薦機(jī)制改進(jìn) 分布式共生、SVD、交替最小二乘法 交友網(wǎng)站、電子商務(wù)、電影或書籍推薦
并置 支持 “Map-Reduce” 的并置實(shí)現(xiàn) 以統(tǒng)計(jì)學(xué)的方式在文本中查找關(guān)注的詞組

Mahout 還新增了對(duì)用戶極為有用的大量低級(jí)數(shù)學(xué)算法(請(qǐng)參見數(shù)學(xué)包),表 1 所述算法使用了其中的許多低級(jí)數(shù)學(xué)算法,但這些低級(jí)數(shù)學(xué)算法是為一般用途設(shè)計(jì)的,因此有可能也適合您的需要。

改進(jìn)和擴(kuò)展 Mahout 的基礎(chǔ)架構(gòu)

Mahout 命令行

不久之前,Mahout 發(fā)布了一個(gè) shell 腳本,處理類路徑、環(huán)境變量和其他設(shè)置項(xiàng),從而使 Mahout 程序(包含main()?的 Mahout 程序)的運(yùn)行更加輕松。該腳本 — 名為 mahout — 位于 $MAHOUT_HOME/bin 目錄中。

利用開放源碼項(xiàng)目并竭力使項(xiàng)目的代碼與自己的代碼協(xié)同工作的人越多,基礎(chǔ)架構(gòu)就越充實(shí)。對(duì)于 Mahout 來說,這種演進(jìn)方式促成了多項(xiàng)改進(jìn)。最顯著的一項(xiàng)就是經(jīng)過重大改進(jìn)、一致的命令行界面,它使得在本地和 Apache Hadoop 上提交和運(yùn)行任務(wù)更加輕松。這個(gè)新腳本位于 Mahout 頂層目錄(下文中將稱之為 $MAHOUT_HOME)下的 bin 目錄中。(請(qǐng)參閱側(cè)欄中的?Mahout 命令行。)

任何機(jī)器學(xué)習(xí)庫(kù)都有兩個(gè)關(guān)鍵組件,即可靠的數(shù)學(xué)庫(kù)和一個(gè)有效的集合包。數(shù)學(xué)庫(kù)(位于 $MAHOUT_HOME 下的數(shù)學(xué)模塊中)提供了多種功能:范圍從表示向量、矩陣的數(shù)據(jù)結(jié)構(gòu)、操作這些數(shù)據(jù)結(jié)構(gòu)的相關(guān)操作符一直到生成隨機(jī)數(shù)的工具和對(duì)數(shù)似然值等有用的統(tǒng)計(jì)數(shù)據(jù)(請(qǐng)參閱?參考資料)。Mahout 的集合庫(kù)包含的數(shù)據(jù)結(jié)構(gòu)與 Java 集合提供的數(shù)據(jù)結(jié)構(gòu)相似(Map、List?等),不同之處在于它們?cè)刂С?Java 原語,例如?int、float?和?double,而非其?Object?對(duì)應(yīng)部分?Integer、Float?和?Double。這一點(diǎn)非常重要,因?yàn)樵谔幚頁(yè)碛袛?shù)百萬項(xiàng)特征的數(shù)據(jù)集時(shí),需要精打細(xì)算地考慮每個(gè)位。此外,在較大的規(guī)模上,原語及其?Object?對(duì)應(yīng)部分之間的封包成本將成為嚴(yán)重的問題。

Mahout 還引入了一種新的集成模塊,其中包含的代碼旨在補(bǔ)充或擴(kuò)展 Mahout 的核心功能,但并非所有用戶在所有情況下都需要使用這種模塊。例如,推薦機(jī)制(協(xié)同過濾)代碼現(xiàn)在支持將其模型存儲(chǔ)在數(shù)據(jù)庫(kù)(通過 JDBC)、MongoDB 或 Apache Cassandra 中(請(qǐng)參閱?參考資料?部分)。集成模塊還包含多種將數(shù)據(jù)轉(zhuǎn)為 Mahout 格式的機(jī)制,以及評(píng)估所得到的結(jié)果的機(jī)制。例如,其中包含可將充存滿文本文件的目錄轉(zhuǎn)為 Mahout 向量格式的工具(請(qǐng)參閱集成模塊內(nèi)的?org.apache.mahout.text?包)。

最后,Mahout 提供了大量新示例,包括通過 Netfix 數(shù)據(jù)集計(jì)算推薦內(nèi)容、聚類 Last.fm 音樂以及其他許多示例。此外,我為這篇文章開發(fā)的示例也添加了 Mahout 的代碼庫(kù)。建議您抽出一些時(shí)間,進(jìn)一步研究一下示例模塊(位于 $MAHOUT_HOME/examples 中)。

現(xiàn)在,您已經(jīng)了解了 Mahout 的現(xiàn)狀,下面我們將深入探究主要內(nèi)容:如何外擴(kuò) Mahout。

在云中擴(kuò)展 Mahout

使 Mahout 有效實(shí)現(xiàn)擴(kuò)展并不容易,無法通過簡(jiǎn)單地為 Hadoop 集群添加更多節(jié)點(diǎn)來實(shí)現(xiàn)此擴(kuò)展。在決定 Mahout 能否能夠有效進(jìn)行擴(kuò)展時(shí),算法選擇、節(jié)點(diǎn)數(shù)量、特性選擇和數(shù)據(jù)的稀疏性等因素(以及內(nèi)存、帶寬和處理器速度這些常見要素)扮演著至關(guān)重要的角色。為了便于討論,我將演示一個(gè)示例,合理地利用 Amazon 的 EC2 計(jì)算基礎(chǔ)架構(gòu)和 Hadoop(請(qǐng)參閱?參考資料),對(duì) Apache Software Foundation (ASF) 提供的一個(gè)公共郵件存檔數(shù)據(jù)集運(yùn)行某些 Mahout 算法。

在 “設(shè)置” 小節(jié)之后的每一小節(jié)中都會(huì)探討外擴(kuò) Mahout 的部分關(guān)鍵問題,并研究在 EC2 上運(yùn)行示例的語法。

設(shè)置

示例的設(shè)置包括兩個(gè)部分:一個(gè)本地設(shè)置和一個(gè) EC2(云)設(shè)置。要運(yùn)行示例,您需要:

  • Apache Maven?3.0.2 或更高的版本。
  • Git?版本控制系統(tǒng)(您可能還需要一個(gè)?Github?帳戶)。
  • 一個(gè)基于 *NIX 的操作系統(tǒng),例如 Linux 或 Apple OS X。Cygwin 可在 Windows? 中正常工作,但我沒有做過這方面的測(cè)試。
  • 為了實(shí)現(xiàn)本地設(shè)置,請(qǐng)?jiān)诿钚兄羞\(yùn)行以下命令:

  • mkdir -p scaling_mahout/data/sample
  • git clone git://github.com/lucidimagination/mahout.git mahout-trunk
  • cd mahout-trunk
  • mvn install(Mahout 的測(cè)試需要一定的運(yùn)行時(shí)間,如果希望跳過該測(cè)試,請(qǐng)?zhí)砑右粋€(gè)?-DskipTests)
  • cd bin
  • /mahout(您應(yīng)看到可運(yùn)行的項(xiàng)目清單,例如?kmeans)
  • 這將編譯并恰當(dāng)?shù)匕惭b您需要的全部代碼。單獨(dú)?下載示例數(shù)據(jù),將其保存在 scaling_mahout/data/sample 目錄中,并解壓縮(tar -xf scaling_mahout.tar.gz)。出于測(cè)試方面的目的,這里僅包含將在 EC2 上使用的一個(gè)較小的數(shù)據(jù)子集。

    為完成 Amazon 設(shè)置,您需要提供一個(gè)?Amazon Web 服務(wù)?(AWS) 帳戶(請(qǐng)注意安全密鑰、訪問密鑰和帳戶 ID),還需要對(duì) Amazon 的 EC2 和 Elastic Block Store (EBS) 服務(wù)的工作原理有一定的了解。按照 Amazon 網(wǎng)站上的文檔說明,獲得必要的訪問權(quán)限。

    滿足了先決條件之后,即可啟動(dòng)集群。最佳做法或許是從單獨(dú)一個(gè)節(jié)點(diǎn)開始,然后根據(jù)需要添加更多的節(jié)點(diǎn)。當(dāng)然需要注意,在 EC2 上運(yùn)行需要付費(fèi)。因此請(qǐng)務(wù)必在運(yùn)行完成后關(guān)閉節(jié)點(diǎn)。

    要啟動(dòng)一個(gè)集群,以便使用本文中的示例,請(qǐng)按以下步驟操作:

  • 從一個(gè) ASF 鏡像?下載?Hadoop 0.20.203.0,并在本地解壓縮。
  • cd hadoop-0.20.203.0/src/contrib/ec2/bin
  • 在編輯器中打開 hadoop-ec2-env.sh,并執(zhí)行以下操作:
  • 填寫您的?AWS_ACCOUNT_ID、AWS_ACCESS_KEY_ID、AWS_SECRET_ACCESS_KEY、EC2_KEYDIR、KEY_NAME?和PRIVATE_KEY_PATH。如需了解更多信息,請(qǐng)參見 Mahout Wiki 中的 “使用現(xiàn)有 Hadoop AMI” 頁(yè)面(請(qǐng)參閱?參考資料部分)。
  • 將?HADOOP_VERSION?設(shè)置為?0.20.203.0。
  • 將?S3_BUCKET?設(shè)置為?490429964467。
  • 設(shè)置?ENABLE_WEB_PORTS=true。
  • 設(shè)置?INSTANCE_TYPE,至少應(yīng)設(shè)置為?m1.xlarge。
  • 在編輯器中打開 hadoop-ec2-init-remote.sh,并執(zhí)行以下操作:
  • 在創(chuàng)建 hadoop-site.xml 的部分中,添加以下屬性:
    <span style="font-family:Times New Roman;font-size:12px;"><property> <name>mapred.child.java.opts></name> <value>-Xmx8096m></value> </property> </span>

    注意:如果希望運(yùn)行分類,則需要使用更大的實(shí)例和更多的內(nèi)存。我使用了兩個(gè) X-Large 實(shí)例和 12 GB 的 Java Heap 值。
  • 將?mapred.output.compress?更改為?false。
  • 啟動(dòng)您的集群:
    <span style="font-family:Times New Roman;font-size:12px;">./hadoop-ec2 launch-cluster mahout-clustering <em>X</em></span>

    X?是您希望啟動(dòng)的節(jié)點(diǎn)數(shù)量(例如?2?或?10)。建議先使用較小的值,在熟悉之后添加更多節(jié)點(diǎn)。這種做法有助于控制成本。
  • 為 ASF 公共數(shù)據(jù)集創(chuàng)建一個(gè) EBS 卷(快照:snap--17f7f476),將其附加到 /dev/sdh 中的主節(jié)點(diǎn)實(shí)例(這是 mahout-clustering-master 安全組中的實(shí)例)。(參考資料?部分中提供了 EC2 在線文檔內(nèi)具體指南的鏈接。)
  • 如果使用的是 EC2 命令行 API(請(qǐng)參閱?參考資料?部分),則可執(zhí)行:
  • ec2-create-volume --snapshot snap-17f7f476 --z ZONE
  • ec2-attach-volume $VOLUME_NUMBER -i $INSTANCE_ID -d /dev/sdh,其中?$VOLUME_NUMBER?是 create-volume 步驟的輸出,$INSTANCE_ID?是 launch-cluster 命令啟動(dòng)的主節(jié)點(diǎn)的 ID
  • 此外,也可以通過 AWS Web 控制臺(tái)完成此任務(wù)。
  • 將 setup-asf-ec2.sh 腳本(請(qǐng)參閱?下載?部分)上傳到主實(shí)例:
    <span style="font-family:Times New Roman;font-size:12px;">./hadoop-ec2 push mahout-clustering $PATH/setup-asf-ec2.sh</span>

  • 登錄您的集群:
    <span style="font-family:Times New Roman;font-size:12px;">./hadoop-ec2 login mahout-clustering</span>

  • 執(zhí)行 shell 腳本來更新系統(tǒng)、安裝 Git 和 Mahout,并清除部分存檔,以使之更易于運(yùn)行:
    <span style="font-family:Times New Roman;font-size:12px;">./setup-asf-ec2.sh</span>

  • 完成具體設(shè)置之后,下一步我們來看看如何運(yùn)用一些較為流行的 Mahout 算法,并對(duì)其進(jìn)行上擴(kuò)。我主要關(guān)注的是上擴(kuò)的實(shí)際任務(wù),但在此過程中也會(huì)介紹有關(guān)特性選擇的一些問題,以及做出某些特定選擇的原因。

    推薦

    協(xié)同過濾是 Mahout 最流行、最易用的功能之一,因此也是討論如何外擴(kuò) Mahout 的合理起點(diǎn)。再次提醒,我們使用的是來自 ASF 的郵件存檔。對(duì)于推薦任務(wù)來說,一種有趣的可能性就是搭建一個(gè)系統(tǒng),根據(jù)其他用戶已經(jīng)閱讀過的郵件線程向一名用戶推薦他可能會(huì)感興趣的郵件線程。為將作為協(xié)同過濾問題處理,我將定義一個(gè)項(xiàng),系統(tǒng)會(huì)根據(jù)郵件標(biāo)頭中的消息 ID 和引用,確定是否將其作為郵件線程進(jìn)行推薦。用戶將由郵件消息中的 “發(fā)件人” 地址定義。換句話說,我關(guān)心的是誰發(fā)出或回復(fù)了一個(gè)郵件消息。至于偏好本身的值,我直接將與郵件線程的交互作為一個(gè)布爾偏好處理:如果用戶 X 與線程 Y 交互,則偏好值為 on;否則為 off。這種選擇唯一的負(fù)面效應(yīng)就是我們必須使用可處理布爾偏好的似然性指標(biāo),例如 Tanimoto 似然法或?qū)?shù)似然法 (log-likelihood)。這通常能加快計(jì)算速度,并且可能減少系統(tǒng)內(nèi)的噪聲,但您的經(jīng)歷可能有所不同,所以您可能希望嘗試使用不同的權(quán)重。

    線程、消息 ID、避免好高騖遠(yuǎn)

    請(qǐng)注意,我處理消息線程的方法并不完美,存在郵件列表中常見的線程劫持 (thread hijacking)。線程劫持的含義是,某人通過回復(fù)郵件列表中已有消息的方式發(fā)出新消息(即具有新主題/話題的消息),附帶傳遞了原始消息引用內(nèi)容。這篇文章沒有嘗試解決這個(gè)問題,而是直接選擇忽略,但實(shí)際解決方案可能需要正面解決此問題。因此,我選擇了 “足夠好” 的方法,力求完美。

    協(xié)同過濾方面的特性選擇較為簡(jiǎn)單(用戶、項(xiàng)、可選偏好),因此我們可以跳過這一步,直接介紹如何從原始郵件存檔中獲取在本地運(yùn)行的內(nèi)容,然后再在云中運(yùn)行。請(qǐng)注意,在很多情況下,最后一步通常不是必需的,因?yàn)樵趩为?dú)一臺(tái)機(jī)器上可足夠快地獲得結(jié)果,沒有必要引入 Hadoop 使問題復(fù)雜化。按照大致估算,Mahout 社區(qū)基準(zhǔn)測(cè)試表明可在單獨(dú)一個(gè)節(jié)點(diǎn)上為多達(dá) 1 億名用戶提供推薦。電子郵件數(shù)據(jù)達(dá)不到如此之多的項(xiàng)數(shù)(約為 700 萬條消息),但無論如何,我仍會(huì)繼續(xù)在 Hadoop 上運(yùn)行它。

    為了查看代碼的實(shí)際效果,我在 $MAHOUT_HOME/examples/bin/build-asf-email.sh 文件中的 shell 腳本內(nèi)打包了必要的步驟。請(qǐng)執(zhí)行這個(gè) shell 腳本,傳遞您的輸入數(shù)據(jù)位置和所需的結(jié)果輸出位置,例如:

    <span style="font-family:Times New Roman;font-size:12px;">./build-asf-email.sh ./scaling_mahout/data/sample/content ./scaling_mahout/output/</span>

    看到提示時(shí),選擇?recommender(選項(xiàng) 1),靜候 Mahout 和 Hadoop 冗長(zhǎng)的日志輸出完成。完成后,您將看到類似清單 1 所示的內(nèi)容:


    清單 1. 運(yùn)行推薦機(jī)制代碼的輸出示例?
    <span style="font-family:Times New Roman;font-size:12px;"> 11/09/08 09:57:37 INFO mapred.JobClient: Reduce output records=2072 11/09/08 09:57:37 INFO mapred.JobClient: Spilled Records=48604 11/09/08 09:57:37 INFO mapred.JobClient: Map output bytes=10210854 11/09/08 09:57:37 INFO mapred.JobClient: Combine input records=0 11/09/08 09:57:37 INFO mapred.JobClient: Map output records=24302 11/09/08 09:57:37 INFO mapred.JobClient: SPLIT_RAW_BYTES=165 11/09/08 09:57:37 INFO mapred.JobClient: Reduce input records=24302 11/09/08 09:57:37 INFO driver.MahoutDriver: Program took 74847 ms </span>

    此作業(yè)的結(jié)果是面向輸入數(shù)據(jù)內(nèi)所有用戶的全部推薦。結(jié)果存儲(chǔ)在輸出目錄的子目錄 prefs/recommendations 中,包含名稱以 part-r- 開頭的一個(gè)或多個(gè)文本文件。(這就是 Hadoop 輸出文件的方式。)查看其中的一個(gè)文件即可注意到推薦已格式化為以下形式(同時(shí)還有一條警告):

    <span style="font-family:Times New Roman;font-size:12px;"> <em>user_id</em> [<em>item_id</em>:<em>score</em>, <em>item_id</em>:<em>score</em>, ...]</span>

    例如,用戶 ID 25 具有針對(duì)電子郵件 ID 26295 和 35548 的推薦。警告指出,user_id?和?item_id?并非原始 ID,而是從原始 ID 映射而來的整數(shù)。為幫助您理解這樣做的原因,我將解釋一下在執(zhí)行 shell 腳本時(shí)實(shí)際發(fā)生的情況。

    在生成推薦結(jié)果的過程中,涉及三個(gè)步驟:

  • 使用 Mahout 的?SequenceFilesFromMailArchives,將原始 mbox 文件轉(zhuǎn)換為 Hadoop 的?SequenceFile?格式。
  • 從消息中提取消息 ID 和 From 簽名,并以 Mahout 能夠理解的格式輸出結(jié)果。
  • 運(yùn)行 Mahout 的?RecommenderJob?類。
  • 本文不會(huì)詳細(xì)介紹第 1 步,只建議對(duì)此感興趣的讀者參閱代碼。

    對(duì)于第 2 步,需要花一些工夫從文件中提取相關(guān)的信息片段(消息 ID、回復(fù)引用和 From 地址),隨后以三元組(FromID、Message-ID、偏好)的形式存儲(chǔ)它們,以供?RecommenderJob?使用。此過程由?MailToPrefsDriver?驅(qū)動(dòng),其中包含三個(gè) “Map-Reduce” 作業(yè):

  • 創(chuàng)建一個(gè)字典,將基于字符串的 Message-ID 映射為唯一的?long?值。
  • 創(chuàng)建一個(gè)字典,將基于字符串的 From 電子郵件地址映射為唯一的?long?值。
  • 提取 Message-ID、References 和 From;使用第 1 步和第 2 步中創(chuàng)建的字典將其映射為?long?值,將三元組輸出到一個(gè)文本文件中。
  • 完成所有這些操作之后,即可開始生成一些推薦。為了創(chuàng)建推薦,RecommenderJob?將執(zhí)行圖 1 所示的步驟:


    圖 1. 推薦機(jī)制作業(yè)流
    ?

    完成工作流中大部分工作的主要步驟是 “計(jì)算共生(calculate co-occurrences)” 步驟。這個(gè)步驟負(fù)責(zé)在整個(gè)矩陣內(nèi)執(zhí)行成對(duì)比較,尋找共性。除此之外,對(duì)于執(zhí)行矩陣內(nèi)任何行之間的成對(duì)計(jì)算(而不僅僅限于評(píng)分/評(píng)論),這個(gè)步驟(由 Mahout?RowSimilarityJob支持實(shí)現(xiàn))通常也非常有用。

    shell 腳本中使用以下命令調(diào)用了?RecommenderJob:

    <span style="font-family:Times New Roman;font-size:12px;">bin/mahout recommenditembased --input $PREFS_REC_INPUT --output $RECS_OUT --tempDir$PREFS_TMP --similarityClassname SIMILARITY_LOGLIKELIHOOD> </span>

    第一個(gè)參數(shù)告訴 Mahout 要運(yùn)行哪個(gè)命令(RecommenderJob);其他幾個(gè)參數(shù)(input/output/tempDir)的含義不言自明。similarityClassname?告訴 Mahout 在計(jì)算共生時(shí)如何計(jì)算各項(xiàng)之間的似然性。我選擇使用對(duì)數(shù)似然性是因?yàn)樗暮?jiǎn)單性、速度和質(zhì)量。

    獲得結(jié)果之后,下一步就是評(píng)估結(jié)果。Mahout 附帶了一個(gè)評(píng)估包(org.apache.mahout.cf.taste.eval),提供了一些有用的工具,可幫助您檢查結(jié)果的質(zhì)量。遺憾的是,它們無法與基于 Hadoop 的算法一起使用,但在其他一些情況下可能非常有用。這些工具抽出一定百分比的數(shù)據(jù)作為測(cè)試數(shù)據(jù),隨后將這些數(shù)據(jù)與系統(tǒng)生成的數(shù)據(jù)對(duì)比,從而判斷質(zhì)量。

    這就是生成推薦所需的全部操作,這種做法的優(yōu)點(diǎn)在于可以直接在集群上運(yùn)行。為此,請(qǐng)登錄您之前設(shè)置的 EC2 集群,并運(yùn)行與之前相同的 shell 腳本(/mnt/asf-email/mahout-trunk/examples/bin)。在向集群添加節(jié)點(diǎn)時(shí),您應(yīng)看到運(yùn)行這些步驟所需的總時(shí)間縮短了。例如,在本地機(jī)器上運(yùn)行一個(gè)完整的數(shù)據(jù)集需要超過三天的時(shí)間才能完成。在 EC2 上的一個(gè) 10 節(jié)點(diǎn)集群中,運(yùn)行主要推薦任務(wù)加上將電子郵件轉(zhuǎn)換為可用格式的準(zhǔn)備時(shí)間只需約 60 分鐘。

    最后一部分是將推薦作為應(yīng)用程序的一部分使用,這部分留給讀者作為練習(xí)。典型情況下,如果系統(tǒng)中有大量的項(xiàng)和用戶,推薦將定期生成 — 根據(jù)業(yè)務(wù)需求的不同,生成頻率大致為每小時(shí)一次至每天一次。無論如何,如果系統(tǒng)中的用戶和推薦達(dá)到一定的數(shù)量,那么對(duì)所生成的推薦進(jìn)行的更改將會(huì)更加微妙。

    接下來,我們來觀察一下電子郵件消息的分類,在某些情況下,可將此視為一種上下文推薦系統(tǒng)。

    分類

    Mahout 擁有多種分類算法,其中大多數(shù)算法都是為了在 Hadoop 上運(yùn)行而編寫的(只有一個(gè)值得注意的例外,即隨機(jī)梯度下降法)。出于本文的目的,我將使用貝氏分類器 (na?ve bayes classifier),許多人最初都選擇這種分類器,在有效擴(kuò)展的時(shí)候,它也能給出合理的結(jié)果。有關(guān)其他分類器的更多細(xì)節(jié),請(qǐng)參見《Mahout 實(shí)戰(zhàn)》一書中的相關(guān)章節(jié),或者 Mahout wiki 中的 “算法” 部分(請(qǐng)參閱?參考資料?部分)。

    電子郵件文檔按照 Apache 項(xiàng)目(Lucene、Mahout、Tomcat 等)細(xì)分,通常每個(gè)項(xiàng)目有兩個(gè)或兩個(gè)以上的郵件列表(用戶、開發(fā)等等)。考慮到 ASF 電子郵件數(shù)據(jù)集是按照項(xiàng)目分區(qū)的,因此一個(gè)合情合理的分類問題就是:嘗試預(yù)測(cè)一條新傳入的消息應(yīng)交付至哪個(gè)項(xiàng)目。例如,一條新消息是屬于 Lucene 郵件列表還是屬于 Tomcat 郵件列表?

    要使 Mahout 的分類算法發(fā)揮效力,必須實(shí)現(xiàn)一個(gè)表示要識(shí)別的模式的模型,隨后根據(jù)一個(gè)數(shù)據(jù)子集進(jìn)行測(cè)試。在大多數(shù)分類問題中,都必須有一名或多名人員身體力行,手動(dòng)標(biāo)注將要在訓(xùn)練中使用的數(shù)據(jù)子集。但在本文所討論的情況下,數(shù)據(jù)集已經(jīng)按項(xiàng)目進(jìn)行了劃分,因此無需手動(dòng)標(biāo)注,但我要依靠人們?cè)诎l(fā)送電子郵件時(shí)通常能夠選取正確的列表這個(gè)事實(shí),而我們都知道,事情并非總是能這樣順利。

    就像在推薦機(jī)制示例中所介紹的一樣,必要的步驟已經(jīng)預(yù)先打包在 build-asf-email.sh 腳本之中,只要從菜單中選擇選項(xiàng) 3(隨后在出現(xiàn)第二條提示時(shí)選擇選項(xiàng) 2,即標(biāo)準(zhǔn)貝氏分類器)即可執(zhí)行分類。類似于推薦,外擴(kuò)代碼的部分工作是準(zhǔn)備好要使用的數(shù)據(jù)。對(duì)于文本分類,這實(shí)際上意味著對(duì)特性進(jìn)行編碼,隨后根據(jù)特性創(chuàng)建向量,但還包括設(shè)置訓(xùn)練和測(cè)試集。需要執(zhí)行的全部步驟如下:

  • 使用 Mahout 的?SequenceFilesFromMailArchives,將原始 mbox 文件轉(zhuǎn)換為 Hadoop 的?SequenceFile?格式。(請(qǐng)注意,這里的運(yùn)行時(shí)選項(xiàng)略有不同。)
    <span style="font-family:Times New Roman;font-size:12px;">bin/mahout org.apache.mahout.text.SequenceFilesFromMailArchives --charset "UTF-8" --body --subject --input $ASF_ARCHIVES --output $MAIL_OUT </span>

  • 將?SequenceFile?條目轉(zhuǎn)為稀疏向量,并修改標(biāo)簽:
  • bin/mahout seq2sparse --input $MAIL_OUT --output $SEQ2SP --norm 2 --weight TFIDF --namedVector --maxDFPercent 90 --minSupport 2 --analyzerName org.apache.mahout.text.MailArchivesClusteringAnalyzer
  • bin/mahout org.apache.mahout.classifier.email.PrepEmailDriver --input $SEQ2SP --output $SEQ2SPLABEL --maxItemsPerLabel 1000
  • 將輸入拆分為訓(xùn)練(training)集和測(cè)試集:
    <span style="font-family:Times New Roman;font-size:12px;">bin/mahout split --input $SEQ2SPLABEL --trainingOutput $TRAIN --testOutput $TEST--randomSelectionPct 20 --overwrite --sequenceFiles </span>

  • 運(yùn)行貝氏分類器,執(zhí)行訓(xùn)練和測(cè)試:
  • bin/mahout trainnb -i $TRAIN -o $MODEL -extractLabels --labelIndex $LABEL
  • bin/mahout testnb -i $TEST -m $MODEL --labelIndex $LABEL
  • 值得注意的兩個(gè)重要步驟就是第 2 步和第 4 步。第 2a 步是主要的特性選擇和編碼步驟,一系列的輸入?yún)?shù)負(fù)責(zé)控制如何將輸入文本表示為向量中的權(quán)重。表 2 具體列舉了第 2 步中與特性選擇相關(guān)的選項(xiàng):


    表 2. 創(chuàng)建向量時(shí)的特性選擇選項(xiàng)
    選項(xiàng)描述示例和備注
    --norm norm 通過一個(gè)計(jì)算向量長(zhǎng)度的函數(shù) (norm) 來修改所有向量 1 norm = 曼哈頓距離,2 norm = 歐幾里得距離
    --weight 計(jì)算任何給定特性的權(quán)重,并將其作為 TF-IDF(術(shù)語頻率,逆向文檔頻率)或者單純的術(shù)語頻率。 TF-IDF 是搜索和機(jī)器學(xué)習(xí)中常用的權(quán)重模式,通常用于將文本表示為向量。
    --maxDFPercent,?--minSupport 這些選項(xiàng)均用于刪除文檔集合中出現(xiàn)得過于頻繁(最大值)或過于不頻繁的術(shù)語 在自動(dòng)刪除對(duì)于計(jì)算價(jià)值不高的高頻術(shù)語或低頻術(shù)語時(shí)非常有用
    --analyzerName 一個(gè) Apache Lucene 分析器類,可用于對(duì)文檔中的詞執(zhí)行分詞、詞干化、刪除或其他更改 如需進(jìn)一步了解 Lucene,請(qǐng)參閱?參考資料?部分

    第 2a 步中的分析過程值得深究,因?yàn)樗袚?dān)了特性選擇的大部分工作。Lucene?Analyzer?包括一個(gè)?Tokenizer?類以及零個(gè)或多個(gè)TokenFilter?類。Tokenizer?負(fù)責(zé)將原始輸入劃分成零個(gè)或多個(gè)標(biāo)記(例如,單詞)。TokenFilter?實(shí)例彼此連接,隨后修改Tokenizer?生成的標(biāo)記。例如,示例中所用的?Analyzer:

  • 按照空格分詞,此外還會(huì)處理一些標(biāo)點(diǎn)符號(hào)的邊緣情況。
  • 將所有標(biāo)記轉(zhuǎn)為小寫。
  • 將非 ASCII 字符轉(zhuǎn)為 ASCII,盡可能采用轉(zhuǎn)換音調(diào)符號(hào)等方法。
  • 刪除字符數(shù)超過 40 個(gè)的標(biāo)記。
  • 刪除停止詞(請(qǐng)參見代碼中提供的清單,由于內(nèi)容過多,此處不便說明)。
  • 使用 Porter 詞干分析器提取標(biāo)記的詞干(請(qǐng)參閱?參考資料?部分)
  • 這項(xiàng)分析的最終結(jié)果將使各文檔的對(duì)應(yīng)向量顯著減少,并消除向量中可能會(huì)使分類器產(chǎn)生混淆的常見 “噪聲” 詞(the、a、an?等)。這個(gè)?Analyzer?以迭代的方法開發(fā),首先在電子郵件中查找示例,隨后通過?Analyzer?對(duì)其加以處理并檢查輸出,從而判斷處理效果。遺憾的是,這個(gè)流程可以說是科學(xué)的,但也僅僅是一種直觀的體驗(yàn)。流程和結(jié)果并不完美,但足夠好。

    第 2b 步對(duì)數(shù)據(jù)稍加轉(zhuǎn)化以便處理,還刪除了一些內(nèi)容,使各種不同的標(biāo)簽平均地出現(xiàn)在訓(xùn)練數(shù)據(jù)中。這一點(diǎn)非常重要,因?yàn)槲易畛鯂L試處理數(shù)據(jù)時(shí)產(chǎn)生了機(jī)器學(xué)習(xí)中的常見問題,即相關(guān)訓(xùn)練示例過多的標(biāo)簽的過度擬合 (overfitting)。實(shí)際上,對(duì)完整的數(shù)據(jù)集運(yùn)行聚類時(shí),將?--maxItemsPerLabel?的設(shè)置降低至 1000 仍然不夠好,無法得到良好的結(jié)果,因?yàn)椴糠粥]件列表中發(fā)布的內(nèi)容少于 1000。這很可能是由 Mahout 的一個(gè) bug 導(dǎo)致的,社區(qū)目前仍然在對(duì)此進(jìn)行研究。

    第 4 步是執(zhí)行實(shí)際工作的部分,包括構(gòu)建模型和隨后測(cè)試模型是否有效。在第 4a 步中,--extractLabels?選項(xiàng)告訴 Mahout 根據(jù)輸入判斷訓(xùn)練標(biāo)簽。(另外一種做法是直接傳入標(biāo)簽。)這個(gè)步驟的輸出是一個(gè)可通過org.apache.mahout.classifier.naivebayes.NaiveBayesModel?類讀取的文件。第 4b 步獲取模型和測(cè)試數(shù)據(jù),檢查訓(xùn)練成效如何。輸出結(jié)果是一個(gè)混合矩陣,如 “Apache Mahout 簡(jiǎn)介” 一文所述。對(duì)于示例數(shù)據(jù),輸出結(jié)果如清單 2 所示:


    清單 2. 運(yùn)行分類器代碼的輸出示例
    <span style="font-family:Times New Roman;font-size:12px;"> Correctly Classified Instances : 41523 61.9219% Incorrectly Classified Instances : 25534 38.0781% Total Classified Instances : 67057 ======================================================= Confusion Matrix ------------------------------------------------------- a b c d e f ><--Classified as 190440 12 1069 0 0 | 20125 a= cocoon_apache_org_dev 2066 0 1 477 0 0 | 2544 b= cocoon_apache_org_docs 165480 2370 704 0 0 | 19622 c= cocoon_apache_org_users 58 0 0 201090 0 | 20167 d= commons_apache_org_dev 147 0 1 4451 0 0 | 4599 e= commons_apache_org_user </span>

    您應(yīng)注意到,這對(duì)分類器來說實(shí)際上是一種非常糟糕的顯示(盡管好于猜測(cè))。產(chǎn)生這種糟糕的顯示的原因很可能是給定 Apache 項(xiàng)目的用戶和開發(fā)郵件列表的詞匯過于相近,難以區(qū)分。16,548 條 cocoon_user 消息被錯(cuò)誤地分類為 cocoon_dev 即可說明這一點(diǎn)。實(shí)際上,如果直接使用項(xiàng)目名稱重新運(yùn)行任務(wù),而不區(qū)分示例數(shù)據(jù)中的用戶類表和開發(fā)列表,將得到清單 3 所示的結(jié)果:


    清單 3. 僅使用項(xiàng)目名稱重新運(yùn)行分類器代碼的輸出示例
    <span style="font-family:Times New Roman;font-size:12px;"> Correctly Classified Instances : 38944 96.8949% Incorrectly Classified Instances : 1248 3.1051% Total Classified Instances : 40192======================================================= Confusion Matrix ------------------------------------------------------- a b c ><--Classified as 18733 1241 0 | 19974 a = cocoon_apache_org 7 20211 0 | 20218 b = commons_apache_org </span>

    您一定同意,96% 的準(zhǔn)確度比 61% 好太多了!實(shí)際上,該結(jié)果過于完美,不可能是真的。這樣的評(píng)分可能源于這個(gè)特定的小數(shù)據(jù)集的本質(zhì),或者是有待調(diào)查的更深層面的問題。事實(shí)上,這樣的評(píng)分應(yīng)警示我們進(jìn)一步開展調(diào)查,添加數(shù)據(jù)并檢查生成這種評(píng)分的代碼。就目前而言,我的目的是通過這個(gè)示例來展示結(jié)果的效果,因此不再深究。然而,我們應(yīng)該嘗試?yán)闷渌夹g(shù)或者更好的特性選擇,或許還應(yīng)該采用更多的訓(xùn)練示例,以便提高準(zhǔn)確性。對(duì)結(jié)果執(zhí)行交叉驗(yàn)證?也是一種常見的做法。交叉驗(yàn)證包括從訓(xùn)練樣本中反復(fù)獲取部分?jǐn)?shù)據(jù),并將其納入測(cè)試樣本,或者將這部分?jǐn)?shù)據(jù)留出不用。隨后系統(tǒng)將判斷全部運(yùn)行過程的質(zhì)量,而不僅考慮一次。

    將此納入云就像是使用推薦機(jī)制一樣簡(jiǎn)單。整個(gè)腳本將在您的集群中運(yùn)行,只需傳入恰當(dāng)?shù)穆窂郊纯伞H绻?EC2 的 10 節(jié)點(diǎn)集群上運(yùn)行,除通常的準(zhǔn)備工作之外,訓(xùn)練和測(cè)試的整個(gè)過程只需短短幾分鐘。遺憾的是,如果您這樣運(yùn)行,則對(duì)云中整個(gè)數(shù)據(jù)集的運(yùn)行質(zhì)量將下降,因?yàn)槟承┼]件列表所包含的數(shù)據(jù)點(diǎn)極少。這些問題很可能未得到充分的考慮。

    實(shí)現(xiàn)生產(chǎn)的后幾步包括使模型作為運(yùn)行時(shí)系統(tǒng)的一部分,設(shè)置工作流以確保從系統(tǒng)獲得反饋時(shí)更新模型。下面,我將介紹聚類。

    聚類

    與分類相似,Mahout 也有無數(shù)種聚類算法,每種算法都有著與眾不同的特點(diǎn)。例如,K-Means 的伸縮能力出色,但需要您預(yù)先指定需要的聚類數(shù)量;而狄利克雷聚類要求您選擇所需的模型分布和聚類數(shù)量。聚類與分類有很多共同之處,在某些情況下甚至可以共同使用,將聚類作為分類的一部分。除此之外,分類的大部分?jǐn)?shù)據(jù)準(zhǔn)備工作都與聚類相似,例如將原始內(nèi)容轉(zhuǎn)換為順序文件,隨后再轉(zhuǎn)換為稀疏向量,因此您可以參考?分類?部分,了解這些信息。

    對(duì)于聚類來說,要回答的主要問題是:我們能否根據(jù)內(nèi)容的相似度來合情合理地組織所有消息(而無論項(xiàng)目如何)?例如,或許 Apache Solr 郵件列表中有關(guān)使用 Apache Tomcat 作為一種 Web 容器的消息與針對(duì) Tomcat 項(xiàng)目的消息更為接近,而非原始項(xiàng)目。

    就本例而言,前幾個(gè)步驟與分類相似,但在轉(zhuǎn)換為稀疏向量之后就發(fā)生了差別。具體步驟如下:

  • 與分類的第 1 步和第 2 步相同的步驟。
  • $ bin/mahout kmeans --input "$SEQ2SP/tfidf-vectors" --output $CLUST_OUT -k 50 --maxIter 20 --distanceMeasure org.apache.mahout.common.distance.CosineDistanceMeasure --clustering --method mapreduce --clusters "$CLUST_OUT/clusters"
  • 本例中運(yùn)行 K-Means 來執(zhí)行聚類,但 shell 腳本也支持運(yùn)行狄利克雷聚類。(執(zhí)行腳本時(shí),您將看到選擇希望運(yùn)行哪種算法的提示。)在之前的示例中,值得深入研究的參數(shù)如下:

  • -k:要?jiǎng)?chuàng)建的聚類的數(shù)量。我隨意地選擇了 50,但也可以選擇其他值。
  • --maxIter:K-Means 是一種迭代式算法,聚類中心將作為各次迭代的一部分更新。有時(shí)憑算法本身不能保證成功完成,因此可利用此參數(shù)來確保算法完成。
  • --distanceMeasure:確定當(dāng)前質(zhì)心(centroid)與所檢查的點(diǎn)之間的相似度的距離指標(biāo)。在本例中,我選擇了余弦距離指標(biāo),這通常是適合文本數(shù)據(jù)的合理選擇。Mahout 還有多種其他實(shí)現(xiàn),值得您抽出時(shí)間用自己的數(shù)據(jù)進(jìn)行嘗試。
  • --clustering:告訴 Mahout 輸出哪些屬于哪個(gè)質(zhì)心的點(diǎn)。默認(rèn)情況下,Mahout 僅計(jì)算質(zhì)心,因?yàn)檫@通常就能滿足全部的要求。
  • 在運(yùn)行完成之后,您可以使用 Mahout 的?ClusterDump?程序轉(zhuǎn)儲(chǔ)聚類質(zhì)心(和相關(guān)的點(diǎn))。最終結(jié)果將存儲(chǔ)在 kmeans 目錄下名稱以 clusters- 開頭、以 -final 結(jié)尾的子目錄中。具體的值將取決于運(yùn)行任務(wù)使用了多少次迭代,例如?clusters-2-final?是第三次迭代的輸出結(jié)果。例如,以下命令將轉(zhuǎn)儲(chǔ)聚類,而不是運(yùn)行小規(guī)模數(shù)據(jù)樣本:

    <span style="font-family:Times New Roman;font-size:12px;">bin/mahout clusterdump --seqFileDir ../output/ibm/clustering/kmeans/clusters-2-final--pointsDir ../output/ibm/clustering/kmeans/clusteredPoints/ </span>

    --seqFileDir?指向所創(chuàng)建的質(zhì)心,-pointsDir?是聚類點(diǎn)的目錄。清單 4 給出了小部分結(jié)果抽樣:


    清單 4. 運(yùn)行?ClusterDumper?的輸出示例
    <span style="font-family:Times New Roman;font-size:12px;"> :VL-337881{n=4420 c=[Top Terms:user =>0.060885823267350335mailscann => 0.05059369006868677cocoon =>0.048781178576134204virus => 0.04285897589148712derek => 0.04084340722527813legal =>0.040052624979813184scan => 0.03861016730680097danger => 0.03848600584647758csir => 0.03712359352614157transtec => 0.03388019099942435Weight : [props - optional]: Point:1.0 : [distance=0.888270593967813]: /cocoon.apache.org/dev/200004.gz/NBBBIDJGFOCOKIOHGDPBKEPPEEAA.XXXXX = [ag:0.165, briefli:0.250, chang:0.075, close:0.137, cocoon:0.060, cocoon1:0.226, cocoon2:0.218, concept:0.277, develop:0.101, differ:0.144, explain:0.154, greet:0.197, klingenderstrass:0.223, langham:0.223, look:0.105, mailserv:0.293, matthew:0.277, mlangham:0.240, paderborn:0.215, processor:0.231, produc:0.202, put:0.170, scan:0.180, tel:0.163, understand:0.127, virus:0.194] </span>

    在?清單 4?中,請(qǐng)注意輸出包括一個(gè)術(shù)語列表,算法已經(jīng)確定這是聚類中最有代表性的術(shù)語列表。在生成用于生產(chǎn)的標(biāo)簽、在準(zhǔn)備步驟中調(diào)優(yōu)特性選擇時(shí),這可能很有幫助,因?yàn)橥V乖~(本例中,user?很可能就是一個(gè)停止此)往往出現(xiàn)在前幾次試運(yùn)行數(shù)據(jù)時(shí)的列表中。

    正如您期待的那樣,在集群中運(yùn)行此任務(wù)就像在本地運(yùn)行一樣簡(jiǎn)單 — 就像這兩個(gè)示例中一樣簡(jiǎn)單。在我的測(cè)試中,除了轉(zhuǎn)換內(nèi)容所用的時(shí)間之外(約為 150 分鐘),10 個(gè)節(jié)點(diǎn)上的實(shí)際聚類作業(yè)僅用了大約 40 分鐘。

    遺憾的是,對(duì)于聚類,盡管 Mahout 確實(shí)提供了一些評(píng)估工具(請(qǐng)參見輸出頂級(jí)術(shù)語的?CDbwEvaluator?和?ClusterDumper?選項(xiàng)),但評(píng)估結(jié)果往往會(huì)簡(jiǎn)化為 “氣味測(cè)試(smell test)”。在氣味測(cè)試中,可視化聚類往往是最有益的做法,但很多圖形可視化工具包難以處理大型數(shù)據(jù)集,因此您可能需要依靠自己的設(shè)備實(shí)現(xiàn)可視化。

    就像推薦和分類一樣,實(shí)現(xiàn)生產(chǎn)的后續(xù)步驟包括確定獲取數(shù)據(jù)的工作流以及執(zhí)行處理的頻率,當(dāng)然,還包括在您的業(yè)務(wù)環(huán)境中實(shí)際應(yīng)用。您可能需要嘗試不同的算法,確定哪種算法最適合您的數(shù)據(jù)。

    Mahout 未來展望

    Apache Mahout 仍在通過多種方式向前發(fā)展。目前,社區(qū)的關(guān)注重點(diǎn)是通過執(zhí)行性能測(cè)試、文檔整理、API 改進(jìn)和新算法添加來促進(jìn) 1.0 發(fā)布版的推出。下一個(gè)發(fā)布版(即 0.6 版)很有可能在 2011 年的年底或不久之后推出。在較為深入的層面,該社區(qū)也開始著眼于分布式、內(nèi)存中的機(jī)器學(xué)習(xí)問題解決方法。在很多情況下,單憑一臺(tái)機(jī)器難以處理復(fù)雜的機(jī)器學(xué)習(xí)問題,但 Hadoop 又引入了過多磁盤 I/O 方面的負(fù)擔(dān)。無論采用哪種方法,關(guān)注可伸縮性的 Mahout 都能很好地幫助您解決當(dāng)前最艱難的大數(shù)據(jù)問題,使得復(fù)雜機(jī)器學(xué)習(xí)算法的使用更加輕松。

    致謝

    特別感謝 Timothy Potter 協(xié)助我完成 AMI 打包,感謝 Mahout 專家 Sebastian Schelter、Jake Mannix 和 Sean Owen 的技術(shù)審查。本文的部分內(nèi)容由 Amazon Apache 測(cè)試計(jì)劃提供支持。


    下載

    描述名字大小下載方法
    Shell 腳本 j-mahout-scaling.zip 2KB HTTP

    關(guān)于下載方法的信息


    參考資料

    學(xué)習(xí)

    • "Apache Mahout 簡(jiǎn)介”(Grant Ingersoll,developerWorks,2009 年 9 月):Mahout 聯(lián)合創(chuàng)始人 Ingersoll 介紹了機(jī)器學(xué)習(xí)的基本概念,展示了如何使用 Mahout 來聚類文檔、提供推薦以及組織內(nèi)容。

    • Apache Mahout:隨時(shí)關(guān)注 Apache Mahout 主頁(yè),了解所有最新新聞、獲得文檔和新下載內(nèi)容。?

    • Powered By Mahout:Mahout 的 “powered by” 頁(yè)面列舉了愿意公開其使用 Mahout 算法的情況的眾多公司。?

    • Taming Text(Grant S. Ingersoll、Thomas S. Morton 和 Andrew L. Farris,Manning Publications,2011 年):這本書介紹了 Mahout 和用于構(gòu)建基于文本的應(yīng)用程序的相關(guān)開放源碼技術(shù)。?

    • Mahout 實(shí)戰(zhàn)?(Sean Owen、Robin Anil、Ted Dunning 和 Ellen Friedman,Manning Publications,2011 年):這本書是理解 Mahout 的終極指南。?

    • Apache Hadoop:了解 Hadoop。?

    • 算法:在 Mahout Wiki 中閱讀有關(guān) Mahout 實(shí)現(xiàn)的算法的更多內(nèi)容,并進(jìn)一步了解社區(qū)關(guān)注的領(lǐng)域。?

    • 驚喜和巧合:在 Mahout 專家 Ted Dunning 的博客中了解有關(guān)對(duì)數(shù)似然性測(cè)量的有用之處。?

    • MongoDB:訪問 MongoDB 網(wǎng)站,發(fā)現(xiàn)有關(guān) MongoDB 的更多內(nèi)容。?

    • Apache Cassandra:訪問 Apache Cassandra 網(wǎng)站,獲得有關(guān) Apache Cassandra 的更多信息。在 Sean Owen 的博客文章 “Recommending (from) Cassandra” 中進(jìn)一步了解如何將其與 Mahout 一起使用。?

    • Amazon Web 服務(wù),包括 EC2 在內(nèi):進(jìn)一步了解 Amazon 的 EC2 基礎(chǔ)架構(gòu)。?

    • 使用現(xiàn)有 Hadoop AMI:Mahout wiki 中的這個(gè)頁(yè)面詳述了在 EC2 中啟動(dòng) Hadoop 集群的流程。?

    • Amazon EC2 用戶指南:查詢 EC2 用戶指南,了解本文中的?設(shè)置?步驟:
      • 使用公共數(shù)據(jù)集:如何使用 Amazon EC2 公共數(shù)據(jù)集。
      • Apache Software Foundation 公共郵件存檔:使用 Apache Software Foundation 公共郵件存檔的一個(gè)快照來測(cè)試 Mahout。
      • 使用 Amazon EBS 卷:如何使 Amazon EBS 卷可用于您的操作系統(tǒng)。
      • 命令行工具入門:如何設(shè)置您的 Amazon EC2 環(huán)境,以便利用 Amazon EC2 命令行工具(也稱為?API 工具?或?CLI 工具)。

    • Message-ID:進(jìn)一步了解郵件標(biāo)頭和 Message-ID(消息 ID)。?

    • Apache Lucene:訪問 Apache Lucene 網(wǎng)站,了解 Apache Lucene 的更多信息。?

    • Martin Porter 博士的雪球式詞干分析器:這些詞干分析器通常適用于處理搜索和機(jī)器學(xué)習(xí)項(xiàng)目中的文本。?

    • 瀏覽?技術(shù)書店,閱讀有關(guān)這些主題和其他技術(shù)主題的圖書。?

    • developerWorks 中國(guó)網(wǎng)站 Java 技術(shù)專區(qū):查看數(shù)百篇關(guān)于 Java 編程各個(gè)方面的文章。?

    獲得產(chǎn)品和技術(shù)

    • Apache Mahout:下載 Grant Ingersoll 的 Mahout 源代碼,其中包括示例。?

    • 下載?IBM 產(chǎn)品評(píng)估試用版軟件?或者IBM SOA 人員沙箱,親身體驗(yàn) DB2?、Lotus?、Rational?、Tivoli? 和 WebSphere? 方面的應(yīng)用程序開發(fā)工具和中間件產(chǎn)品。?

    討論

    • Mahout 用戶郵件列表:訂閱此郵件列表,以便提出問題、分享知識(shí)、討論話題。?

    • 加入?developerWorks 社區(qū)。與其他 developerWorks 用戶聯(lián)系,瀏覽開發(fā)人員推動(dòng)的博客、論壇、小組和 wiki。

    關(guān)于作者

    Grant Ingersoll 是 Lucid Imagination 的創(chuàng)始人和技術(shù)成員之一。Grant 的編程興趣包括信息檢索、機(jī)器學(xué)習(xí)、文本分類和提取。Grant 是 Apache Mahout 機(jī)器學(xué)習(xí)項(xiàng)目的創(chuàng)始人之一,并且是 Apache Lucene 和 Apache Solr 項(xiàng)目的負(fù)責(zé)人和發(fā)言人。他還是描述使用開源工具進(jìn)行自然語言處理的圖書?Taming Text(Manning 出版社,即將上市)的合著者。



    總結(jié)

    以上是生活随笔為你收集整理的Apache Mahout:适合所有人的可扩展机器学习框架的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。