您好,登錄后才能下訂單哦!
這篇文章跟大家分析一下“數(shù)據(jù)挖掘技術(shù)中的最近鄰和服務(wù)器端庫怎么理解”。內(nèi)容詳細(xì)易懂,對“數(shù)據(jù)挖掘技術(shù)中的最近鄰和服務(wù)器端庫怎么理解”感興趣的朋友可以跟著小編的思路慢慢深入來閱讀一下,希望閱讀后能夠?qū)Υ蠹矣兴鶐椭?。下面跟著小編一起深入學(xué)習(xí)“數(shù)據(jù)挖掘技術(shù)中的最近鄰和服務(wù)器端庫怎么理解”的知識吧。
在我們之前的文章中,我們將 WEKA 用作一種獨(dú)立的應(yīng)用程序。那么它在實(shí)際中能多有用呢?很顯然,它并不完美。由于 WEKA 是一種基于 Java 的應(yīng)用程序,它有一個可被用在我們自己的服務(wù)器端代碼中的 Java 庫。對于大多數(shù)人而言,這可能是最為常見的用法,因?yàn)槟梢跃帉懘a來不斷地分析您的數(shù)據(jù)并動態(tài)地做出調(diào)整,而不必依賴他人提取數(shù)據(jù)、將其轉(zhuǎn)換成 WEKA 格式,然后再在 WEKA Explorer 內(nèi)運(yùn)行它。
回頁首
最近鄰(也即 Collaborative Filtering 或 Instance-based Learning)是一種非常有用的數(shù)據(jù)挖掘技術(shù),可用來用輸出值已知的以前的數(shù)據(jù)實(shí)例來預(yù)測一個新數(shù)據(jù)實(shí)例的未知輸出值。從目前的這種描述看來,最近鄰非常類似于回歸和分類。那么它與這二者究竟有何不同呢?首先,回歸只能用于數(shù)值輸出,這是它與最近鄰的最直接的一個不同點(diǎn)。分類,如我們在前一篇文章的例子中看到的,使用每個數(shù)據(jù)實(shí)例 來創(chuàng)建樹,我們需要遍歷此樹才能找到答案。而這一點(diǎn)對于某些數(shù)據(jù)而言會是一個很嚴(yán)重的問題。舉個例子,亞馬遜這樣的公司常常使用 “購買了 X 的顧客還購買了 Y" 特性,如果亞馬遜擬創(chuàng)建一個分類樹,那么它將需要多少分支和節(jié)點(diǎn)?它的產(chǎn)品多達(dá)數(shù)十萬。這個樹將有多巨大呀?如此巨大的一個樹能有多精確呢?即便是單個分支,您都將會驚訝地發(fā)現(xiàn)它只有三個產(chǎn)品。亞馬遜的頁面通常會有 12 種產(chǎn)品推薦給您。對于這類數(shù)據(jù),分類樹是一種極不適合的數(shù)據(jù)挖掘模型。
而最近鄰則可以非常有效地解決所有這些問題,尤其是在上述亞馬遜的例子中遇到的這些問題。它不會受限于數(shù)量。它的伸縮性對于 20 個顧客的數(shù)據(jù)庫與對于 2000 萬個顧客的數(shù)據(jù)庫沒有什么差異,并且您可以定義您想要得到的結(jié)果數(shù)??雌饋硎且粋€很棒的技術(shù)!它的確很棒 — 并且可能對于那些正在閱讀本文的電子商務(wù)店鋪的店主最為有用。
讓我們先來探究一下最近鄰背后的數(shù)學(xué)理論,以便能更好地理解這個過程并了解此技術(shù)的某些限制。
最近鄰技術(shù)背后的數(shù)學(xué)理論非常類似于群集技術(shù)所涉及到的數(shù)學(xué)理論。對于一個未知的數(shù)據(jù)點(diǎn),這個未知數(shù)據(jù)點(diǎn)與每個已知數(shù)據(jù)點(diǎn)之間的距離需要被計(jì)算出來。如果用電子數(shù)據(jù)表計(jì)算此距離將會非常繁瑣,而一個高性能的計(jì)算機(jī)則可以立即完成這些計(jì)算。最容易也是最為常見的一種距離計(jì)算方式是 “Normalized Euclidian Distance”。它看起來復(fù)雜,實(shí)則不然。讓我們通過一個例子來弄清楚第 5 個顧客有可能會購買什么產(chǎn)品?
Customer Age Income Purchased Product 1 45 46k Book 2 39 100k TV 3 35 38k DVD 4 69 150k Car Cover 5 58 51k ??? Step 1: Determine Distance Formula Distance = SQRT( ((58 - Age)/(69-35))^2) + ((51000 - Income)/(150000-38000))^2 ) Step 2: Calculate the Score Customer Score Purchased Product 1 .385 Book 2 .710 TV 3 .686 DVD 4 .941 Car Cover 5 0.0 ???
如果使用最近鄰算法回答我們上面遇到的 “第 5 個顧客最有可能購買什么產(chǎn)品” 這一問題,答案將是一本書。這是因?yàn)榈?5 個顧客與第 1 個顧客之間的距離要比第 5 個顧客與其他任何顧客之間的距離都短(實(shí)際上是短很多)。基于這個模型,可以得出這樣的結(jié)論:由最像第 5 個顧客的顧客可以預(yù)測出第 5 個顧客的行為。
不過,最近鄰的好處遠(yuǎn)不止于此。最近鄰算法可被擴(kuò)展成不僅僅限于一個最近匹配,而是可以包括任意數(shù)量的最近匹配。可將這些最近匹配稱為是 “N-最近鄰”(比如 3-最近鄰)?;氐缴鲜龅睦樱绻覀兿胍赖?5 個顧客最有可能購買的產(chǎn)品,那么這次的結(jié)論是書和 DVD。而對于上述的亞馬遜的例子,如果想要知道某個顧客最有可能購買的 12 個產(chǎn)品,就可以運(yùn)行一個 12-最近鄰算法(但亞馬遜實(shí)際運(yùn)行的算法要遠(yuǎn)比一個簡單的 12-最近鄰算法復(fù)雜)。
并且,此算法不只限于預(yù)測顧客購買哪個產(chǎn)品。它還可被用來預(yù)測一個 Yes/No 的輸出值。考慮上述例子,如果我們將最后一列改為(從顧客 1 到 顧客 4)“Yes,No,Yes,No,”,那么用 1-最近鄰模型可以預(yù)測第 5 個顧客會說 “Yes”,如果用一個 2-最近鄰算法也會得到預(yù)測結(jié)果 “Yes”(顧客 1 和 3 均說 “Yes”),若用 3-最近鄰模型仍會得到 “Yes”(顧客 1 和 3 說 “Yes”,顧客 2 說 “No”,所以它們的平均值是 “Yes”)。
我們考慮的最后一個問題是 “我們應(yīng)該在我們的模型中使用多少鄰?” 啊哈 — 并不是每件事都這么簡單。為了確定所需鄰的最佳數(shù)量,需要進(jìn)行試驗(yàn)。并且,如果要預(yù)測值為 0 和 1 的列的輸出,很顯然需要選擇奇數(shù)個鄰,以便打破平局。
我們將要為我們的最近鄰示例使用的數(shù)據(jù)集應(yīng)該看起來非常熟悉 — 這個數(shù)據(jù)集就與我們在上一篇文章的分類示例中所用的相同。該示例關(guān)于的是一個虛構(gòu)的 BMW 經(jīng)銷店及其向老客戶銷售兩年延保的促銷活動。為了回顧這個數(shù)據(jù)集,如下列出了我在上一篇文章中曾介紹過的一些指標(biāo)。
延保的以往銷售記錄中有 4,500 個數(shù)據(jù)點(diǎn)。數(shù)據(jù)集中的屬性有:收入水平 [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 購買的年/月、顧客是否在過去對延保的促銷有過響應(yīng)。
@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 ...
我們?yōu)楹我褂门c分類例子中相同的數(shù)據(jù)集呢?這是因?yàn)榉诸惸P偷玫降慕Y(jié)果,只有 59 % 的準(zhǔn)確率,而這完全不能接受(比猜想好不到哪去)。我們將提高準(zhǔn)確率并為這個虛構(gòu)的經(jīng)銷商提供一些有用的信息。
將數(shù)據(jù)文件 bmw-training.arff 載入 WEKA,步驟與我們之前在 Preprocess 選項(xiàng)卡中使用的相同。加載數(shù)據(jù)后,屏幕應(yīng)該類似于圖 1。
與我們在之前文章的回歸和分類模型中所做的類似,我們接下來應(yīng)該選擇 Classify 選項(xiàng)卡。在這個選項(xiàng)卡上,我們應(yīng)該選擇 lazy,然后選擇IBk(IB 代表的是 Instance-Based,而 k 則允許我們指定要使用的鄰的數(shù)量)。
現(xiàn)在,我們就準(zhǔn)備好可以在 WEKA 內(nèi)創(chuàng)建我們的模型了。請確保選中 Use training set 以便我們使用剛載入的這個數(shù)據(jù)集來創(chuàng)建我們的模型。 單擊 Start,讓 WEKA 運(yùn)行。圖 3 顯示了一個屏幕快照,清單 3 則包含了此模型的輸出。
=== 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
上述結(jié)果與我們用分類創(chuàng)建模型時的結(jié)果有何差異呢?使用最近鄰的這個模型的準(zhǔn)確率為 89 %,而分類模型的準(zhǔn)確率只有 59 %,所以這絕對是一個很好的開始。接近 90 % 的準(zhǔn)確率是非常可以接受的。讓我們再進(jìn)一步來分析這些結(jié)果的假正和假負(fù)的情況,以便深入了解來自 WEKA 的這些結(jié)果在實(shí)際業(yè)務(wù)中的適用。
此模型的結(jié)果顯示我們有 76 個假正(2.5 %),有 261 個假負(fù)(8.7 %)。請記住在本例中一個假正意味著我們的模型預(yù)測該客戶會購買延保而實(shí)際上卻未購買,而一個假負(fù)則意味著我們的模型預(yù)測客戶不會購買延保而實(shí)際卻購買了。讓我們估測經(jīng)銷商的宣傳單的派發(fā)成本是每個傳單 $3,延保為經(jīng)銷商帶來了 $400 的利潤。這個模型對經(jīng)銷商的成本/收益的預(yù)測應(yīng)為 $400 - (2.5% * $3) - (8.7% * 400) = $365。所以,從此模型看來,這個經(jīng)銷商相當(dāng)有利可圖。與之相比,使用分類模型預(yù)測的成本/收益只有 $400 - (17.2% * $3) - (23.7% * $400) = $304,由此可以看出使用正確的模型可以為此經(jīng)銷商提供 20 % 潛在收入的提高。
您可以自己練習(xí)著在這個模型中嘗試不同數(shù)量的最近鄰(您可以右鍵單擊下一個 “IBk -K 1....”,就會看到一列參數(shù))??梢匀我飧?"KNN"(K-最近鄰)。在本例中您將會看到隨著加入更多的鄰,模型的準(zhǔn)確率實(shí)際上卻降低了。
此模型的一些不盡人意之處:當(dāng)我們談?wù)撓駚嗰R遜這樣的數(shù)據(jù)集時,最近鄰的強(qiáng)大威力是顯而易見的。對于有 2000 萬用戶的亞馬遜,此算法非常準(zhǔn)確,因?yàn)樵趤嗰R遜的數(shù)據(jù)庫中與您有著類似購買習(xí)慣的潛在客戶很多。您的最近鄰會非常相似。因而,所創(chuàng)建的模型會十分準(zhǔn)確和高效。相反,如果能比較的數(shù)據(jù)點(diǎn)相對很少的話,這個模型很快就會損壞,不再準(zhǔn)確。在在線電子商務(wù)店鋪的初期,比如只有 50 個顧客,那么產(chǎn)品推薦特性很可能一點(diǎn)都不準(zhǔn)確,因?yàn)樽罱弻?shí)際上與您本身相差甚遠(yuǎn)。
最近鄰技術(shù)最后的一個挑戰(zhàn)是該算法的計(jì)算成本有可能會很高。在亞馬遜的例子中,對于它的 2000 萬客戶,每個客戶都必須針對其他的 2000 萬客戶進(jìn)行計(jì)算以便找到最近鄰。首先,如果您的業(yè)務(wù)也有 2000 萬的客戶群,那么這便不成問題,因?yàn)槟鷷?cái)源廣進(jìn)。其次,這種類型的計(jì)算非常適合用云來完成,因?yàn)樗鼈兡軌虮环稚⒌皆S多計(jì)算機(jī)上同時完成,并最終完成比較。(比如,Google 的 MapReduce。)第三,實(shí)際上,如果我只是購買了一本書,那么根本不必針對我對比亞馬遜數(shù)據(jù)庫內(nèi)的每個 客戶。只需將我與其他的購書者進(jìn)行對比來尋找最佳匹配,這樣一來,就將潛在的鄰縮小到整個數(shù)據(jù)庫的一部分。
請記?。簲?shù)據(jù)挖掘模型并不只是簡單的輸入-輸出機(jī)制 — 必須先對數(shù)據(jù)進(jìn)行檢查以決定該選擇哪種正確的模型,讓輸入能夠設(shè)法減少計(jì)算時間,而輸出則必須被分析且要確保準(zhǔn)確后才能據(jù)此做出整體的判斷。
進(jìn)一步的閱讀:如果您有興趣進(jìn)一步學(xué)習(xí)最近鄰算法,可以按如下術(shù)語搜索相關(guān)信息:distance weighting、Hamming distance、Mahalanobis distance。
回頁首
有關(guān) WEKA 最酷的一件事情是它不僅是一個獨(dú)立的應(yīng)用程序,而且還是一個完備的 Java JAR 文件,可以將其投入到您服務(wù)器的 lib 文件夾并從您自己的服務(wù)器端代碼進(jìn)行調(diào)用。這能為您的應(yīng)用程序帶來很多有趣的、和重要的功能。您可以添加充分利用了我們到目前所學(xué)的全部數(shù)據(jù)挖掘技術(shù)的報(bào)告。您可以為您的電子商務(wù)店鋪創(chuàng)建一個“產(chǎn)品推薦”小部件,類似于亞馬遜站點(diǎn)上的那個(由于根本不可能為每個顧客都按需這么做,因此需要貫徹這個獨(dú)立的應(yīng)用程序運(yùn)行它)。WEKA 獨(dú)立應(yīng)用程序本身只調(diào)用底層的 WEKA Java API,所以您應(yīng)該已經(jīng)看到過這個 API 的運(yùn)轉(zhuǎn)了。現(xiàn)在,我們應(yīng)該看看如何將它集成到您的自己代碼中。
實(shí)際上,您已經(jīng)下載了這個 WEKA API JAR;它就是您啟動 WEKA Explorer 時調(diào)用的那個 JAR 文件。為了訪問此代碼,讓您的 Java 環(huán)境在此類路徑中包含這個 JAR 文件。在您自己的代碼中使用第三方 JAR 文件的步驟如常。
正如您所想,WEKA API 內(nèi)的這個中心構(gòu)建塊就是數(shù)據(jù)。數(shù)據(jù)挖掘圍繞此數(shù)據(jù)進(jìn)行,當(dāng)然所有我們已經(jīng)學(xué)習(xí)過的這些算法也都是圍繞此數(shù)據(jù)的。那么讓我們看看如何將我們的數(shù)據(jù)轉(zhuǎn)換成 WEKA API 可以使用的格式。讓我們從簡單的開始,先來看看本系列有關(guān)房子價(jià)值的第一篇文章中的那些數(shù)據(jù)。
注: 我最好提前告誡您 WEKA API 有時很難導(dǎo)航。首要的是要復(fù)核所用的 WEKA 的版本和 API 的版本。此 API 在不同的發(fā)布版間變化會很大,以至于代碼可能會完全不同。而且,即便此 API 完備,卻沒有什么非常好的例子可以幫助我們開始(當(dāng)然了,這也是為什么您在閱讀本文的原因)。我使用的是 WEKA V3.6。
清單 4 顯示了如何格式化數(shù)據(jù)以便為 WEKA 所用。
// Define each attribute (or column), and give it a numerical column number // Likely, a better design wouldn't require the column number, but // would instead get it from the index in the container Attribute a1 = new Attribute("houseSize", 0); Attribute a2 = new Attribute("lotSize", 1); Attribute a3 = new Attribute("bedrooms", 2); Attribute a4 = new Attribute("granite", 3); Attribute a5 = new Attribute("bathroom", 4); Attribute a6 = new Attribute("sellingPrice", 5); // Each element must be added to a FastVector, a custom // container used in this version of Weka. // Later versions of Weka corrected this mistake by only // using an ArrayList FastVector attrs = new FastVector(); attrs.addElement(a1); attrs.addElement(a2); attrs.addElement(a3); attrs.addElement(a4); attrs.addElement(a5); attrs.addElement(a6); // Each data instance needs to create an Instance class // The constructor requires the number of columns that // will be defined. In this case, this is a good design, // since you can pass in empty values where they exist. Instance i1 = new Instance(6); i1.setValue(a1, 3529); i1.setValue(a2, 9191); i1.setValue(a3, 6); i1.setValue(a4, 0); i1.setValue(a5, 0); i1.setValue(a6, 205000); .... // Each Instance has to be added to a larger container, the // Instances class. In the constructor for this class, you // must give it a name, pass along the Attributes that // are used in the data set, and the number of // Instance objects to be added. Again, probably not ideal design // to require the number of objects to be added in the constructor, // especially since you can specify 0 here, and then add Instance // objects, and it will return the correct value later (so in // other words, you should just pass in '0' here) Instances dataset = new Instances("housePrices", attrs, 7); dataset.add(i1); dataset.add(i2); dataset.add(i3); dataset.add(i4); dataset.add(i5); dataset.add(i6); dataset.add(i7); // In the Instances class, we need to set the column that is // the output (aka the dependent variable). You should remember // that some data mining methods are used to predict an output // variable, and regression is one of them. dataset.setClassIndex(dataset.numAttributes() - 1);
現(xiàn)在我們已經(jīng)將數(shù)據(jù)載入了 WEKA。雖然比想象中的要稍微難一點(diǎn),但您可以看到編寫自己的包裝器類來快速從數(shù)據(jù)庫提取數(shù)據(jù)并將其放入一個 WEKA 實(shí)例類還是很簡單和有益的。實(shí)際上,我強(qiáng)烈建議如果打算在服務(wù)器上使用 WEKA,那么就不要怕花時間,因?yàn)橐赃@種方式處理數(shù)據(jù)是很繁瑣的。一旦將數(shù)據(jù)放入了這個實(shí)例對象,您就可以在數(shù)據(jù)上進(jìn)行任何您想要的數(shù)據(jù)挖掘了,所以您想要這個步驟盡可能地簡單。
讓我們把我們的數(shù)據(jù)通過回歸模型進(jìn)行處理并確保輸出與我們使用 Weka Explorer 計(jì)算得到的輸出相匹配。實(shí)際上使用 WEKA API 讓數(shù)據(jù)通過回歸模型得到處理非常簡單,遠(yuǎn)簡單于實(shí)際加載數(shù)據(jù)。
// Create the LinearRegression model, which is the data mining // model we're using in this example LinearRegression linearRegression = new LinearRegression(); // This method does the "magic", and will compute the regression // model. It takes the entire dataset we've defined to this point // When this method completes, all our "data mining" will be complete // and it is up to you to get information from the results linearRegression.buildClassifier(dataset); // We are most interested in the computed coefficients in our model, // since those will be used to compute the output values from an // unknown data instance. double[] coef = linearRegression.coefficients(); // Using the values from my house (from the first article), we // plug in the values and multiply them by the coefficients // that the regression model created. Note that we skipped // coefficient[5] as that is 0, because it was the output // variable from our training data double myHouseValue = (coef[0] * 3198) + (coef[1] * 9669) + (coef[2] * 5) + (coef[3] * 3) + (coef[4] * 1) + coef[6]; System.out.println(myHouseValue); // outputs 219328.35717359098 // which matches the output from the earlier article
大功告成!運(yùn)行分類、群集或最近鄰都不如回歸模型簡單,但它們也沒有那么困難。運(yùn)行數(shù)據(jù)挖掘模型要比將數(shù)據(jù)載入模型簡單得多。
我們希望這一小節(jié)能夠讓您產(chǎn)生將 WEKA 集成到您自己的服務(wù)器端代碼的興趣。不管您是運(yùn)營一個電子商務(wù)的店鋪并想為客戶提供更好的產(chǎn)品推薦,還是您有一個禮券促銷活動需要加以改善,抑或是您想要優(yōu)化您的 AdWords 活動,又或者是您想要優(yōu)化您的著陸頁,這些數(shù)據(jù)挖掘技術(shù)都能幫助您在這些領(lǐng)域改善您的結(jié)果。比如,借助于 WEKA API 的內(nèi)置特性,您就可以編寫服務(wù)器端代碼來輪換您的著陸頁并使用數(shù)據(jù)挖掘不斷地分析結(jié)果以找到最為有效的著陸頁。通過在 AdWords 上綜合它與數(shù)據(jù)挖掘分析,您就可以快速找到最佳的途徑來將客戶吸引到您的站點(diǎn)并將客戶的到訪變?yōu)殇N售。
關(guān)于數(shù)據(jù)挖掘技術(shù)中的最近鄰和服務(wù)器端庫怎么理解就分享到這里啦,希望上述內(nèi)容能夠讓大家有所提升。如果想要學(xué)習(xí)更多知識,請大家多多留意小編的更新。謝謝大家關(guān)注一下億速云網(wǎng)站!
免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報(bào),并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。