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++
Trả lời
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);
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
Âm thanh như rò rỉ ở nơi khác, bạn có xác nhận với Valgrind không? – Tomer
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
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.
Để giải quyết vấn đề này, chúng tôi chạy chương trình xgboost từ C++ mã nguồn.
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.
- 1. Cơ chế sử dụng param 'scale_pos_weight' trong xgboost là gì?
- 2. Đầu ra của XGboost sử dụng 'rank: pairwise' là gì?
- 3. thông số chỉnh XGboost Trong R
- 4. hiểu python xgboost cv
- 5. Hiệu chuẩn với xgboost
- 6. XGBoost XGBClassifier Mặc định trong Python
- 7. Làm thế nào để sử dụng thuật toán XGBoost cho hồi quy trong R?
- 8. Làm thế nào để phân phối mô-đun xgboost để sử dụng trong tia lửa?
- 9. hồi quy đầu ra muti trong xgboost
- 10. Biến thể loại XGBoost: Dummification vs encoding
- 11. hồi quy logistic nhị phân xgboost
- 12. Sử dụng :: trong C++
- 13. python xgboost trên mac cài đặt
- 14. Sự khác nhau giữa mục tiêu và feval trong xgboost
- 15. Tham số "trọng lượng" (DMatrix) được sử dụng trong quy trình tăng cường độ dốc (xgboost) như thế nào?
- 16. sử dụng #define trong C/C++
- 17. Sử dụng mã Python trong C/C++
- 18. Sử dụng enums C cờ trong C++
- 19. Sử dụng C Struct trong Objective C
- 20. Sử dụng C++ trong mục tiêu C++?
- 21. Cách sử dụng mã C trong C++
- 22. sử dụng scanf trong C/C++
- 23. sử dụng chức năng C trong C#
- 24. Sử dụng c: url trong c: set
- 25. Sử dụng NaN trong C++?
- 26. Sử dụng realloc trong C++
- 27. Sử dụng NULL trong C++?
- 28. Sử dụng #undef trong C++
- 29. Sử dụng FillRect() trong C++
- 30. Sử dụng ping trong C#
Bạn đã đọc hướng dẫn cài đặt chưa? – kometen
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++ –