1. 程式人生 > >windows下在Java中使用xgboost 詳細配置教程

windows下在Java中使用xgboost 詳細配置教程

1. 資源準備

1.2 java 環境等自行搭建,jre建議使用1.7。使用VS2013 編譯(xgboost JAVA編譯,需使用2013及以上版本). 下載安裝 maven,配置路徑.

2. 編譯

3. 打包

3.1 為了減少以後的導包麻煩,就將 ./xgboost-master/java/ 中的 xgboost4j 與 xgboost4j-demo 和二為一; 本想這裡整理好供大家下載,想想還是寫出來,供大家參考,以後可以自行更換版本~

進入以下路徑:D:\xgboost-master\java\xgboost4j-demo\src\main\java\org\dmlc\xgboost4j ;複製 demo 整個資料夾,到以下資料夾中:

D:\xgboost-master\java\xgboost4j\src\main\java\org\dmlc\xgboost4j; 將 demo 資料夾 copy 進來;完成之後如下:

這裡寫圖片描述

3.2 改寫 xgboost-master\java\xgboost4j中的pom.xml

將以下程式碼,新增進pom.xml 檔案:

<dependency>
            <groupId>org.apache.commons</groupId>
            <artifactId>commons-lang3</artifactId
>
<version>3.4</version> </dependency>

以下為新增完成之後的檔案,可以對比下新增的位置,以後能自行新增。

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"
>
<modelVersion>4.0.0</modelVersion> <groupId>org.dmlc</groupId> <artifactId>xgboost4j</artifactId> <version>1.1</version> <packaging>jar</packaging> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <maven.compiler.source>1.7</maven.compiler.source> <maven.compiler.target>1.7</maven.compiler.target> </properties> <reporting> <plugins> <plugin> <groupId>org.apache.maven.plugins</groupId> <artifactId>maven-javadoc-plugin</artifactId> <version>2.10.3</version> </plugin> </plugins> </reporting> <dependencies> <dependency> <groupId>junit</groupId> <artifactId>junit</artifactId> <version>4.11</version> <scope>test</scope> </dependency> <dependency> <groupId>org.apache.commons</groupId> <artifactId>commons-lang3</artifactId> <version>3.4</version> </dependency> <dependency> <groupId>commons-logging</groupId> <artifactId>commons-logging</artifactId> <version>1.2</version> </dependency> </dependencies> </project>

3.3 copy java xgboost 依賴庫

進入到以下路徑 :D:\xgboost-master\java (以自己的安裝路徑為準),雙擊:create_wrap.bat 。成功之後,就會將你之前編譯生成的 xgboostjavawrapper.dll 檔案拷貝到 D:\xgboost-master\java\xgboost4j\src\main\resources\lib 下,如果剛才那個 .bat 檔案沒有執行成功,可手動將檔案拷貝進去,自己根據路徑建立資料夾就可以了。( ,應該是不需要的)

3.4 mvn package

cmd 命令列,切換到以下路徑,D:\xgboost-master\java\xgboost4j ,執行命令:mvn package

這裡寫圖片描述

4 測試

打包成功就會在 D:\xgboost-master\java\xgboost4j\target 處生成 : xgboost4j-1.1.jar 匯入你的工程就可以工作了。這裡還要提一下,xgboost 還依賴了兩個 jar 包,在下面的工程裡可以看到,自行下載新增。

具體測試步驟:找時間再寫吧,眼花了,貼幾個圖,大家對照著看下應該沒問題(圖片有點大,看不清的可以 Ctri + 滑鼠滑輪,放大點看,^_^!)。

這裡寫圖片描述

測試程式碼在下面貼著:


import java.util.AbstractMap;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import org.dmlc.xgboost4j.Booster;
import org.dmlc.xgboost4j.DMatrix;
import org.dmlc.xgboost4j.util.Trainer;

import org.dmlc.xgboost4j.demo.util.CustomEval;
import org.dmlc.xgboost4j.demo.util.Params;
import org.dmlc.xgboost4j.util.XGBoostError;


public class PredictFirstNtree {   
    public static void main(String[] args) throws XGBoostError {
        // load file from text file, also binary buffer generated by xgboost4j
        DMatrix trainMat = new DMatrix("D:/xgboost-master/demo/data/agaricus.txt.train");
        DMatrix testMat = new DMatrix("D:/xgboost-master/demo/data/agaricus.txt.test");

        //specify parameters
        Params param = new Params() {
            {
                put("eta", 0.001);
                put("max_depth", 3);
                put("eval_metric","auc");
                put("silent", 1);
                put("objective", "binary:logistic");
            }
        };

        //specify watchList
        List<Map.Entry<String, DMatrix>> watchs =  new ArrayList<>();
        watchs.add(new AbstractMap.SimpleEntry<>("train", trainMat));
        watchs.add(new AbstractMap.SimpleEntry<>("test", testMat));

        //train a booster
        int round = 1002;
        Booster booster = Trainer.train(param, trainMat, round, watchs, null, null);

        //predict use 1 tree
        float[][] predicts1 = booster.predict(testMat, false, 1);
        //by default all trees are used to do predict
        float[][] predicts2 = booster.predict(testMat);

        //use a simple evaluation class to check error result
        CustomEval eval = new CustomEval();
        System.out.println("error of predicts1: " + eval.eval(predicts1, testMat));
        System.out.println("error of predicts2: " + eval.eval(predicts2, testMat));
    }
}