用 WEKA 進行數據挖掘,第 1 部分: 簡介和迴歸

轉自:http://www.ibm.com/developerworks/cn/opensource/os-weka1/

WEKA

數據挖掘絕非大公司的專有,也不是多昂貴的軟件。實際上,有一種軟件可以實現那些價格不菲的軟件所能實現的全部功能 — 這個軟件就是 WEKA(參見 參考資料)。WEKA 誕生於 University of Waikato(新西蘭)並在 1997 年首次以其現代的格式實現。它使用了 GNU General Public License (GPL)。該軟件以 Java™ 語言編寫幷包含了一個 GUI 來與數據文件交互並生成可視結果(比如表和曲線)。它還有一個通用 API,所以您可以像嵌入其他的庫一樣將 WEKA 嵌入到您自己的應用程序以完成諸如服務器端自動數據挖掘這樣的任務。

圖 1. WEKA 的開始屏
這個屏幕快照顯示了正在打開的 WEKA 屏幕,內含 Explorer、Experimenter、KnowledgeFlow 和 Sinple CLI 選項

在啓動 WEKA 時,會彈出 GUI 選擇器,讓您選擇使用 WEKA 和數據的四種方式。對於本文章系列中的例子,我們只選擇了 Explorer 選項。對於我們要在這些系列文章中所需實現的功能,這已經足夠。

圖 2. WEKA Explorer
這個屏幕快照顯示了具有各種顯示和動作按鈕的 Explorer 工具

在熟悉瞭如何安裝和啓動 WEKA 後,讓我們來看看我們的第一個數據挖掘技術:迴歸。

迴歸

迴歸是最爲簡單易用的一種技術,但可能也是最不強大(這二者總是相伴而來,很有趣吧)。此模型可以簡單到只有一個輸入變量和一個輸出變量(在 Excel 中稱爲 Scatter 圖形,或 OpenOffice.org 內的 XYDiagram)。當然,也可以遠比此複雜,可以包括很多輸入變量。實際上,所有迴歸模型均符合同一個通用模式。多個自變量綜合在一起可以生成一個結果 — 一個因變量。然後用迴歸模型根據給定的這些自變量的值預測一個未知的因變量的結果。

每個人都可能使用過或看到過迴歸模型,甚至曾在頭腦裏創建過一個迴歸模型。人們能立即想到的一個例子就是給房子定價。房子的價格(因變量)是很多自變量 — 房子的面積、佔地的大小、廚房是否有花崗石以及衛生間是否剛重裝過等的結果。所以,不管是購買過一個房子還是銷售過一個房子,您都可能會創建一個迴歸模型來爲房子定價。這個模型建立在鄰近地區內的其他有可比性的房子的售價的基礎上(模型),然後再把您自己房子的值放入此模型來產生一個預期價格。

讓我們繼續以這個房屋定價的迴歸模型爲例,創建一些真實的數據。在我的鄰近地區有一些房子出售,我試圖找到我自己房子的合理價格。我還需要拿此模型的輸出申報財產稅。

