引入:html
在數據挖掘中,常常須要對一組定義了格式的數據集合進行分析,從而找到蘊含在其中內部的規律(或者說是公式),經典的,好比「啤酒和飲料"問題,就是拿對多個用戶消費行爲進行採樣,或者好比說,房屋經銷商會得到某個地區的商品房信息(面積,房間數,建造年份,總價) ,當他們獲取足夠多的信息以後,他們就能夠對這些數據信息進行數據挖掘從而找出房屋總價和各個自變量的關係。固然了,不是全部的自變量都和目標有關,好比說房屋的顏色也許就是總價沒有太大關係,因此咱們創建的數學模型,必須能」火眼金睛「的識別出那些自變量會引發應變量改變那些不能。java
在JAVA世界中,咱們有了weka,這個能夠很輕鬆的對數據挖掘,對於給定的數據集合,來近似模擬出各類數學模型,以及各類模型的機率統計的評估。app
本例目的:機器學習
(1)演示WEKA控制檯用法ide
(2)演示如何用JAVA的API 來作一樣事情工具
例子:學習
假設咱們有一個需求,是計算信用卡積分,它」也許「取決於若干的信息(好比」月收入「,」每個月工做天數「,」當前信用卡額度「,」歷史統計的按時還款比例」,「曾經的最大透支額」,「銀行貸款的數目」),固然了,這些信息也許會影響信用卡積分,也許不會影響,因此咱們的模型必須去除這些弱影響的因素,從而構建咱們的模型。測試
爲了讓weka進行分析,咱們須要先準備原始數據,按照數據挖掘理論,若是要完備的數據集合的話,固然是數據越多越精確,可是至少應該有N^2個數據(其中N是N個可能影響的自變量的數目),咱們爲了簡單起見,就隨便建立20條mock數據,爲了導入weka工做,咱們將其編輯爲ARFF格式,參見ui
http://www.cs.waikato.ac.nz/~ml/weka/arff.html (固然了,也能夠用普通文本格式或者CSV來表示數據),仍是那句話,數據格式不重要,數據內容最重要。lua
咱們的ARFF文件以下:
@RELATION creditCardScore %%%% %SECTION1:PERSONAL INFO %%%% % %月收入 % @ATTRIBUTE personInfo.monthlySalary NUMERIC %%%% %SECTION2: BUSINESS INFO %%%% % %每個月工做天數 % @ATTRIBUTE businessInfo.workingDayPerMonth NUMERIC %%%% %SECTION 3: CREDIT CARD INFO (信用卡信息) %%%% % %當前額度 % @ATTRIBUTE creditCardInfo.currentLimit NUMERIC % %月度正常還款比例 % @ATTRIBUTE creditCardInfo.percentageOfNormalReturn NUMERIC % %曾經最大透支額 % @ATTRIBUTE creditCardInfo.maximumOverpay NUMERIC %%%% %SECTION 4: FINANCIAL INFO (財政信息) %%%% % %貸款數目 % @ATTRIBUTE financialInfo.personalLoan NUMERIC %%%% %RESULT: CREDIT SCORE(積分) %%%% @ATTRIBUTE creditScore NUMERIC @DATA 10000,22,20000,1, 0, 200000,55 15000,20,30000,0.5,14200,20000, 78 20000,18,40000,0.6,50000,200000,87 30000,22,60000,0.2,30000,150000,67 22000,15,30000,0.7,20000,140000,71 13200,21,18000,0.9,40000,500000,43 15500,20,30000,0.4,14200,20000, 59 25000,26,40000,0.5,50000,200000,88 28670,23,40000,0.7,30000,120000,68 22000,15,40000,0.7,20000,140000,72 10000,18,20000,0.6,30000,150000,47 14300,20,29800,0.5,14200,20000, 72 20000,18,40000,0.9,50000,200000,88 34335,22,50000,0.6,30000,150000,74 24555,15,20000,0.9,20000,120000,79 10055,22,80000,1, 0, 200000,76 15000,20,80000,0.9,90200,20000, 86 25440,17,30000,0.7,50000,200000,82 30000,22,70000,0.2,30000,0, 72 22000,30,80000,0.7,20000,140000,71
假定咱們採用多元線性迴歸模型(由於大致上,信用卡積分是多個因素的加權和,因此它應該知足一個線性模型,咱們也用這種模型)
演示weka控制檯:
當咱們打開weka控制檯,導入這個arff文件後,能夠很輕易的在"Preprocess"看到對於這個ARFF文件格式的定義部分,包括有多少字段,每一個字段的取值,平均值等信息。
而後,當咱們選擇「Classify",再選擇"LinearRegression"分析方法,則能夠很清楚的看到對於當前數據集的分析結果,而且給出數學公式和一些數據統計結論。
從上能夠看出,咱們的信用卡積只和(「月收入」,「正常還款比率」,「最大透支額」,「銀行貸款數量」)有關係,固然了,我這些測試數據是隨便填寫的,現實中可能不是這樣。而後下面給出了模擬的線性公式,在下面給出了一些數學統計的信息。(由於咱們的數據比較亂,因此最終這些結果可能沒有精確的收斂,而是有必定的誤差)
演示java weka API來執行線性迴歸:
咱們最終確定是但願用程序實現,其實還有點小挑戰的,由於有些信息(好比公式信息),沒有現成的API直接拿來用,我仍是經過debug才發現了公式的存在的。
咱們定義一個工具類,它有2個工具方法,一個是獲取ARFF文件的內容定義,一個是對於給定ARFF文件「智能」的挖掘出公式,而且給出數學統計值。
package com.charles.demo; import java.io.File; import weka.classifiers.Evaluation; import weka.classifiers.functions.LinearRegression; import weka.core.Instances; import weka.core.converters.ArffLoader; import weka.core.converters.ConverterUtils.DataSource; /** * 利用weka對給定數據集作線性迴歸,給出其蘊含的公式 * @author charles.wang * */ public class LRRegression { private LRRegression(){} /** * 分析ARFF文件,獲取其文件中的格式定義信息 * @param filePath 傳入的ARFF文件的文件路徑,這裏暫時不支持http和ftp,只支持本地文件 * @return 封裝字符串的文件內容返回對象 * @throws Exception */ public static String parseArffFile(String filePath) throws Exception { // 建立一個arff文件載入器 ArffLoader loader = new ArffLoader(); //載入文件內容,獲取其數據集合 loader.setSource(new File(filePath)); Instances data = loader.getDataSet(); //封裝字符串的文件內容返回對象 StringBuilder sb = new StringBuilder(); sb.append("被讀取的訓練文件路徑爲:" + filePath + "\n\n"); sb.append("訓練文件內容定義爲:" + new Instances(data, 0)); return sb.toString(); } /** * 對ARFF文件中的數據集合作線性迴歸,從而挖掘出其中的公式 * @param filePath 傳入的ARFF文件的文件路徑,這裏暫時不支持http和ftp,只支持本地文件 * @return 線性迴歸運算獲得的公式,以及運算結果的評估 * @throws Exception */ public static String doLinearRegression(String filePath) throws Exception { // 讀訓練數據 DataSource train_data = new DataSource(filePath); // 獲取訓練數據集 Instances insTrain = train_data.getDataSet(); // 設置訓練集中,target的index insTrain.setClassIndex(insTrain.numAttributes() - 1); // 定義分類器的類型 , 咱們採用線性迴歸 LinearRegression lr = new LinearRegression(); // 訓練分類器 lr.buildClassifier(insTrain); // 評估線性迴歸的結果 Evaluation eval = new Evaluation(insTrain); eval.evaluateModel(lr, insTrain);// 評估結果 // 構造結果對象 StringBuilder sb = new StringBuilder(); sb.append("機器學習後產生的線性迴歸公式:\n" + lr.toString() + "\n\n"); sb.append("評估此結果:" + eval.toSummaryString() + "\n"); return sb.toString(); } }
咱們作一個演示,傳入文章開始的ARFF文件,而後分別打印出其定義格式,以及挖掘出的數學公式:
public static void main(String[] args) throws Exception { //演示如何獲取ARFF文件中樣本數據定義格式信息 String arffFileDef = parseArffFile("D:/Framework Study/weka/data/no-linar/creditcard.arff"); System.out.println(arffFileDef); System.out.println(); //演示如何從ARFF文件中挖掘數據聯繫(公式)以及給出數學機率的評定 String evalResult = doLinearRegression("D:/Framework Study/weka/data/no-linar/creditcard.arff"); System.out.println(evalResult); }
最後結果以下:
咱們能夠對比和weka控制檯給出的結果,顯然是一致的。