天天看點

用WEKA進行資料挖掘

學習于IBM教學文檔

資料挖掘學習與weka使用

第二部 分分類和叢集

分類 vs. 群集 vs. 最近鄰

在我深入探讨每種方法的細節并通過 WEKA 使用它們之前,我想我們應該先了解每個模型 — 每個模型适合哪種類型的資料以及每個模型試圖實作的目标。我們還會将我們已有的模型 — 回歸模型 — 也包括在我們的讨論之中,以便您可以看到這三種新模型與我們已經了解的這個模型的對比。我将通過實際的例子展示每個模型的使用以及各自的不同點。這些實際的例子均圍繞着一個本地的 BMW 經銷店展開,研究它如何能增加銷售。這個經銷店已經儲存了所有其過去的銷售資訊及有關購買過 BMW、留意過 BMW 或是來過 BMW 展廳的每個客戶的資訊。這個經銷店想要增加未來的銷售并部署了資料挖掘來實作此目标。

回歸

問題:“對于新的 BMW M5 車型我們該如何定價?” 回歸模型隻能給出這個問題的一個數值答案。回歸模型會使用 BMW 和 M5 的過去銷售資料來基于所售汽車的屬性和賣點确定人們過去在這個經銷店購買車的價格。然後,回歸模型允許 BMW 經銷店插入新車的屬性來确定其價格。

