Java整合Weka做線性迴歸的例子__Java

來源:互聯網
上載者:User

之前研究完分類的羅吉斯迴歸,繼續搞一下線性迴歸看看。線性迴歸在資料採礦領域應也是非常常見,即根據現有的資料集(行向量組成的矩陣),(訓練)類比出一個合適的規律(函數),來推測任何新給出的資料群組合(向量)應該得到的值。

具體的描述可以參見各種部落格,怎麼推導的看來看去一知半解,但總而言之結果也簡單,就是計算得到一個“適當”的多元線性函數Y=a0+a1*x1+a2*x2+a3*x3+…+ak*xk。我就不在這裡Ctrl+v了。下面只看看代碼上如何整合。

Weka中有對應的線性迴歸LinearRegression。使用起來道理也一樣,就是先構造模型,然後使用;使用時就是構造一個Instance,然後用classifyInstance函數來得到預測值。

訓練模型

    static AbstractClassifier trainModel(String arffFile, int classIndex) throws Exception {        File inputFile = new File(arffFile); //訓練檔案        ArffLoader loader = new ArffLoader();        loader.setFile(inputFile);        Instances insTrain = loader.getDataSet(); // 讀入訓練檔案        insTrain.setClassIndex(classIndex);        LinearRegression linear = new LinearRegression();        linear.buildClassifier(insTrain);//根據訓練資料構造分類器        return linear;    }
1 2 3 4 5 6 7 8 9 10 11 12 13 1 2 3 4 5 6 7 8 9 10 11 12 13

我使用了IBM技術部落格上的一個資料樣本(根據房子的面積、房間數、浴室數等,預測房子的樓價):

@RELATION house@ATTRIBUTE houseSize NUMERIC@ATTRIBUTE lotSize NUMERIC@ATTRIBUTE bedrooms NUMERIC@ATTRIBUTE granite NUMERIC@ATTRIBUTE bathroom NUMERIC@ATTRIBUTE sellingPrice NUMERIC@DATA3529,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
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

但有一點讓我比較困惑,就是如何構造一個資料執行個體,用來作為模型預測的參數(自變數向量)。因為classifyInstance函數,是接收一個資料執行個體的(即自變數向量)weka.core.Instance,而且搜尋看到人家是這樣構造的:

Instance ins = new weka.core.Instance(numOfFields);
1 1

但實際上這個根本編譯不過,找了原因:weka.core.Instance是一個interface。(難道早期的版本Instance是一個可以執行個體化的類嗎。) 
在Weka API文檔 找找,還是可以看到有其實作類別的。 

這樣一來,代碼就可以寫了:

用模型來預測

    public static void main(String[] args) throws Exception {        final String arffTrainData = "data/house.arff";        AbstractClassifier classifier = trainModel(arffTrainData, 5);        Instance ins = new weka.core.SparseInstance(5);        ins.setValue(0, 990.8);        ins.setValue(1, 1080.8);        ins.setValue(2, 3);        ins.setValue(3, 0);        ins.setValue(4, 1);        double price = classifier.classifyInstance(ins);        System.out.println("Price: " + price);    }
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16

運行一下:

Price: 131311.66927984258
1 1

感興趣看看這個模型是怎麼樣的,可以列印出模型求解出來的各個係數。

LinearRegression linear = new LinearRegression();......for (double coef : linear.coefficients()) {    System.out.println(coef);}
1 2 3 4 5 1 2 3 4 5

運行一下看看,可以得到:

-26.6882400741083687.05512424498315143166.076672278030.042292.090089727380.0-21661.120845270096
1 2 3 4 5 6 7 1 2 3 4 5 6 7

有兩個係數是0,對應arff檔案可以得知,granite 是對結果沒有影響的。第二個0的係數,是不是對應了price價格的位置,因為price是被預測的因變數,所以係數也一定為0。 
因此這個模型的解讀是:

sellingPrice =    -26.6882 * houseSize +      7.0551 * lotSize +  43166.0767 * bedrooms +  42292.0901 * bathroom + -21661.1208

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.