表 1. 迴歸模型的房屋值
房子面積(平方英尺) 佔地的大小 臥室 花崗岩 衛生間有無重裝? 銷售價格
3529 9191 6 0 0 $205,000
3247 10061 5 1 1 $224,900
4032 10150 5 0 1 $197,900
2397 14156 4 1 0 $189,900
2200 9600 4 0 1` $195,000
3536 19994 6 1 1 $325,000
2983 9365 5 0 1 $230,000
           
3198 9669 5 1 1 ????

好的消息是(也可能是壞消息,取決於您自己的看法)上述對迴歸模型的簡單介紹只觸及了一些皮毛,這種觸及甚至都不會被真正地注意到。關於迴歸模型有大學的課程可以選擇,那會教授給您有關回歸模型的更多信息,甚至多過您想要知道的。但我們的簡介讓您充分熟悉了這個概念,已足夠應付本文中 WEKA 試用。如果對迴歸模型以及其中的數據統計的細節有更深的興趣,您可以用自己喜愛的搜索引擎搜索如下的術語:least squares、homoscedasticity、normal distribution、White tests、Lilliefors tests、R-squared 和 p-values。

爲 WEKA 構建數據集

爲了將數據加載到 WEKA,我們必須將數據放入一個我們能夠理解的格式。WEKA 建議的加載數據的格式是 Attribute-Relation File Format (ARFF),您可以在其中定義所加載數據的類型,然後再提供數據本身。在這個文件內,我們定義了每列以及每列所含內容。對於迴歸模型,只能有 NUMERIC 或 DATE 列。最後,以逗號分割的格式提供每行數據。我們爲 WEKA 使用的 ARFF 文件如下所示。請注意在數據行內,並未包含我的房子。因爲我們在創建模型,我房子的價格還不知道,所以我們還不能輸入我的房子。

清單 1. WEKA 文件格式
@RELATION house

@ATTRIBUTE houseSize NUMERIC
@ATTRIBUTE lotSize NUMERIC
@ATTRIBUTE bedrooms NUMERIC
@ATTRIBUTE granite NUMERIC
@ATTRIBUTE bathroom NUMERIC
@ATTRIBUTE sellingPrice NUMERIC

@DATA
3529,9191,6,0,0,205000 
3247,10061,5,1,1,224900 
4032,10150,5,0,1,197900 
2397,14156,4,1,0,189900 
2200,9600,4,0,1,195000 
3536,19994,6,1,1,325000 
2983,9365,5,0,1,230000

將數據載入 WEKA

數據創建完成後,就可以開始創建我們的迴歸模型了。啓動 WEKA,然後選擇 Explorer。將會出現 Explorer 屏幕,其中 Preprocess 選項卡被選中。選擇 Open File 按鈕並選擇在上一節中創建的 ARFF 文件。在選擇了文件後,WEKA Explorer 應該類似於圖 3 中所示的這個屏幕快照。

圖 3. 房屋數據加載後的 WEKA
這個屏幕快照顯示了數據加載後的 WEKA Explorer

在這個視圖中,WEKA 允許您查閱正在處理的數據。在 Explorer 窗口的左邊,給出了您數據的所有列(Attributes)以及所提供的數據行的數量(Instances)。若選擇一列,Explorer 窗口的右側就會顯示數據集內該列數據的信息。比如,通過選擇左側的 houseSize 列(它應該默認選中),屏幕右側就會變成顯示有關該列的統計信息。它顯示了數據集內此列的最大值爲 4,032 平方英尺,最小值爲 2,200 平方英尺。平均大小爲 3,131 平方英尺,標準偏差爲 655 平方英尺(標準偏差是一個描述差異的統計量度)。此外,還有一種可視的手段來查看數據,單擊Visualize All 按鈕即可。由於在這個數據集內的行數有限,因此可視化的功能顯得沒有有更多數據點(比如,有數百個)時那麼功能強大。

好了,對數據的介紹已經夠多了。讓我們立即創建一個模型來獲得我房子的價格。

用 WEKA 創建一個迴歸模型

爲了創建這個模型,單擊 Classify 選項卡。第一個步驟是選擇我們想要創建的這個模型,以便 WEKA 知道該如何處理數據以及如何創建一個適當的模型:

  1. 單擊 Choose 按鈕,然後擴展 functions 分支。
  2. 選擇 LinearRegression 葉。

這會告訴 WEKA 我們想要構建一個迴歸模型。除此之外,還有很多其他的選擇,這說明可以創建的的模型有很多。非常多!這也從另一個方面說明本文只介紹了這個主題的皮毛。有一點值得注意。在同一個分支還有另外一個選項,稱爲 SimpleLinearRegression 。請不要選擇該選項,因爲簡單迴歸只能有一個變量,而我們有六個變量。選擇了正確的模型後,WEKA Explorer 應該類似於圖 4。

圖 4. WEKA 內的線性迴歸模型
這個屏幕快照顯示了 WEKA 的線性迴歸模型內的數據集

現在,選擇了想要的模型後,我們必須告訴 WEKA 它創建這個模型應該使用的數據在哪裏。雖然很顯然我們想要使用在 ARFF 文件內提供的那些數據,但實際上有不同的選項可供選擇,有些甚至遠比我們將要使用的選項高級。其他的三個選擇是:Supplied test set 允許提供一個不同的數據集來構建模型; Cross-validation 讓 WEKA 基於所提供的數據的子集構建一個模型,然後求出它們的平均值來創建最終的模型;Percentage split WEKA 取所提供數據的百分之一來構建一個最終的模型。這些不同的選擇對於不同的模型非常有用,我們在本系列後續文章中會看到這一點。對於迴歸,我們可以簡單地選擇 Use training set。這會告訴 WEKA 爲了構建我們想要的模型,可以使用我們在 ARFF 文件中提供的那些數據。

創建模型的最後一個步驟是選擇因變量(即我們想要預測的列)。在本例中指的就是房屋的銷售價格,因爲那正是我們想要的。在這些測試選項的正下方,有一個組合框,可用它來選擇這個因變量。列 sellingPrice 應該默認選中。如果沒有,請選擇它。

我們準備好創建模型後,單擊 Start。圖 5 顯示了輸出結果。

圖 5. WEKA 內的房屋價格迴歸模型
這個屏幕快照顯示了來自 WEKA 的線性迴歸模型的總結報告

解析這個迴歸模型

WEKA 可不馬虎。它會把這個迴歸模型徑直放在輸出,如清單 2 所示。

清單 2. 迴歸輸出
sellingPrice = (-26.6882   * houseSize) + 
               (7.0551     * lotSize) + 
               (43166.0767 * bedrooms) +
               (42292.0901 * bathroom) 
             - 21661.1208

清單 3 顯示了結果,其中已經插入了我房子的價格。

清單 3. 使用迴歸模型的房屋價格
sellingPrice = (-26.6882   * 3198) + 
               (7.0551     * 9669) + 
               (43166.0767 * 5) + 
               (42292.0901 * 1) 
             - 21661.1208

sellingPrice = 219,328

不過,回過頭來看看本文的開頭部分,我們知道數據挖掘絕不是僅僅是爲了輸出一個數值:它關乎的是識別模式和規則。它不是嚴格用來生成一個絕對的數值,而是要創建一個模型來讓您探測模式、預測輸出並根據這些數據得出結論。讓我們更進一步來解讀一下我們的模型除了房屋價格之外告訴我們的模式和結論:

  • 花崗石無關緊要— WEKA 將只使用在統計上對模型的正確性有貢獻的那些列(以 R-squared 量度,但這超出了本文的範圍)。它將會拋棄並忽視對創建好的模型沒有任何幫助的那些列。所以這個迴歸模型告訴我們廚房裏的花崗石並不會影響房子的價值。
  • 衛生間是有關係的— 因我們爲衛生間使用了簡單的 0 或 1 值,所以我們可以使用來自迴歸模型的這個係數來決定衛生間的這個值對房屋價值的影響。這個模型告訴我們它使房子的價值增加了 $42,292。
  • 較大的房子價格反而低— WEKA 告訴我們房子越大,銷售價格越低?這可以從 houseSize 變量前面負的係數看出來。此模型告訴我們房子每多出一平方英尺都會使房價減少 $26?這根本沒有意義。這是在美國!當然是房子越大越好,特別是在我所在的得克薩斯州。那麼我們怎麼才能解釋這一點呢?這是無用數據入、無用數據出的一個很好的例子。房子的大小並不是一個自變量,它還與臥室變量相關,因爲房子大通常臥室也多。所以我們的模型並不完美。但是我們可以修復這個問題。還記得麼:在 Preprocess 選項卡,可以從數據集中刪除列。對於本例,我們刪除 houseSize 列並創建另一個模型。那麼它會如何影響房子的價格呢?這個新模型又如何更有實際意義?(修改後的我的房子價格是: $217,894)。
  • 要用這個數據集生成一個迴歸模型,我們需要嚴格地按照處理房子數據的步驟來處理這些數據,所以這裏我不再贅述。繼續並創建這個迴歸模型。它將生成如清單 4 所示的輸出。要想把這個簡單的示例提升到一個新的級別,讓我們來看一下 WEKA Web 站點上作爲迴歸示例提供給我們的一個數據文件。理論上講,這要比我們七個房子的簡單示例要複雜得多。這個示例數據文件的作用是創建一個能基於汽車的幾個特性來推測其油耗(每加侖英里數,MPG)的迴歸模型(請務必記住,數據取自 1970 至 1982 年)。這個模型包括汽車的如下屬性:汽缸、排量、馬力、重量、加速度、年份、產地及製造商。此外,這個數據集有 398 行數據,這些數據足以滿足我們的多種統計需求,而這在我們的房價模型中是不能實現的。理論上講,這是一個極爲複雜的迴歸模型,WEKA 可能需要大量時間才能創建一個具有如此多數據的模型(但我估計您已預見到了 WEKA 能夠很好地處理這些數據)。
清單 4. MPG 數據迴歸模型
class (aka MPG) =

     -2.2744 * cylinders=6,3,5,4 +
     -4.4421 * cylinders=3,5,4 +
      6.74   * cylinders=5,4 +
      0.012  * displacement +
     -0.0359 * horsepower +
     -0.0056 * weight +
      1.6184 * model=75,71,76,74,77,78,79,81,82,80 +
      1.8307 * model=77,78,79,81,82,80 +
      1.8958 * model=79,81,82,80 +
      1.7754 * model=81,82,80 +
      1.167  * model=82,80 +
      1.2522 * model=80 +
      2.1363 * origin=2,3 +
      37.9165

在您自已生成這個模型時,您會看到 WEKA 只用了不到一秒的時間就處理好了這個模型。所以,即使要處理的是具有大量數據的功能強大的迴歸模型,就計算而言,也不是什麼問題。這個模型看上去應該比房子數據複雜得多,但事實並非如此。例如,這個迴歸模型的首行,-2.2744 * cylinders=6,3,5,4 表示,如果汽車有 6 個缸,就會在此列中放上一個 1,如果汽車有 8 個缸,就會放上一個 0。讓我們從這個數據集中取一個示例行(第 10 行)並將這些數值放入迴歸模型,看看我們這個模型的輸出是否與數據集中提供給我們的輸出相似。

清單 5. 示例 MPG 數據
data = 8,390,190,3850,8.5,70,1,15

class (aka MPG) =

     -2.2744 * 0 +
     -4.4421 * 0 +
      6.74   * 0 +
      0.012  * 390 +
     -0.0359 * 190 +
     -0.0056 * 3850 +
      1.6184 * 0 +
      1.8307 * 0 +
      1.8958 * 0 +
      1.7754 * 0 +
      1.167  * 0 +
      1.2522 * 0 +
      2.1363 * 0 +
     37.9165
     
Expected Value = 15 mpg
Regression Model Output = 14.2 mpg

因此,當我們用隨機選擇的測試數據對此模型進行測試時,此模型的表現非常出色,對於一輛實際值爲 15 MPG 的車,我們的預測值是 14.2 MPG。

結束語

本文通過向您介紹數據挖掘這個主題的背景以及這個領域的目標力求回答“什麼是數據挖掘”這個問題。數據挖掘就是通過創建模型和規則來將大量的不可用信息(通常是分散的數據形式)變成有用的信息。您的目標是使用模型和規則來預測將來的行爲,從而改進您的業務,或是解釋一些您用其他方法不能解釋的事情。這些模型可以幫助您確認您已經有了的某些想法,甚至可能會讓您發現數據中您以前不曾意識到的新東西。這裏有個有趣的數據挖掘的例子(不知道還存在多少類似的事例),在美國,Walmart 會在週末時把啤酒移到尿布貨架的未端,這是因爲 Walmart 的數據挖掘結果顯示男士通常會在週末購買尿布,而他們同時也喜歡在週末喝啤酒。

本文還向您介紹了一種免費的開源軟件程序 WEKA。當然,市場上還有很多更爲複雜的數據挖掘商業軟件產品,但對於剛開始進行數據挖掘的人來說,這種開源的解決方案非常有益。請記住,您永遠不可能成爲數據挖掘方面的專家,除非您打算用 20 年的時間來研究它。WEKA 可以讓您步入數據挖掘的大門,同時也能爲您遇到的初級問題提供完美的解決方案。如果您以前對數據挖掘接觸不多,那麼這個非常好的解決方案將能滿足您的全部所需。

最後,本文探討了第一個數據挖掘模型:迴歸模型(特別是線性迴歸多變量模型),另外還展示瞭如何在 WEKA 中使用它。這個迴歸模型很容易使用,並且可以用於很多數據集。您會發現這個模型是我在本系列文章中所討論的所有模型中最有用的一個。然而,數據挖掘不僅侷限於簡單的迴歸,在不同的數據集及不同的輸出要求的情況下,您會發現其他的模型也許是更好的解決方案。

最後,我再重申一下,本文及本系列的後續文章只是對數據統計和數據挖掘領域做了最簡單的介紹。花上整整一學期的時間去學習數據統計和數據挖掘的人也只能被稱爲“初學者”。 我們的目的就是讓初學者充分領略這個可用的開源工具的妙處並提高對數據挖掘所能提供的價值的瞭解和重視。


發佈了28 篇原創文章 · 獲贊 13 · 訪問量 24萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章