比如:Selling Price = 25,000+(25,000+(2900 * Liters in Engine) + (9000∗isSedan)+(9000∗isSedan)+(11,000 * isConvertible) + (100∗inchesofcar)+(100∗inchesofcar)+(22,000 * isM)。

分類

問題:“那麼客戶 X 有多大的可能會購買最新的 BMW M5 呢?” 建立一個分類樹(一個決策樹),并借此挖掘資料就可以确定這個人購買一輛新的 M5 的可能性有多大。這個樹上的節點可以是年齡、收入水準、目前擁有的車的數量、婚姻狀況、有無孩子、房主還是租戶。對這個決策樹使用此人的這些屬性就可以确定他購買 M5 的可能性。

群集

問題是:“哪個年齡組最喜歡銀色的 BMW M5?”這就需要挖掘資料來對比過去購車者的年齡和過去購買的車的顔色。從這些資料,就能夠找到某個年齡組(比如 22-30 歲)具有訂購某種顔色的 BMW M5 的更高的傾向性(75% 購買藍色)。同樣地,它也可顯示另一個不同的年齡組(比如 55-62)則更傾向于訂購銀色的 BMW(65 % 購買銀色,20 % 購買灰色)。這些資料,當挖掘後,傾向于集中于某些特定年齡組和特定顔色周圍,友善使用者快速判斷該資料内的模式。

最近鄰

問題:“當人們購買 BMW M5 時,他們傾向于同時購買其他哪些選項?”資料挖掘顯示,人們入店并購買一輛 BMW M5 時,他們還會傾向于購買與之配套的行李箱。(這也就是所謂的購物籃分析)。 使用此資料,汽車經銷店就會将配套行李箱的促銷廣告放在店面的顯眼處,甚至會在報紙上做促銷廣告,如果他們購買 M5,配套行李箱将免費/打折,以期增加銷售。

分類 (也即分類樹或決策樹) 是一種資料挖掘算法,為如何确定一個新的資料執行個體的輸出建立逐漸指導。它所建立的這個樹上的每個節點都代表一個位置,在這個位置必須基于輸入做出決策,并且會從一個節點移到下一個節點直至到達能夠得出預測的輸出的葉子節點。這雖然聽起來有些讓人迷惑,但其實它非常直覺。讓我們看一個例子。

[ Will You Read This Section? ]
          /              \
        Yes              No
        /                 \
[Will You Understand It?]  [Won't Learn It]
    /         \
  Yes          No
  /             \
  [Will Learn It]  [Won't Learn It]           

這個簡單的分類樹試圖回答這個問題:“您了解分類樹麼?”在每個節點,您都會回答這個問題并繼續沿着分支下移,直到您到達一個回答了是或不是的葉子節點。 這個模型可用于任何未知的資料執行個體,來預測這個未知資料執行個體是否通過隻詢問兩個簡單問題就能了解分類樹。這看上去像是分類樹的一大優勢 — 它無需有關資料的大量資訊就能建立一個十分準确且資訊豐富的樹。

分類樹的一個重要概念非常類似于我們在 用 WEKA 進行資料挖掘,第 1 部分:簡介和回歸 回歸模型中看到的概念:使用一個“訓練集”來生成模型。就是拿一組輸出值已知的資料集并使用此資料集來建立我們的模型。之後,隻要我們有一個輸出值未知的新的資料點,我們都可以将其放入這個模型并生成預期的輸出。這與我們在回歸模型中看到的沒有差别。隻不過,這個模型更進了一步,通常會把整個訓練集分成兩個部分:拿資料的約 60-80 % 放入我們的訓練集,用來生成模型;然後拿剩下的資料放入一個測試集,在模型生成後,立即用其來測試我們模型的準确性。

那麼這個額外的步驟為什麼在此模型中如此重要呢?這個問題就是所謂的

過拟合

:如果我們提供過多 資料用于模型建立,我們的模型雖然會被完美建立,但隻針對的是該資料。請記住:我們想使用此模型來預測未來的未知數;我們不是想使用此模型來準确地預測我們已經知道的值。這就是為什麼我們要建立一個測試集。在建立了模型後,我們要進行檢查以確定我們所建立模型的準确性不會在測試集降低。這就保證了我們的模型會準确地預測出未來的未知值。使用 WEKA 會看到它的實際效果。

這還引出了分類樹的另一個重要概念:

修剪

修剪

正如其名字所指,意思是删減分類樹的枝條。那麼為什麼有人會想要将資訊從分類樹中删除呢?還是因為

過拟合

的緣故。随着資料集的增大以及屬性數量的增長,我們所建立的樹就會越來越複雜。理論上講,一個樹可以具有

leaves = (rows * attributes)

。但那又有何益處呢?就預測未來的未知數而言,它根本幫不到我們,因它隻适于我們現有的訓練資料。是以我們需要的是一種平衡。我們想要我們的樹盡量簡單,節點和枝葉盡量少。同時我們還想要它盡量地準确。這就需要進行權衡,我們不久就會看到。

在使用 WEKA 前,有關分類我還想指出最後一點,那就是

假正

假負

假正

指的是這樣的一個資料執行個體:我們建立的這個模型預測它應該是正的,但事實相反,實際值卻是負的。同樣地,

假負

指的是這樣一個資料執行個體:我們建立的這個模型預測它應該是負的,但事實相反,實際值卻是正的。

這些錯誤表明在我們的模型中出了問題,我們的模型正在錯誤地分類某些資料。雖然可能會出現不正确的分類,但可接受的錯誤百分比由模型建立者決定。比如,如果是在醫院裡測試心髒螢幕,很顯然,将需要極低的錯誤百分比。而如果您隻是在有關資料挖掘的文章中挖掘一些虛構的資料,那麼錯誤率可以更高一些。為了使之更進一步,還需要決定可以接受的假負與假正的百分比率是多少。我立即想到的一個例子就是垃圾郵件模型:一個假正(一個真郵件被标記為了垃圾郵件)要比假負(一個垃圾消息未被标記為垃圾郵件)更具破壞性。在像這樣的例子中,就可以判斷假負:假正的比率最低為 100:1 才是可以接受的。

好了,對于分類樹的背景和技術方面的介紹已經夠多了。讓我們現在開始獲得一些真正的資料并将其帶入 WEKA。

WEKA 資料集

我們用于分類示例的資料集所圍繞的仍然是我們虛構的 BMW 經銷店。這個經銷店正在啟動一個推銷計劃,試圖向其老客戶推銷兩年延保。這個經銷店過去曾做過類似的計劃并從過去的銷售中收集了 4,500 個資料點。資料集中的屬性有:

收入水準

[0=$0-$30k, 1=$31k-$40k, 2=$41k-$60k, 3=$61k-$75k, 4=$76k-$100k, 5=$101k-$150k, 6=$151k-$500k, 7=$501k+]

  • 第一輛 BMW 購買的年/月
  • 最近的 BMW 購買的年/月
  • 是否過去曾響應過延保計劃
  • 讓我們來看看在這個例子中使用的 Attribute-Relation File Format (ARFF)。

清單 2. 分類 WEKA 資料

@attribute IncomeBracket {0,1,2,3,4,5,6,7}
@attribute FirstPurchase numeric
@attribute LastPurchase numeric
@attribute responded {1,0}

@data

4,200210,200601,0
5,200301,200601,1
...           
中間省略實驗步驟

進一步閱讀:如果您想更多地了解分類樹,有一些關鍵字可以查找,因篇幅的原因我在這裡就不逐一介紹了:

ROC curves、AUC、false positives、false negatives、learning curves、Naive Bayes、information gain、overfitting、 pruning、chi-square test

群集 讓使用者可以通過資料組來從資料确定模式。當資料集已定義并且需要從此資料确定一個通用的模式時,群集的優勢就會比較明顯。您可以根據自身業務需要建立一定數量的組。與分類相比,群集的一個好處是資料集内的每個屬性都被用來分析該資料。(在分類方法中,隻有屬性的一個子集用在了模型中。)使用群集的一個主要劣勢是使用者需要提前知道他想要建立的組的數量。若使用者對其資料知之甚少,這可能會很困難。是應該建立三個組?五個組?還是十個組?是以在決定要建立的理想組數之前,可能需要進行幾個步驟的嘗試和出錯。

不過,對于一般的使用者,群集有可能是最為有用的一種資料挖掘方法。它可以迅速地将整個資料集分成組,供您快速得出結論。此方法背後的算法多少有些複雜和難懂,這也是我們為何要充分利用 WEKA 的原因。

算法概覽

如下是對群集中所用算法的一個簡要的快速概覽:

  1. 資料集内的每個屬性都應該是規格化的,是以,每個值均除以該屬性在資料集内的最高值與最低值間的內插補點。例如,如果屬性是年齡,且最高值為 72,最低值為 16,那麼年齡 32 将被規格化為 0.5714。
  2. 理想的群集數量給定後,就可以随機地從資料集選擇該數量的樣例來充當我們初始測試群集中心。比如,如果想要有三個群集,那麼就可以從資料集中随意選擇三行資料。
  3. 計算從每個資料樣例到群集中心(我們随意選中的資料行)的距離,使用距離計算的最小平方法。
  4. 基于到每個群集中心的最短距離将每個資料行配置設定給一個群集。
  5. 計算重心,即隻使用每個群集的數的每列資料的平均數。
  6. 計算每個資料樣例與剛剛建立的這些重心之間的距離。如果群集及群集數不變,那麼就說明大功告成,群集建立完畢。如果它們變化,那麼就需要傳回到步驟 3 重新開始并一遍遍重複,直到不再變化為止。

很顯然,這看上去不怎麼有趣。對于一個具有 10 行和三個群集的資料集,若使用電子資料表,需要花上 30 分鐘才能完成。那麼想象一下,如果有 100,000 資料行和 10 個群集,若用手工完成那将花費多長時間。所幸的是,計算機在幾秒内就可以完成這類計算。

實驗過程省略

進一步閱讀:如果您有興趣進一步鑽研,可以按如下術語搜尋相關資訊:

Euclidean distance、Lloyd's algorithm、

Manhattan Distance、Chebyshev Distance、sum of squared errors、cluster centroids

第三部分 最近鄰和伺服器端庫

最近鄰(也即 Collaborative Filtering 或 Instance-based Learning)是一種非常有用的資料挖掘技術,可用來用輸出值已知的以前的資料執行個體來預測一個新資料執行個體的未知輸出值。從目前的這種描述看來,最近鄰非常類似于回歸和分類。那麼它與這二者究竟有何不同呢?首先,回歸隻能用于數值輸出,這是它與最近鄰的最直接的一個不同點。分類,如我們在前一篇文章的例子中看到的,使用每個資料執行個體 來建立樹,我們需要周遊此樹才能找到答案。而這一點對于某些資料而言會是一個很嚴重的問題。舉個例子,亞馬遜這樣的公司常常使用 “購買了 X 的顧客還購買了 Y” 特性,如果亞馬遜拟建立一個分類樹,那麼它将需要多少分支和節點?它的産品多達數十萬。這個樹将有多巨大呀?如此巨大的一個樹能有多精确呢?即便是單個分支,您都将會驚訝地發現它隻有三個産品。亞馬遜的頁面通常會有 12 種産品推薦給您。對于這類資料,分類樹是一種極不适合的資料挖掘模型。

而最近鄰則可以非常有效地解決所有這些問題,尤其是在上述亞馬遜的例子中遇到的這些問題。它不會受限于數量。它的伸縮性對于 20 個顧客的資料庫與對于 2000 萬個顧客的資料庫沒有什麼差異,并且您可以定義您想要得到的結果數。看起來是一個很棒的技術!它的确很棒 — 并且可能對于那些正在閱讀本文的電子商務店鋪的店主最為有用。

讓我們先來探究一下最近鄰背後的數學理論,以便能更好地了解這個過程并了解此技術的某些限制。

最近鄰背後的數學理論

最近鄰技術背後的數學理論非常類似于群集技術所涉及到的數學理論。對于一個未知的資料點,這個未知資料點與每個已知資料點之間的距離需要被計算出來。如果用電子資料表計算此距離将會非常繁瑣,而一個高性能的計算機則可以立即完成這些計算。最容易也是最為常見的一種距離計算方式是 “Normalized Euclidian Distance”。它看起來複雜,實則不然。讓我們通過一個例子來弄清楚第 5 個顧客有可能會購買什麼産品?

針對 WEKA 的資料集

我們将要為我們的最近鄰示例使用的資料集應該看起來非常熟悉 — 這個資料集就與我們在上一篇文章的分類示例中所用的相同。該示例關于的是一個虛構的 BMW 經銷店及其向老客戶銷售兩年延保的促銷活動。為了回顧這個資料集,如下列出了我在上一篇文章中曾介紹過的一些名額。

延保的以往銷售記錄中有 4,500 個資料點。資料集中的屬性有:收入水準 [0=0−0−30k, 1=31k−31k−40k, 2=41k−41k−60k, 3=61k−61k−75k, 4=76k−76k−100k, 5=101k−101k−150k, 6=151k−151k−500k, 7=$501k+]、顧客首輛 BMW 購買的年/月、最近一輛 BMW 購買的年/月、顧客是否在過去對延保的促銷有過響應。

清單 2. 最近鄰 WEKA 資料

@attribute IncomeBracket {0,1,2,3,4,5,6,7}
@attribute FirstPurchase numeric
@attribute LastPurchase numeric
@attribute responded {1,0}

@data

4,200210,200601,0
5,200301,200601,1
...           

WEKA 内的最近鄰

我們為何要使用與分類例子中相同的資料集呢?這是因為分類模型得到的結果,隻有 59 % 的準确率,而這完全不能接受(比猜想好不到哪去)。我們将提高準确率并為這個虛構的經銷商提供一些有用的資訊。

将資料檔案 bmw-training.arff 載入 WEKA,步驟與我們之前在 Preprocess 頁籤中使用的相同。加載資料後,螢幕應該類似于圖 1。

=== Evaluation on training set ===
=== Summary ===

Correctly Classified Instances        2663               88.7667 %
Incorrectly Classified Instances       337               11.2333 %
Kappa statistic                          0.7748
Mean absolute error                      0.1326
Root mean squared error                  0.2573
Relative absolute error                 26.522  %
Root relative squared error             51.462  %
Total Number of Instances             3000     

=== Detailed Accuracy By Class ===

               TP Rate   FP Rate   Precision   Recall  F-Measure   ROC Area  Class
                 0.95      0.177      0.847     0.95      0.896      0.972    1
                 0.823     0.05       0.941     0.823     0.878      0.972    0
Weighted Avg.    0.888     0.114      0.893     0.888     0.887      0.972

=== Confusion Matrix ===

    a    b   <-- classified as
 1449   76 |    a = 1
 261 1214 |    b = 0           

述結果與我們用分類建立模型時的結果有何差異呢?使用最近鄰的這個模型的準确率為 89 %,而分類模型的準确率隻有 59 %,是以這絕對是一個很好的開始。接近 90 % 的準确率是非常可以接受的。讓我們再進一步來分析這些結果的假正和假負的情況,以便深入了解來自 WEKA 的這些結果在實際業務中的适用。

此模型的結果顯示我們有 76 個假正(2.5 %),有 261 個假負(8.7 %)。請記住在本例中一個假正意味着我們的模型預測該客戶會購買延保而實際上卻未購買,而一個假負則意味着我們的模型預測客戶不會購買延保而實際卻購買了。讓我們估測經銷商的宣傳單的派發成本是每個傳單 3,延保為經銷商帶來了3,延保為經銷商帶來了400 的利潤。這個模型對經銷商的成本/收益的預測應為 400−(2.5400−(2.53) - (8.7% * 400) = 365。是以,從此模型看來,這個經銷商相當有利可圖。與之相比,使用分類模型預測的成本/收益隻有365。是以,從此模型看來,這個經銷商相當有利可圖。與之相比,使用分類模型預測的成本/收益隻有400 - (17.2% * 3)−(23.73)−(23.7400) = $304,由此可以看出使用正确的模型可以為此經銷商提供 20 % 潛在收入的提高。

您可以自己練習着在這個模型中嘗試不同數量的最近鄰(您可以右鍵單擊下一個 “IBk -K 1….”,就會看到一列參數)。可以任意更改 “KNN”(K-最近鄰)。在本例中您将會看到随着加入更多的鄰,模型的準确率實際上卻降低了。

此模型的一些不盡人意之處:當我們談論像亞馬遜這樣的資料集時,最近鄰的強大威力是顯而易見的。對于有 2000 萬使用者的亞馬遜,此算法非常準确,因為在亞馬遜的資料庫中與您有着類似購買習慣的潛在客戶很多。您的最近鄰會非常相似。因而,所建立的模型會十分準确和高效。相反,如果能比較的資料點相對很少的話,這個模型很快就會損壞,不再準确。在線上電子商務店鋪的初期,比如隻有 50 個顧客,那麼産品推薦特性很可能一點都不準确,因為最近鄰實際上與您本身相差甚遠。