2016-03-17 22 views
8

Làm cách nào để sử dụng thư viện XGBOOST https://github.com/dmlc/xgboost/ trong C++? Tôi đã thành lập Python và Java API, nhưng tôi không thể tìm thấy API cho C++Sử dụng XGBOOST trong C++

+0

Bạn đã đọc hướng dẫn cài đặt chưa? – kometen

+0

Có, tôi đã đọc hướng dẫn cài đặt, nhưng tôi không thể tìm thấy ví dụ về việc sử dụng xgboost với C++ –

Trả lời

17

tôi đã kết thúc bằng cách sử dụng C API, xem dưới đây một ví dụ:

// create the train data 
int cols=3,rows=5; 
float train[rows][cols]; 
for (int i=0;i<rows;i++) 
    for (int j=0;j<cols;j++) 
     train[i][j] = (i+1) * (j+1); 

float train_labels[rows]; 
for (int i=0;i<rows;i++) 
    train_labels[i] = 1+i*i*i; 


// convert to DMatrix 
DMatrixHandle h_train[1]; 
XGDMatrixCreateFromMat((float *) train, rows, cols, -1, &h_train[0]); 

// load the labels 
XGDMatrixSetFloatInfo(h_train[0], "label", train_labels, rows); 

// read back the labels, just a sanity check 
bst_ulong bst_result; 
const float *out_floats; 
XGDMatrixGetFloatInfo(h_train[0], "label" , &bst_result, &out_floats); 
for (unsigned int i=0;i<bst_result;i++) 
    std::cout << "label[" << i << "]=" << out_floats[i] << std::endl; 

// create the booster and load some parameters 
BoosterHandle h_booster; 
XGBoosterCreate(h_train, 1, &h_booster); 
XGBoosterSetParam(h_booster, "booster", "gbtree"); 
XGBoosterSetParam(h_booster, "objective", "reg:linear"); 
XGBoosterSetParam(h_booster, "max_depth", "5"); 
XGBoosterSetParam(h_booster, "eta", "0.1"); 
XGBoosterSetParam(h_booster, "min_child_weight", "1"); 
XGBoosterSetParam(h_booster, "subsample", "0.5"); 
XGBoosterSetParam(h_booster, "colsample_bytree", "1"); 
XGBoosterSetParam(h_booster, "num_parallel_tree", "1"); 

// perform 200 learning iterations 
for (int iter=0; iter<200; iter++) 
    XGBoosterUpdateOneIter(h_booster, iter, h_train[0]); 

// predict 
const int sample_rows = 5; 
float test[sample_rows][cols]; 
for (int i=0;i<sample_rows;i++) 
    for (int j=0;j<cols;j++) 
     test[i][j] = (i+1) * (j+1); 
DMatrixHandle h_test; 
XGDMatrixCreateFromMat((float *) test, sample_rows, cols, -1, &h_test); 
bst_ulong out_len; 
const float *f; 
XGBoosterPredict(h_booster, h_test, 0,0,&out_len,&f); 

for (unsigned int i=0;i<out_len;i++) 
    std::cout << "prediction[" << i << "]=" << f[i] << std::endl; 


// free xgboost internal structures 
XGDMatrixFree(h_train[0]); 
XGDMatrixFree(h_test); 
XGBoosterFree(h_booster); 
+0

Bạn có biết cách giải phóng 'const float * f;', khi tôi dự đoán lượng lớn dữ liệu, có vẻ như bộ nhớ đó không được giải thoát. Tôi nhìn vào mã 'XGDMatrixFree (h_test)' nên làm điều đó, nhưng vẫn còn rò rỉ bộ nhớ tăng với kích thước h_test! – Khaledvic

+0

Âm thanh như rò rỉ ở nơi khác, bạn có xác nhận với Valgrind không? – Tomer

+1

dường như 'XGBoosterPredict' không phải là chủ đề an toàn, tôi đã gọi nó từ một số lượng lớn các chủ đề, https://github.com/dmlc/xgboost/issues/311 – Khaledvic

0

Không có ví dụ nào tôi biết. có một tệp c_api.h chứa api C/C++ cho gói và bạn sẽ phải tìm cách sử dụng nó. Tôi vừa làm thế. Đã cho tôi một vài giờ đọc mã và thử vài thứ. Nhưng cuối cùng tôi đã tạo ra một ví dụ C++ làm việc của xgboost.

0

Để giải quyết vấn đề này, chúng tôi chạy chương trình xgboost từ C++ mã nguồn.

1

Sử dụng API XGBoost C.

BoosterHandle booster; 
    const char *model_path = "/path/of/model"; 

    // create booster handle first 
    XGBoosterCreate(NULL, 0, &booster); 

    // by default, the seed will be set 0 
    XGBoosterSetParam(booster, "seed", "0"); 

    // load model 
    XGBoosterLoadModel(booster, model_path); 

    const int feat_size = 100; 
    const int num_row = 1; 
    float feat[num_row][feat_size]; 

    // create some fake data for predicting 
    for (int i = 0; i < num_row; ++i) { 
    for(int j = 0; j < feat_size; ++j) { 
     feat[i][j] = (i + 1) * (j + 1) 
    } 
    } 

    // convert 2d array to DMatrix 
    DMatrixHandle dtest; 
    XGDMatrixCreateFromMat(reinterpret_cast<float*>(feat), 
         num_row, feat_size, NAN, &dtest); 

    // predict 
    bst_ulong out_len; 
    const float *f; 
    XGBoosterPredict(booster, dtest, 0, 0, &out_len, &f); 
    assert(out_len == num_row); 
    std::cout << f[0] << std::endl; 

    // free memory 
    XGDMatrixFree(dtest); 
    XGBoosterFree(booster); 

Lưu ý khi bạn muốn tải mô hình hiện có (như các chương trình mã trên), bạn phải đảm bảo định dạng dữ liệu trong đào tạo giống như dự đoán. Vì vậy, nếu bạn dự đoán với XGBoosterPredict, mà chấp nhận một ma trận dày đặc như tham số, bạn phải sử dụng ma trận dày đặc trong đào tạo.

Đào tạo với định dạng libsvm và dự đoán với ma trận dày đặc có thể gây ra những dự đoán sai, như XGBoost FAQ nói:

yếu tố “thưa thớt” được đối xử như thể họ đã “mất tích” bằng cách tăng cường cây, và như số không bởi bộ tăng cường tuyến tính. Đối với các mô hình cây, điều quan trọng là sử dụng các định dạng dữ liệu nhất quán trong quá trình đào tạo và chấm điểm.