commit
f9541efa01
4
.gitignore
vendored
4
.gitignore
vendored
@ -36,3 +36,7 @@ Debug
|
|||||||
*test*
|
*test*
|
||||||
.Rhistory
|
.Rhistory
|
||||||
*.dll
|
*.dll
|
||||||
|
*i386
|
||||||
|
*x64
|
||||||
|
*dump
|
||||||
|
*save
|
||||||
|
|||||||
@ -3,8 +3,8 @@ Type: Package
|
|||||||
Title: R wrapper of xgboost
|
Title: R wrapper of xgboost
|
||||||
Version: 0.3-0
|
Version: 0.3-0
|
||||||
Date: 2014-08-23
|
Date: 2014-08-23
|
||||||
Author: Tianqi Chen
|
Author: Tianqi Chen, Tong He
|
||||||
Maintainer: Tianqi Chen <tianqi.tchen@gmail.com>
|
Maintainer: Tianqi Chen <tianqi.tchen@gmail.com>, Tong He <hetong007@gmail.com>
|
||||||
Description: xgboost
|
Description: xgboost
|
||||||
License: See LICENSE file
|
License: See LICENSE file
|
||||||
URL: https://github.com/tqchen/xgboost
|
URL: https://github.com/tqchen/xgboost
|
||||||
|
|||||||
@ -2,17 +2,10 @@ importClassesFrom("Matrix", dgCMatrix, dgeMatrix)
|
|||||||
|
|
||||||
export(xgboost)
|
export(xgboost)
|
||||||
export(xgb.DMatrix)
|
export(xgb.DMatrix)
|
||||||
export(xgb.getinfo)
|
|
||||||
export(xgb.setinfo)
|
|
||||||
|
|
||||||
# exportClasses(xgb.Boost)
|
|
||||||
exportMethods(predict)
|
exportMethods(predict)
|
||||||
|
exportMethods(getinfo)
|
||||||
# export(xgb.Booster)
|
export(xgb.train)
|
||||||
# export(xgb.train)
|
export(xgb.save)
|
||||||
# export(xgb.save)
|
export(xgb.load)
|
||||||
# export(xgb.predict)
|
export(xgb.dump)
|
||||||
# export(xgb.dump)
|
export(xgb.DMatrix.save)
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
21
R-package/R/getinfo.xgb.DMatrix.R
Normal file
21
R-package/R/getinfo.xgb.DMatrix.R
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
setClass('xgb.DMatrix')
|
||||||
|
|
||||||
|
getinfo <- function(object, ...){
|
||||||
|
UseMethod("getinfo")
|
||||||
|
}
|
||||||
|
|
||||||
|
setMethod("getinfo", signature = "xgb.DMatrix",
|
||||||
|
definition = function(object, name) {
|
||||||
|
if (typeof(name) != "character") {
|
||||||
|
stop("xgb.getinfo: name must be character")
|
||||||
|
}
|
||||||
|
if (class(object) != "xgb.DMatrix") {
|
||||||
|
stop("xgb.setinfo: first argument dtrain must be xgb.DMatrix")
|
||||||
|
}
|
||||||
|
if (name != "label" && name != "weight" && name != "base_margin") {
|
||||||
|
stop(paste("xgb.getinfo: unknown info name", name))
|
||||||
|
}
|
||||||
|
ret <- .Call("XGDMatrixGetInfo_R", object, name, PACKAGE = "xgboost")
|
||||||
|
return(ret)
|
||||||
|
})
|
||||||
|
|
||||||
13
R-package/R/predict.xgb.Booster.R
Normal file
13
R-package/R/predict.xgb.Booster.R
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
#' @export
|
||||||
|
setClass("xgb.Booster")
|
||||||
|
|
||||||
|
#' @export
|
||||||
|
setMethod("predict", signature = "xgb.Booster",
|
||||||
|
definition = function(object, newdata, outputmargin = FALSE) {
|
||||||
|
if (class(newdata) != "xgb.DMatrix") {
|
||||||
|
newdata <- xgb.DMatrix(newdata)
|
||||||
|
}
|
||||||
|
ret <- .Call("XGBoosterPredict_R", object, newdata, as.integer(outputmargin), PACKAGE = "xgboost")
|
||||||
|
return(ret)
|
||||||
|
})
|
||||||
|
|
||||||
@ -1,16 +0,0 @@
|
|||||||
#' @export
|
|
||||||
setClass("xgb.Booster")
|
|
||||||
|
|
||||||
#' @export
|
|
||||||
setMethod("predict",
|
|
||||||
signature = "xgb.Booster",
|
|
||||||
definition = function(object, newdata, outputmargin = FALSE)
|
|
||||||
{
|
|
||||||
if (class(newdata) != "xgb.DMatrix") {
|
|
||||||
newdata = xgb.DMatrix(newdata)
|
|
||||||
}
|
|
||||||
ret <- .Call("XGBoosterPredict_R", object, newdata,
|
|
||||||
as.integer(outputmargin), PACKAGE="xgboost")
|
|
||||||
return(ret)
|
|
||||||
})
|
|
||||||
|
|
||||||
135
R-package/R/utils.R
Normal file
135
R-package/R/utils.R
Normal file
@ -0,0 +1,135 @@
|
|||||||
|
# depends on matrix
|
||||||
|
.onLoad <- function(libname, pkgname) {
|
||||||
|
library.dynam("xgboost", pkgname, libname)
|
||||||
|
}
|
||||||
|
.onUnload <- function(libpath) {
|
||||||
|
library.dynam.unload("xgboost", libpath)
|
||||||
|
}
|
||||||
|
|
||||||
|
# set information into dmatrix, this mutate dmatrix
|
||||||
|
xgb.setinfo <- function(dmat, name, info) {
|
||||||
|
if (class(dmat) != "xgb.DMatrix") {
|
||||||
|
stop("xgb.setinfo: first argument dtrain must be xgb.DMatrix")
|
||||||
|
}
|
||||||
|
if (name == "label") {
|
||||||
|
.Call("XGDMatrixSetInfo_R", dmat, name, as.numeric(info),
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
|
if (name == "weight") {
|
||||||
|
.Call("XGDMatrixSetInfo_R", dmat, name, as.numeric(info),
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
|
if (name == "base_margin") {
|
||||||
|
.Call("XGDMatrixSetInfo_R", dmat, name, as.numeric(info),
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
|
if (name == "group") {
|
||||||
|
.Call("XGDMatrixSetInfo_R", dmat, name, as.integer(info),
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
|
stop(paste("xgb.setinfo: unknown info name", name))
|
||||||
|
return(FALSE)
|
||||||
|
}
|
||||||
|
|
||||||
|
# construct a Booster from cachelist
|
||||||
|
xgb.Booster <- function(params = list(), cachelist = list(), modelfile = NULL) {
|
||||||
|
if (typeof(cachelist) != "list") {
|
||||||
|
stop("xgb.Booster: only accepts list of DMatrix as cachelist")
|
||||||
|
}
|
||||||
|
for (dm in cachelist) {
|
||||||
|
if (class(dm) != "xgb.DMatrix") {
|
||||||
|
stop("xgb.Booster: only accepts list of DMatrix as cachelist")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
handle <- .Call("XGBoosterCreate_R", cachelist, PACKAGE = "xgboost")
|
||||||
|
.Call("XGBoosterSetParam_R", handle, "seed", "0", PACKAGE = "xgboost")
|
||||||
|
if (length(params) != 0) {
|
||||||
|
for (i in 1:length(params)) {
|
||||||
|
p <- params[i]
|
||||||
|
.Call("XGBoosterSetParam_R", handle, names(p), as.character(p),
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!is.null(modelfile)) {
|
||||||
|
if (typeof(modelfile) != "character") {
|
||||||
|
stop("xgb.Booster: modelfile must be character")
|
||||||
|
}
|
||||||
|
.Call("XGBoosterLoadModel_R", handle, modelfile, PACKAGE = "xgboost")
|
||||||
|
}
|
||||||
|
return(structure(handle, class = "xgb.Booster"))
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
# predict, depreciated
|
||||||
|
xgb.predict <- function(booster, dmat, outputmargin = FALSE) {
|
||||||
|
if (class(booster) != "xgb.Booster") {
|
||||||
|
stop("xgb.predict: first argument must be type xgb.Booster")
|
||||||
|
}
|
||||||
|
if (class(dmat) != "xgb.DMatrix") {
|
||||||
|
stop("xgb.predict: second argument must be type xgb.DMatrix")
|
||||||
|
}
|
||||||
|
ret <- .Call("XGBoosterPredict_R", booster, dmat, as.integer(outputmargin),
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
return(ret)
|
||||||
|
}
|
||||||
|
|
||||||
|
## ----the following are low level iteratively function, not needed if
|
||||||
|
## you do not want to use them ---------------------------------------
|
||||||
|
|
||||||
|
# iteratively update booster with dtrain
|
||||||
|
xgb.iter.update <- function(booster, dtrain, iter) {
|
||||||
|
if (class(booster) != "xgb.Booster") {
|
||||||
|
stop("xgb.iter.update: first argument must be type xgb.Booster")
|
||||||
|
}
|
||||||
|
if (class(dtrain) != "xgb.DMatrix") {
|
||||||
|
stop("xgb.iter.update: second argument must be type xgb.DMatrix")
|
||||||
|
}
|
||||||
|
.Call("XGBoosterUpdateOneIter_R", booster, as.integer(iter), dtrain,
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
|
|
||||||
|
# iteratively update booster with customized statistics
|
||||||
|
xgb.iter.boost <- function(booster, dtrain, gpair) {
|
||||||
|
if (class(booster) != "xgb.Booster") {
|
||||||
|
stop("xgb.iter.update: first argument must be type xgb.Booster")
|
||||||
|
}
|
||||||
|
if (class(dtrain) != "xgb.DMatrix") {
|
||||||
|
stop("xgb.iter.update: second argument must be type xgb.DMatrix")
|
||||||
|
}
|
||||||
|
.Call("XGBoosterBoostOneIter_R", booster, dtrain, gpair$grad, gpair$hess,
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
|
|
||||||
|
# iteratively evaluate one iteration
|
||||||
|
xgb.iter.eval <- function(booster, watchlist, iter) {
|
||||||
|
if (class(booster) != "xgb.Booster") {
|
||||||
|
stop("xgb.eval: first argument must be type xgb.Booster")
|
||||||
|
}
|
||||||
|
if (typeof(watchlist) != "list") {
|
||||||
|
stop("xgb.eval: only accepts list of DMatrix as watchlist")
|
||||||
|
}
|
||||||
|
for (w in watchlist) {
|
||||||
|
if (class(w) != "xgb.DMatrix") {
|
||||||
|
stop("xgb.eval: watch list can only contain xgb.DMatrix")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
evnames <- list()
|
||||||
|
if (length(watchlist) != 0) {
|
||||||
|
for (i in 1:length(watchlist)) {
|
||||||
|
w <- watchlist[i]
|
||||||
|
if (length(names(w)) == 0) {
|
||||||
|
stop("xgb.eval: name tag must be presented for every elements in watchlist")
|
||||||
|
}
|
||||||
|
evnames <- append(evnames, names(w))
|
||||||
|
}
|
||||||
|
}
|
||||||
|
msg <- .Call("XGBoosterEvalOneIter_R", booster, as.integer(iter), watchlist,
|
||||||
|
evnames, PACKAGE = "xgboost")
|
||||||
|
return(msg)
|
||||||
|
}
|
||||||
26
R-package/R/xgb.DMatrix.R
Normal file
26
R-package/R/xgb.DMatrix.R
Normal file
@ -0,0 +1,26 @@
|
|||||||
|
# constructing DMatrix
|
||||||
|
xgb.DMatrix <- function(data, info = list(), missing = 0, ...) {
|
||||||
|
if (typeof(data) == "character") {
|
||||||
|
handle <- .Call("XGDMatrixCreateFromFile_R", data, as.integer(FALSE),
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
} else if (is.matrix(data)) {
|
||||||
|
handle <- .Call("XGDMatrixCreateFromMat_R", data, missing,
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
} else if (class(data) == "dgCMatrix") {
|
||||||
|
handle <- .Call("XGDMatrixCreateFromCSC_R", data@p, data@i, data@x,
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
} else {
|
||||||
|
stop(paste("xgb.DMatrix: does not support to construct from ",
|
||||||
|
typeof(data)))
|
||||||
|
}
|
||||||
|
dmat <- structure(handle, class = "xgb.DMatrix")
|
||||||
|
|
||||||
|
info <- append(info, list(...))
|
||||||
|
if (length(info) == 0)
|
||||||
|
return(dmat)
|
||||||
|
for (i in 1:length(info)) {
|
||||||
|
p <- info[i]
|
||||||
|
xgb.setinfo(dmat, names(p), p[[1]])
|
||||||
|
}
|
||||||
|
return(dmat)
|
||||||
|
}
|
||||||
13
R-package/R/xgb.DMatrix.save.R
Normal file
13
R-package/R/xgb.DMatrix.save.R
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
# save model or DMatrix to file
|
||||||
|
xgb.DMatrix.save <- function(handle, fname) {
|
||||||
|
if (typeof(fname) != "character") {
|
||||||
|
stop("xgb.save: fname must be character")
|
||||||
|
}
|
||||||
|
if (class(handle) == "xgb.DMatrix") {
|
||||||
|
.Call("XGDMatrixSaveBinary_R", handle, fname, as.integer(FALSE),
|
||||||
|
PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
|
stop("xgb.save: the input must be either xgb.DMatrix or xgb.Booster")
|
||||||
|
return(FALSE)
|
||||||
|
}
|
||||||
@ -1,222 +0,0 @@
|
|||||||
# depends on matrix
|
|
||||||
.onLoad <- function(libname, pkgname) {
|
|
||||||
library.dynam("xgboost", pkgname, libname);
|
|
||||||
}
|
|
||||||
.onUnload <- function(libpath) {
|
|
||||||
library.dynam.unload("xgboost", libpath);
|
|
||||||
}
|
|
||||||
|
|
||||||
# constructing DMatrix
|
|
||||||
xgb.DMatrix <- function(data, info=list(), missing=0.0) {
|
|
||||||
if (typeof(data) == "character") {
|
|
||||||
handle <- .Call("XGDMatrixCreateFromFile_R", data, as.integer(FALSE), PACKAGE="xgboost")
|
|
||||||
} else if(is.matrix(data)) {
|
|
||||||
handle <- .Call("XGDMatrixCreateFromMat_R", data, missing, PACKAGE="xgboost")
|
|
||||||
} else if(class(data) == "dgCMatrix") {
|
|
||||||
handle <- .Call("XGDMatrixCreateFromCSC_R", data@p, data@i, data@x, PACKAGE="xgboost")
|
|
||||||
} else {
|
|
||||||
stop(paste("xgb.DMatrix: does not support to construct from ", typeof(data)))
|
|
||||||
}
|
|
||||||
dmat <- structure(handle, class="xgb.DMatrix")
|
|
||||||
if (length(info) != 0) {
|
|
||||||
for (i in 1:length(info)) {
|
|
||||||
p <- info[i]
|
|
||||||
xgb.setinfo(dmat, names(p), p[[1]])
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(dmat)
|
|
||||||
}
|
|
||||||
# get information from dmatrix
|
|
||||||
xgb.getinfo <- function(dmat, name) {
|
|
||||||
if (typeof(name) != "character") {
|
|
||||||
stop("xgb.getinfo: name must be character")
|
|
||||||
}
|
|
||||||
if (class(dmat) != "xgb.DMatrix") {
|
|
||||||
stop("xgb.setinfo: first argument dtrain must be xgb.DMatrix");
|
|
||||||
}
|
|
||||||
if (name != "label" &&
|
|
||||||
name != "weight" &&
|
|
||||||
name != "base_margin" ) {
|
|
||||||
stop(paste("xgb.getinfo: unknown info name", name))
|
|
||||||
}
|
|
||||||
ret <- .Call("XGDMatrixGetInfo_R", dmat, name, PACKAGE="xgboost")
|
|
||||||
return(ret)
|
|
||||||
}
|
|
||||||
# set information into dmatrix, this mutate dmatrix
|
|
||||||
xgb.setinfo <- function(dmat, name, info) {
|
|
||||||
if (class(dmat) != "xgb.DMatrix") {
|
|
||||||
stop("xgb.setinfo: first argument dtrain must be xgb.DMatrix");
|
|
||||||
}
|
|
||||||
if (name == "label") {
|
|
||||||
.Call("XGDMatrixSetInfo_R", dmat, name, as.numeric(info), PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
if (name == "weight") {
|
|
||||||
.Call("XGDMatrixSetInfo_R", dmat, name, as.numeric(info), PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
if (name == "base_margin") {
|
|
||||||
.Call("XGDMatrixSetInfo_R", dmat, name, as.numeric(info), PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
if (name == "group") {
|
|
||||||
.Call("XGDMatrixSetInfo_R", dmat, name, as.integer(info), PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
stop(pase("xgb.setinfo: unknown info name", name))
|
|
||||||
return(FALSE)
|
|
||||||
}
|
|
||||||
# construct a Booster from cachelist
|
|
||||||
xgb.Booster <- function(params = list(), cachelist = list(), modelfile = NULL) {
|
|
||||||
if (typeof(cachelist) != "list") {
|
|
||||||
stop("xgb.Booster: only accepts list of DMatrix as cachelist")
|
|
||||||
}
|
|
||||||
for (dm in cachelist) {
|
|
||||||
if (class(dm) != "xgb.DMatrix") {
|
|
||||||
stop("xgb.Booster: only accepts list of DMatrix as cachelist")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
handle <- .Call("XGBoosterCreate_R", cachelist, PACKAGE="xgboost")
|
|
||||||
.Call("XGBoosterSetParam_R", handle, "seed", "0", PACKAGE="xgboost")
|
|
||||||
if (length(params) != 0) {
|
|
||||||
for (i in 1:length(params)) {
|
|
||||||
p <- params[i]
|
|
||||||
.Call("XGBoosterSetParam_R", handle, names(p), as.character(p), PACKAGE="xgboost")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if (!is.null(modelfile)) {
|
|
||||||
if (typeof(modelfile) != "character"){
|
|
||||||
stop("xgb.Booster: modelfile must be character");
|
|
||||||
}
|
|
||||||
.Call("XGBoosterLoadModel_R", handle, modelfile, PACKAGE="xgboost")
|
|
||||||
}
|
|
||||||
return(structure(handle, class="xgb.Booster"))
|
|
||||||
}
|
|
||||||
# train a model using given parameters
|
|
||||||
xgb.train <- function(params, dtrain, nrounds=10, watchlist=list(), obj=NULL, feval=NULL) {
|
|
||||||
if (typeof(params) != "list") {
|
|
||||||
stop("xgb.train: first argument params must be list");
|
|
||||||
}
|
|
||||||
if (class(dtrain) != "xgb.DMatrix") {
|
|
||||||
stop("xgb.train: second argument dtrain must be xgb.DMatrix");
|
|
||||||
}
|
|
||||||
bst <- xgb.Booster(params, append(watchlist,dtrain))
|
|
||||||
for (i in 1:nrounds) {
|
|
||||||
if (is.null(obj)) {
|
|
||||||
succ <- xgb.iter.update(bst, dtrain, i-1)
|
|
||||||
} else {
|
|
||||||
pred <- xgb.predict(bst, dtrain)
|
|
||||||
gpair <- obj(pred, dtrain)
|
|
||||||
succ <- xgb.iter.boost(bst, dtrain, gpair)
|
|
||||||
}
|
|
||||||
if (length(watchlist) != 0) {
|
|
||||||
if (is.null(feval)) {
|
|
||||||
msg <- xgb.iter.eval(bst, watchlist, i-1)
|
|
||||||
cat(msg); cat("\n")
|
|
||||||
} else {
|
|
||||||
cat("["); cat(i); cat("]");
|
|
||||||
for (j in 1:length(watchlist)) {
|
|
||||||
w <- watchlist[j]
|
|
||||||
if (length(names(w)) == 0) {
|
|
||||||
stop("xgb.eval: name tag must be presented for every elements in watchlist")
|
|
||||||
}
|
|
||||||
ret <- feval(xgb.predict(bst, w[[1]]), w[[1]])
|
|
||||||
cat("\t"); cat(names(w)); cat("-"); cat(ret$metric);
|
|
||||||
cat(":"); cat(ret$value)
|
|
||||||
}
|
|
||||||
cat("\n")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return(bst)
|
|
||||||
}
|
|
||||||
# save model or DMatrix to file
|
|
||||||
xgb.save <- function(handle, fname) {
|
|
||||||
if (typeof(fname) != "character") {
|
|
||||||
stop("xgb.save: fname must be character")
|
|
||||||
}
|
|
||||||
if (class(handle) == "xgb.Booster") {
|
|
||||||
.Call("XGBoosterSaveModel_R", handle, fname, PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
if (class(handle) == "xgb.DMatrix") {
|
|
||||||
.Call("XGDMatrixSaveBinary_R", handle, fname, as.integer(FALSE), PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
stop("xgb.save: the input must be either xgb.DMatrix or xgb.Booster")
|
|
||||||
return(FALSE)
|
|
||||||
}
|
|
||||||
# predict
|
|
||||||
xgb.predict <- function(booster, dmat, outputmargin = FALSE) {
|
|
||||||
if (class(booster) != "xgb.Booster") {
|
|
||||||
stop("xgb.predict: first argument must be type xgb.Booster")
|
|
||||||
}
|
|
||||||
if (class(dmat) != "xgb.DMatrix") {
|
|
||||||
stop("xgb.predict: second argument must be type xgb.DMatrix")
|
|
||||||
}
|
|
||||||
ret <- .Call("XGBoosterPredict_R", booster, dmat, as.integer(outputmargin), PACKAGE="xgboost")
|
|
||||||
return(ret)
|
|
||||||
}
|
|
||||||
# dump model
|
|
||||||
xgb.dump <- function(booster, fname, fmap = "") {
|
|
||||||
if (class(booster) != "xgb.Booster") {
|
|
||||||
stop("xgb.dump: first argument must be type xgb.Booster")
|
|
||||||
}
|
|
||||||
if (typeof(fname) != "character"){
|
|
||||||
stop("xgb.dump: second argument must be type character")
|
|
||||||
}
|
|
||||||
.Call("XGBoosterDumpModel_R", booster, fname, fmap, PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
##--------------------------------------
|
|
||||||
# the following are low level iteratively function, not needed
|
|
||||||
# if you do not want to use them
|
|
||||||
#---------------------------------------
|
|
||||||
# iteratively update booster with dtrain
|
|
||||||
xgb.iter.update <- function(booster, dtrain, iter) {
|
|
||||||
if (class(booster) != "xgb.Booster") {
|
|
||||||
stop("xgb.iter.update: first argument must be type xgb.Booster")
|
|
||||||
}
|
|
||||||
if (class(dtrain) != "xgb.DMatrix") {
|
|
||||||
stop("xgb.iter.update: second argument must be type xgb.DMatrix")
|
|
||||||
}
|
|
||||||
.Call("XGBoosterUpdateOneIter_R", booster, as.integer(iter), dtrain, PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
# iteratively update booster with customized statistics
|
|
||||||
xgb.iter.boost <- function(booster, dtrain, gpair) {
|
|
||||||
if (class(booster) != "xgb.Booster") {
|
|
||||||
stop("xgb.iter.update: first argument must be type xgb.Booster")
|
|
||||||
}
|
|
||||||
if (class(dtrain) != "xgb.DMatrix") {
|
|
||||||
stop("xgb.iter.update: second argument must be type xgb.DMatrix")
|
|
||||||
}
|
|
||||||
.Call("XGBoosterBoostOneIter_R", booster, dtrain, gpair$grad, gpair$hess, PACKAGE="xgboost")
|
|
||||||
return(TRUE)
|
|
||||||
}
|
|
||||||
# iteratively evaluate one iteration
|
|
||||||
xgb.iter.eval <- function(booster, watchlist, iter) {
|
|
||||||
if (class(booster) != "xgb.Booster") {
|
|
||||||
stop("xgb.eval: first argument must be type xgb.Booster")
|
|
||||||
}
|
|
||||||
if (typeof(watchlist) != "list") {
|
|
||||||
stop("xgb.eval: only accepts list of DMatrix as watchlist")
|
|
||||||
}
|
|
||||||
for (w in watchlist) {
|
|
||||||
if (class(w) != "xgb.DMatrix") {
|
|
||||||
stop("xgb.eval: watch list can only contain xgb.DMatrix")
|
|
||||||
}
|
|
||||||
}
|
|
||||||
evnames <- list()
|
|
||||||
if (length(watchlist) != 0) {
|
|
||||||
for (i in 1:length(watchlist)) {
|
|
||||||
w <- watchlist[i]
|
|
||||||
if (length(names(w)) == 0) {
|
|
||||||
stop("xgb.eval: name tag must be presented for every elements in watchlist")
|
|
||||||
}
|
|
||||||
evnames <- append(evnames, names(w))
|
|
||||||
}
|
|
||||||
}
|
|
||||||
msg <- .Call("XGBoosterEvalOneIter_R", booster, as.integer(iter), watchlist, evnames, PACKAGE="xgboost")
|
|
||||||
return(msg)
|
|
||||||
}
|
|
||||||
11
R-package/R/xgb.dump.R
Normal file
11
R-package/R/xgb.dump.R
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
# dump model
|
||||||
|
xgb.dump <- function(booster, fname, fmap = "") {
|
||||||
|
if (class(booster) != "xgb.Booster") {
|
||||||
|
stop("xgb.dump: first argument must be type xgb.Booster")
|
||||||
|
}
|
||||||
|
if (typeof(fname) != "character") {
|
||||||
|
stop("xgb.dump: second argument must be type character")
|
||||||
|
}
|
||||||
|
.Call("XGBoosterDumpModel_R", booster, fname, fmap, PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
5
R-package/R/xgb.load.R
Normal file
5
R-package/R/xgb.load.R
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
xgb.load <- function(modelfile) {
|
||||||
|
if (is.null(modelfile))
|
||||||
|
stop("xgb.load: modelfile cannot be NULL")
|
||||||
|
xgb.Booster(modelfile = modelfile)
|
||||||
|
}
|
||||||
12
R-package/R/xgb.save.R
Normal file
12
R-package/R/xgb.save.R
Normal file
@ -0,0 +1,12 @@
|
|||||||
|
# save model or DMatrix to file
|
||||||
|
xgb.save <- function(handle, fname) {
|
||||||
|
if (typeof(fname) != "character") {
|
||||||
|
stop("xgb.save: fname must be character")
|
||||||
|
}
|
||||||
|
if (class(handle) == "xgb.Booster") {
|
||||||
|
.Call("XGBoosterSaveModel_R", handle, fname, PACKAGE = "xgboost")
|
||||||
|
return(TRUE)
|
||||||
|
}
|
||||||
|
stop("xgb.save: the input must be either xgb.DMatrix or xgb.Booster")
|
||||||
|
return(FALSE)
|
||||||
|
}
|
||||||
47
R-package/R/xgb.train.R
Normal file
47
R-package/R/xgb.train.R
Normal file
@ -0,0 +1,47 @@
|
|||||||
|
# train a model using given parameters
|
||||||
|
xgb.train <- function(params=list(), dtrain, nrounds = 10, watchlist = list(),
|
||||||
|
obj = NULL, feval = NULL, ...) {
|
||||||
|
if (typeof(params) != "list") {
|
||||||
|
stop("xgb.train: first argument params must be list")
|
||||||
|
}
|
||||||
|
if (class(dtrain) != "xgb.DMatrix") {
|
||||||
|
stop("xgb.train: second argument dtrain must be xgb.DMatrix")
|
||||||
|
}
|
||||||
|
params = append(params, list(...))
|
||||||
|
bst <- xgb.Booster(params, append(watchlist, dtrain))
|
||||||
|
for (i in 1:nrounds) {
|
||||||
|
if (is.null(obj)) {
|
||||||
|
succ <- xgb.iter.update(bst, dtrain, i - 1)
|
||||||
|
} else {
|
||||||
|
pred <- xgb.predict(bst, dtrain)
|
||||||
|
gpair <- obj(pred, dtrain)
|
||||||
|
succ <- xgb.iter.boost(bst, dtrain, gpair)
|
||||||
|
}
|
||||||
|
if (length(watchlist) != 0) {
|
||||||
|
if (is.null(feval)) {
|
||||||
|
msg <- xgb.iter.eval(bst, watchlist, i - 1)
|
||||||
|
cat(msg)
|
||||||
|
cat("\n")
|
||||||
|
} else {
|
||||||
|
cat("[")
|
||||||
|
cat(i)
|
||||||
|
cat("]")
|
||||||
|
for (j in 1:length(watchlist)) {
|
||||||
|
w <- watchlist[j]
|
||||||
|
if (length(names(w)) == 0) {
|
||||||
|
stop("xgb.eval: name tag must be presented for every elements in watchlist")
|
||||||
|
}
|
||||||
|
ret <- feval(xgb.predict(bst, w[[1]]), w[[1]])
|
||||||
|
cat("\t")
|
||||||
|
cat(names(w))
|
||||||
|
cat("-")
|
||||||
|
cat(ret$metric)
|
||||||
|
cat(":")
|
||||||
|
cat(ret$value)
|
||||||
|
}
|
||||||
|
cat("\n")
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return(bst)
|
||||||
|
}
|
||||||
@ -1,24 +1,33 @@
|
|||||||
# Main function for xgboost-package
|
# Main function for xgboost-package
|
||||||
|
|
||||||
xgboost = function(x=NULL,y=NULL,file=NULL,nrounds=10,params,watchlist=list(),
|
xgboost <- function(data = NULL, label = NULL, params = list(), nrounds = 10,
|
||||||
obj=NULL, feval=NULL, margin=NULL)
|
verbose = 1, ...) {
|
||||||
{
|
inClass <- class(data)
|
||||||
if (is.null(x) && is.null(y))
|
if (inClass == "dgCMatrix" || inClass == "matrix") {
|
||||||
{
|
if (is.null(label))
|
||||||
if (is.null(file))
|
stop("xgboost: need label when data is a matrix")
|
||||||
stop('xgboost need input data, either R objects or local files.')
|
dtrain <- xgb.DMatrix(data, label = label)
|
||||||
dtrain = xgb.DMatrix(file)
|
} else {
|
||||||
|
if (!is.null(label))
|
||||||
|
warning("xgboost: label will be ignored.")
|
||||||
|
if (inClass == "character")
|
||||||
|
dtrain <- xgb.DMatrix(data) else if (inClass == "xgb.DMatrix")
|
||||||
|
dtrain <- data else stop("xgboost: Invalid input of data")
|
||||||
}
|
}
|
||||||
else
|
|
||||||
dtrain = xgb.DMatrix(x, info=list(label=y))
|
if (verbose > 1) {
|
||||||
if (!is.null(margin))
|
silent <- 0
|
||||||
{
|
} else {
|
||||||
succ <- xgb.setinfo(dtrain, "base_margin", margin)
|
silent <- 1
|
||||||
if (!succ)
|
|
||||||
warning('Attemp to use margin failed.')
|
|
||||||
}
|
}
|
||||||
bst <- xgb.train(params, dtrain, nrounds, watchlist, obj, feval)
|
|
||||||
|
params <- append(params, list(silent = silent))
|
||||||
|
params <- append(params, list(...))
|
||||||
|
|
||||||
|
if (verbose > 0)
|
||||||
|
watchlist <- list(train = dtrain) else watchlist <- list()
|
||||||
|
|
||||||
|
bst <- xgb.train(params, dtrain, nrounds, watchlist)
|
||||||
|
|
||||||
return(bst)
|
return(bst)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@ -1,10 +1,10 @@
|
|||||||
This is subfolder for experimental version of R package.
|
This is subfolder for experimental version of R package.
|
||||||
|
|
||||||
Not yet ready.
|
|
||||||
|
|
||||||
Installation:
|
Installation:
|
||||||
|
|
||||||
```r
|
```r
|
||||||
require(devtools)
|
require(devtools)
|
||||||
install_github('xgboost','tqchen',subdir='R-package')
|
install_github('xgboost','tqchen',subdir='R-package')
|
||||||
```
|
```
|
||||||
|
|
||||||
|
Please visit [demo](https://github.com/tqchen/xgboost/blob/master/R-package/demo/demo.R) for more details.
|
||||||
|
|||||||
151
R-package/demo/demo.R
Normal file
151
R-package/demo/demo.R
Normal file
@ -0,0 +1,151 @@
|
|||||||
|
require(xgboost)
|
||||||
|
require(methods)
|
||||||
|
|
||||||
|
# helper function to read libsvm format this is very badly written, load in dense, and convert to sparse
|
||||||
|
# use this only for demo purpose adopted from
|
||||||
|
# https://github.com/zygmuntz/r-libsvm-format-read-write/blob/master/f_read.libsvm.r
|
||||||
|
read.libsvm <- function(fname, maxcol) {
|
||||||
|
content <- readLines(fname)
|
||||||
|
nline <- length(content)
|
||||||
|
label <- numeric(nline)
|
||||||
|
mat <- matrix(0, nline, maxcol + 1)
|
||||||
|
for (i in 1:nline) {
|
||||||
|
arr <- as.vector(strsplit(content[i], " ")[[1]])
|
||||||
|
label[i] <- as.numeric(arr[[1]])
|
||||||
|
for (j in 2:length(arr)) {
|
||||||
|
kv <- strsplit(arr[j], ":")[[1]]
|
||||||
|
# to avoid 0 index
|
||||||
|
findex <- as.integer(kv[1]) + 1
|
||||||
|
fvalue <- as.numeric(kv[2])
|
||||||
|
mat[i, findex] <- fvalue
|
||||||
|
}
|
||||||
|
}
|
||||||
|
mat <- as(mat, "sparseMatrix")
|
||||||
|
return(list(label = label, data = mat))
|
||||||
|
}
|
||||||
|
|
||||||
|
############################ Test xgb.DMatrix with local file, sparse matrix and dense matrix in R.
|
||||||
|
|
||||||
|
# Directly read in local file
|
||||||
|
dtrain <- xgb.DMatrix("agaricus.txt.train")
|
||||||
|
class(dtrain)
|
||||||
|
|
||||||
|
# read file in R
|
||||||
|
csc <- read.libsvm("agaricus.txt.train", 126)
|
||||||
|
y <- csc$label
|
||||||
|
x <- csc$data
|
||||||
|
|
||||||
|
# x as Sparse Matrix
|
||||||
|
class(x)
|
||||||
|
dtrain <- xgb.DMatrix(x, label = y)
|
||||||
|
|
||||||
|
# x as dense matrix
|
||||||
|
dense.x <- as.matrix(x)
|
||||||
|
dtrain <- xgb.DMatrix(dense.x, label = y)
|
||||||
|
|
||||||
|
############################ Test xgboost with local file, sparse matrix and dense matrix in R.
|
||||||
|
|
||||||
|
# Test with DMatrix object
|
||||||
|
bst <- xgboost(data = dtrain, max_depth = 2, eta = 1,
|
||||||
|
objective = "binary:logistic")
|
||||||
|
|
||||||
|
# Verbose = 0,1,2
|
||||||
|
bst <- xgboost(data = dtrain, max_depth = 2, eta = 1,
|
||||||
|
objective = "binary:logistic", verbose = 0)
|
||||||
|
bst <- xgboost(data = dtrain, max_depth = 2, eta = 1,
|
||||||
|
objective = "binary:logistic", verbose = 1)
|
||||||
|
bst <- xgboost(data = dtrain, max_depth = 2, eta = 1,
|
||||||
|
objective = "binary:logistic", verbose = 2)
|
||||||
|
|
||||||
|
# Test with local file
|
||||||
|
bst <- xgboost(data = "agaricus.txt.train", max_depth = 2, eta = 1,
|
||||||
|
objective = "binary:logistic")
|
||||||
|
|
||||||
|
# Test with Sparse Matrix
|
||||||
|
bst <- xgboost(data = x, label = y, max_depth = 2, eta = 1,
|
||||||
|
objective = "binary:logistic")
|
||||||
|
|
||||||
|
# Test with dense Matrix
|
||||||
|
bst <- xgboost(data = dense.x, label = y, max_depth = 2, eta = 1,
|
||||||
|
objective = "binary:logistic")
|
||||||
|
|
||||||
|
|
||||||
|
############################ Test predict
|
||||||
|
|
||||||
|
# Prediction with DMatrix object
|
||||||
|
dtest <- xgb.DMatrix("agaricus.txt.test")
|
||||||
|
pred <- predict(bst, dtest)
|
||||||
|
|
||||||
|
# Prediction with local test file
|
||||||
|
pred <- predict(bst, "agaricus.txt.test")
|
||||||
|
|
||||||
|
# Prediction with Sparse Matrix
|
||||||
|
csc <- read.libsvm("agaricus.txt.test", 126)
|
||||||
|
test.y <- csc$label
|
||||||
|
test.x <- csc$data
|
||||||
|
pred <- predict(bst, test.x)
|
||||||
|
|
||||||
|
# Extrac label with getinfo
|
||||||
|
labels <- getinfo(dtest, "label")
|
||||||
|
err <- as.numeric(sum(as.integer(pred > 0.5) != labels))/length(labels)
|
||||||
|
print(paste("error=", err))
|
||||||
|
|
||||||
|
############################ Save and load model to hard disk
|
||||||
|
|
||||||
|
# save model to binary local file
|
||||||
|
xgb.save(bst, "model.save")
|
||||||
|
|
||||||
|
# load binary model to R
|
||||||
|
bst <- xgb.load("model.save")
|
||||||
|
pred <- predict(bst, test.x)
|
||||||
|
|
||||||
|
# save model to text file
|
||||||
|
xgb.dump(bst, "model.dump")
|
||||||
|
|
||||||
|
# save a DMatrix object to hard disk
|
||||||
|
xgb.DMatrix.save(dtrain, "dtrain.save")
|
||||||
|
|
||||||
|
# load a DMatrix object to R
|
||||||
|
dtrain <- xgb.DMatrix("dtrain.save")
|
||||||
|
|
||||||
|
############################ More flexible training function xgb.train
|
||||||
|
|
||||||
|
param <- list(max_depth = 2, eta = 1, silent = 1, objective = "binary:logistic")
|
||||||
|
watchlist <- list(eval = dtest, train = dtrain)
|
||||||
|
|
||||||
|
# training xgboost model
|
||||||
|
bst <- xgb.train(param, dtrain, nround = 2, watchlist = watchlist)
|
||||||
|
|
||||||
|
############################ cutomsized loss function
|
||||||
|
|
||||||
|
param <- list(max_depth = 2, eta = 1, silent = 1)
|
||||||
|
|
||||||
|
# note: for customized objective function, we leave objective as default note: what we are getting is
|
||||||
|
# margin value in prediction you must know what you are doing
|
||||||
|
|
||||||
|
# user define objective function, given prediction, return gradient and second order gradient this is
|
||||||
|
# loglikelihood loss
|
||||||
|
logregobj <- function(preds, dtrain) {
|
||||||
|
labels <- getinfo(dtrain, "label")
|
||||||
|
preds <- 1/(1 + exp(-preds))
|
||||||
|
grad <- preds - labels
|
||||||
|
hess <- preds * (1 - preds)
|
||||||
|
return(list(grad = grad, hess = hess))
|
||||||
|
}
|
||||||
|
# user defined evaluation function, return a list(metric='metric-name', value='metric-value') NOTE: when
|
||||||
|
# you do customized loss function, the default prediction value is margin this may make buildin
|
||||||
|
# evalution metric not function properly for example, we are doing logistic loss, the prediction is
|
||||||
|
# score before logistic transformation the buildin evaluation error assumes input is after logistic
|
||||||
|
# transformation Take this in mind when you use the customization, and maybe you need write customized
|
||||||
|
# evaluation function
|
||||||
|
evalerror <- function(preds, dtrain) {
|
||||||
|
labels <- getinfo(dtrain, "label")
|
||||||
|
err <- as.numeric(sum(labels != (preds > 0)))/length(labels)
|
||||||
|
return(list(metric = "error", value = err))
|
||||||
|
}
|
||||||
|
|
||||||
|
# training with customized objective, we can also do step by step training simply look at xgboost.py's
|
||||||
|
# implementation of train
|
||||||
|
bst <- xgb.train(param, dtrain, nround = 2, watchlist, logregobj, evalerror)
|
||||||
|
|
||||||
|
|
||||||
File diff suppressed because it is too large
Load Diff
File diff suppressed because it is too large
Load Diff
@ -1,127 +0,0 @@
|
|||||||
# load xgboost library
|
|
||||||
require(xgboost)
|
|
||||||
require(methods)
|
|
||||||
|
|
||||||
# helper function to read libsvm format
|
|
||||||
# this is very badly written, load in dense, and convert to sparse
|
|
||||||
# use this only for demo purpose
|
|
||||||
# adopted from https://github.com/zygmuntz/r-libsvm-format-read-write/blob/master/f_read.libsvm.r
|
|
||||||
read.libsvm <- function(fname, maxcol) {
|
|
||||||
content <- readLines(fname)
|
|
||||||
nline <- length(content)
|
|
||||||
label <- numeric(nline)
|
|
||||||
mat <- matrix(0, nline, maxcol+1)
|
|
||||||
for (i in 1:nline) {
|
|
||||||
arr <- as.vector(strsplit(content[i], " ")[[1]])
|
|
||||||
label[i] <- as.numeric(arr[[1]])
|
|
||||||
for (j in 2:length(arr)) {
|
|
||||||
kv <- strsplit(arr[j], ":")[[1]]
|
|
||||||
# to avoid 0 index
|
|
||||||
findex <- as.integer(kv[1]) + 1
|
|
||||||
fvalue <- as.numeric(kv[2])
|
|
||||||
mat[i,findex] <- fvalue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mat <- as(mat, "sparseMatrix")
|
|
||||||
return(list(label=label, data=mat))
|
|
||||||
}
|
|
||||||
|
|
||||||
# test code here
|
|
||||||
dtrain <- xgb.DMatrix("agaricus.txt.train")
|
|
||||||
dtest <- xgb.DMatrix("agaricus.txt.test")
|
|
||||||
param = list("bst:max_depth"=2, "bst:eta"=1, "silent"=1, "objective"="binary:logistic")
|
|
||||||
watchlist <- list("eval"=dtest,"train"=dtrain)
|
|
||||||
# training xgboost model
|
|
||||||
bst <- xgb.train(param, dtrain, nround=2, watchlist=watchlist)
|
|
||||||
# make prediction
|
|
||||||
preds <- xgb.predict(bst, dtest)
|
|
||||||
labels <- xgb.getinfo(dtest, "label")
|
|
||||||
err <- as.numeric(sum(as.integer(preds > 0.5) != labels)) / length(labels)
|
|
||||||
# print error rate
|
|
||||||
print(paste("error=",err))
|
|
||||||
|
|
||||||
# dump model
|
|
||||||
xgb.dump(bst, "dump.raw.txt")
|
|
||||||
# dump model with feature map
|
|
||||||
xgb.dump(bst, "dump.nice.txt", "featmap.txt")
|
|
||||||
|
|
||||||
# save dmatrix into binary buffer
|
|
||||||
succ <- xgb.save(dtest, "dtest.buffer")
|
|
||||||
# save model into file
|
|
||||||
succ <- xgb.save(bst, "xgb.model")
|
|
||||||
# load model and data in
|
|
||||||
bst2 <- xgb.Booster(modelfile="xgb.model")
|
|
||||||
dtest2 <- xgb.DMatrix("dtest.buffer")
|
|
||||||
preds2 <- xgb.predict(bst2, dtest2)
|
|
||||||
# assert they are the same
|
|
||||||
stopifnot(sum(abs(preds2-preds)) == 0)
|
|
||||||
|
|
||||||
###
|
|
||||||
# build dmatrix from sparseMatrix
|
|
||||||
###
|
|
||||||
print ('start running example of build DMatrix from R.sparseMatrix')
|
|
||||||
csc <- read.libsvm("agaricus.txt.train", 126)
|
|
||||||
label <- csc$label
|
|
||||||
data <- csc$data
|
|
||||||
dtrain <- xgb.DMatrix(data, info=list(label=label) )
|
|
||||||
watchlist <- list("eval"=dtest,"train"=dtrain)
|
|
||||||
bst <- xgb.train(param, dtrain, nround=2, watchlist=watchlist)
|
|
||||||
|
|
||||||
###
|
|
||||||
# build dmatrix from dense matrix
|
|
||||||
###
|
|
||||||
print ('start running example of build DMatrix from R.Matrix')
|
|
||||||
mat = as.matrix(data)
|
|
||||||
dtrain <- xgb.DMatrix(mat, info=list(label=label) )
|
|
||||||
watchlist <- list("eval"=dtest,"train"=dtrain)
|
|
||||||
bst <- xgb.train(param, dtrain, nround=2, watchlist=watchlist)
|
|
||||||
|
|
||||||
###
|
|
||||||
# advanced: cutomsized loss function
|
|
||||||
#
|
|
||||||
print("start running example to used cutomized objective function")
|
|
||||||
# note: for customized objective function, we leave objective as default
|
|
||||||
# note: what we are getting is margin value in prediction
|
|
||||||
# you must know what you are doing
|
|
||||||
param <- list("bst:max_depth" = 2, "bst:eta" = 1, "silent" =1)
|
|
||||||
# user define objective function, given prediction, return gradient and second order gradient
|
|
||||||
# this is loglikelihood loss
|
|
||||||
logregobj <- function(preds, dtrain) {
|
|
||||||
labels <- xgb.getinfo(dtrain, "label")
|
|
||||||
preds <- 1.0 / (1.0 + exp(-preds))
|
|
||||||
grad <- preds - labels
|
|
||||||
hess <- preds * (1.0-preds)
|
|
||||||
return(list(grad=grad, hess=hess))
|
|
||||||
}
|
|
||||||
# user defined evaluation function, return a list(metric="metric-name", value="metric-value")
|
|
||||||
# NOTE: when you do customized loss function, the default prediction value is margin
|
|
||||||
# this may make buildin evalution metric not function properly
|
|
||||||
# for example, we are doing logistic loss, the prediction is score before logistic transformation
|
|
||||||
# the buildin evaluation error assumes input is after logistic transformation
|
|
||||||
# Take this in mind when you use the customization, and maybe you need write customized evaluation function
|
|
||||||
evalerror <- function(preds, dtrain) {
|
|
||||||
labels <- xgb.getinfo(dtrain, "label")
|
|
||||||
err <- as.numeric(sum(labels != (preds > 0.0))) / length(labels)
|
|
||||||
return(list(metric="error", value=err))
|
|
||||||
}
|
|
||||||
|
|
||||||
# training with customized objective, we can also do step by step training
|
|
||||||
# simply look at xgboost.py"s implementation of train
|
|
||||||
bst <- xgb.train(param, dtrain, nround=2, watchlist, logregobj, evalerror)
|
|
||||||
|
|
||||||
###
|
|
||||||
# advanced: start from a initial base prediction
|
|
||||||
#
|
|
||||||
print ("start running example to start from a initial prediction")
|
|
||||||
# specify parameters via map, definition are same as c++ version
|
|
||||||
param = list("bst:max_depth"=2, "bst:eta"=1, "silent"=1, "objective"="binary:logistic")
|
|
||||||
# train xgboost for 1 round
|
|
||||||
bst <- xgb.train( param, dtrain, 1, watchlist )
|
|
||||||
# Note: we need the margin value instead of transformed prediction in set_base_margin
|
|
||||||
# do predict with output_margin=True, will always give you margin values before logistic transformation
|
|
||||||
ptrain <- xgb.predict(bst, dtrain, outputmargin=TRUE)
|
|
||||||
ptest <- xgb.predict(bst, dtest, outputmargin=TRUE)
|
|
||||||
succ <- xgb.setinfo(dtrain, "base_margin", ptrain)
|
|
||||||
succ <- xgb.setinfo(dtest, "base_margin", ptest)
|
|
||||||
print ("this is result of running from initial prediction")
|
|
||||||
bst <- xgb.train( param, dtrain, 1, watchlist )
|
|
||||||
@ -1,102 +0,0 @@
|
|||||||
require(xgboost)
|
|
||||||
|
|
||||||
# helper function to read libsvm format
|
|
||||||
# this is very badly written, load in dense, and convert to sparse
|
|
||||||
# use this only for demo purpose
|
|
||||||
# adopted from https://github.com/zygmuntz/r-libsvm-format-read-write/blob/master/f_read.libsvm.r
|
|
||||||
read.libsvm = function(fname, maxcol) {
|
|
||||||
content = readLines(fname)
|
|
||||||
nline = length(content)
|
|
||||||
label = numeric(nline)
|
|
||||||
mat = matrix(0, nline, maxcol+1)
|
|
||||||
for (i in 1:nline) {
|
|
||||||
arr = as.vector(strsplit(content[i], " ")[[1]])
|
|
||||||
label[i] = as.numeric(arr[[1]])
|
|
||||||
for (j in 2:length(arr)) {
|
|
||||||
kv = strsplit(arr[j], ":")[[1]]
|
|
||||||
# to avoid 0 index
|
|
||||||
findex = as.integer(kv[1]) + 1
|
|
||||||
fvalue = as.numeric(kv[2])
|
|
||||||
mat[i,findex] = fvalue
|
|
||||||
}
|
|
||||||
}
|
|
||||||
mat = as(mat, "sparseMatrix")
|
|
||||||
return(list(label=label, data=mat))
|
|
||||||
}
|
|
||||||
|
|
||||||
# Parameter setting
|
|
||||||
dtrain <- xgb.DMatrix("agaricus.txt.train")
|
|
||||||
dtest <- xgb.DMatrix("agaricus.txt.test")
|
|
||||||
param = list("bst:max_depth"=2, "bst:eta"=1, "silent"=1, "objective"="binary:logistic")
|
|
||||||
watchlist = list("eval"=dtest,"train"=dtrain)
|
|
||||||
|
|
||||||
###########################
|
|
||||||
# Train from local file
|
|
||||||
###########################
|
|
||||||
|
|
||||||
# Training
|
|
||||||
bst = xgboost(file='agaricus.txt.train',params=param,watchlist=watchlist)
|
|
||||||
# Prediction
|
|
||||||
pred = predict(bst, 'agaricus.txt.test')
|
|
||||||
# Performance
|
|
||||||
labels = xgb.getinfo(dtest, "label")
|
|
||||||
err = as.numeric(sum(as.integer(pred > 0.5) != labels)) / length(labels)
|
|
||||||
print(paste("error=",err))
|
|
||||||
|
|
||||||
###########################
|
|
||||||
# Train from R object
|
|
||||||
###########################
|
|
||||||
|
|
||||||
csc = read.libsvm("agaricus.txt.train", 126)
|
|
||||||
y = csc$label
|
|
||||||
x = csc$data
|
|
||||||
# x as Sparse Matrix
|
|
||||||
class(x)
|
|
||||||
|
|
||||||
# Training
|
|
||||||
bst = xgboost(x,y,params=param,watchlist=watchlist)
|
|
||||||
# Prediction
|
|
||||||
pred = predict(bst, 'agaricus.txt.test')
|
|
||||||
# Performance
|
|
||||||
labels = xgb.getinfo(dtest, "label")
|
|
||||||
err = as.numeric(sum(as.integer(pred > 0.5) != labels)) / length(labels)
|
|
||||||
print(paste("error=",err))
|
|
||||||
|
|
||||||
# Training with dense matrix
|
|
||||||
x = as.matrix(x)
|
|
||||||
bst = xgboost(x,y,params=param,watchlist=watchlist)
|
|
||||||
|
|
||||||
###########################
|
|
||||||
# Train with customization
|
|
||||||
###########################
|
|
||||||
|
|
||||||
# user define objective function, given prediction, return gradient and second order gradient
|
|
||||||
# this is loglikelihood loss
|
|
||||||
logregobj = function(preds, dtrain) {
|
|
||||||
labels = xgb.getinfo(dtrain, "label")
|
|
||||||
preds = 1.0 / (1.0 + exp(-preds))
|
|
||||||
grad = preds - labels
|
|
||||||
hess = preds * (1.0-preds)
|
|
||||||
return(list(grad=grad, hess=hess))
|
|
||||||
}
|
|
||||||
# user defined evaluation function, return a list(metric="metric-name", value="metric-value")
|
|
||||||
# NOTE: when you do customized loss function, the default prediction value is margin
|
|
||||||
# this may make buildin evalution metric not function properly
|
|
||||||
# for example, we are doing logistic loss, the prediction is score before logistic transformation
|
|
||||||
# the buildin evaluation error assumes input is after logistic transformation
|
|
||||||
# Take this in mind when you use the customization, and maybe you need write customized evaluation function
|
|
||||||
evalerror = function(preds, dtrain) {
|
|
||||||
labels = xgb.getinfo(dtrain, "label")
|
|
||||||
err = as.numeric(sum(labels != (preds > 0.0))) / length(labels)
|
|
||||||
return(list(metric="error", value=err))
|
|
||||||
}
|
|
||||||
|
|
||||||
bst = xgboost(x,y,params=param,watchlist=watchlist,obj=logregobj, feval=evalerror)
|
|
||||||
|
|
||||||
############################
|
|
||||||
# Train with previous result
|
|
||||||
############################
|
|
||||||
|
|
||||||
bst = xgboost(x,y,params=param,watchlist=watchlist)
|
|
||||||
pred = predict(bst, 'agaricus.txt.train', outputmargin=TRUE)
|
|
||||||
bst2 = xgboost(x,y,params=param,watchlist=watchlist,margin=pred)
|
|
||||||
@ -1,126 +0,0 @@
|
|||||||
0 cap-shape=bell i
|
|
||||||
1 cap-shape=conical i
|
|
||||||
2 cap-shape=convex i
|
|
||||||
3 cap-shape=flat i
|
|
||||||
4 cap-shape=knobbed i
|
|
||||||
5 cap-shape=sunken i
|
|
||||||
6 cap-surface=fibrous i
|
|
||||||
7 cap-surface=grooves i
|
|
||||||
8 cap-surface=scaly i
|
|
||||||
9 cap-surface=smooth i
|
|
||||||
10 cap-color=brown i
|
|
||||||
11 cap-color=buff i
|
|
||||||
12 cap-color=cinnamon i
|
|
||||||
13 cap-color=gray i
|
|
||||||
14 cap-color=green i
|
|
||||||
15 cap-color=pink i
|
|
||||||
16 cap-color=purple i
|
|
||||||
17 cap-color=red i
|
|
||||||
18 cap-color=white i
|
|
||||||
19 cap-color=yellow i
|
|
||||||
20 bruises?=bruises i
|
|
||||||
21 bruises?=no i
|
|
||||||
22 odor=almond i
|
|
||||||
23 odor=anise i
|
|
||||||
24 odor=creosote i
|
|
||||||
25 odor=fishy i
|
|
||||||
26 odor=foul i
|
|
||||||
27 odor=musty i
|
|
||||||
28 odor=none i
|
|
||||||
29 odor=pungent i
|
|
||||||
30 odor=spicy i
|
|
||||||
31 gill-attachment=attached i
|
|
||||||
32 gill-attachment=descending i
|
|
||||||
33 gill-attachment=free i
|
|
||||||
34 gill-attachment=notched i
|
|
||||||
35 gill-spacing=close i
|
|
||||||
36 gill-spacing=crowded i
|
|
||||||
37 gill-spacing=distant i
|
|
||||||
38 gill-size=broad i
|
|
||||||
39 gill-size=narrow i
|
|
||||||
40 gill-color=black i
|
|
||||||
41 gill-color=brown i
|
|
||||||
42 gill-color=buff i
|
|
||||||
43 gill-color=chocolate i
|
|
||||||
44 gill-color=gray i
|
|
||||||
45 gill-color=green i
|
|
||||||
46 gill-color=orange i
|
|
||||||
47 gill-color=pink i
|
|
||||||
48 gill-color=purple i
|
|
||||||
49 gill-color=red i
|
|
||||||
50 gill-color=white i
|
|
||||||
51 gill-color=yellow i
|
|
||||||
52 stalk-shape=enlarging i
|
|
||||||
53 stalk-shape=tapering i
|
|
||||||
54 stalk-root=bulbous i
|
|
||||||
55 stalk-root=club i
|
|
||||||
56 stalk-root=cup i
|
|
||||||
57 stalk-root=equal i
|
|
||||||
58 stalk-root=rhizomorphs i
|
|
||||||
59 stalk-root=rooted i
|
|
||||||
60 stalk-root=missing i
|
|
||||||
61 stalk-surface-above-ring=fibrous i
|
|
||||||
62 stalk-surface-above-ring=scaly i
|
|
||||||
63 stalk-surface-above-ring=silky i
|
|
||||||
64 stalk-surface-above-ring=smooth i
|
|
||||||
65 stalk-surface-below-ring=fibrous i
|
|
||||||
66 stalk-surface-below-ring=scaly i
|
|
||||||
67 stalk-surface-below-ring=silky i
|
|
||||||
68 stalk-surface-below-ring=smooth i
|
|
||||||
69 stalk-color-above-ring=brown i
|
|
||||||
70 stalk-color-above-ring=buff i
|
|
||||||
71 stalk-color-above-ring=cinnamon i
|
|
||||||
72 stalk-color-above-ring=gray i
|
|
||||||
73 stalk-color-above-ring=orange i
|
|
||||||
74 stalk-color-above-ring=pink i
|
|
||||||
75 stalk-color-above-ring=red i
|
|
||||||
76 stalk-color-above-ring=white i
|
|
||||||
77 stalk-color-above-ring=yellow i
|
|
||||||
78 stalk-color-below-ring=brown i
|
|
||||||
79 stalk-color-below-ring=buff i
|
|
||||||
80 stalk-color-below-ring=cinnamon i
|
|
||||||
81 stalk-color-below-ring=gray i
|
|
||||||
82 stalk-color-below-ring=orange i
|
|
||||||
83 stalk-color-below-ring=pink i
|
|
||||||
84 stalk-color-below-ring=red i
|
|
||||||
85 stalk-color-below-ring=white i
|
|
||||||
86 stalk-color-below-ring=yellow i
|
|
||||||
87 veil-type=partial i
|
|
||||||
88 veil-type=universal i
|
|
||||||
89 veil-color=brown i
|
|
||||||
90 veil-color=orange i
|
|
||||||
91 veil-color=white i
|
|
||||||
92 veil-color=yellow i
|
|
||||||
93 ring-number=none i
|
|
||||||
94 ring-number=one i
|
|
||||||
95 ring-number=two i
|
|
||||||
96 ring-type=cobwebby i
|
|
||||||
97 ring-type=evanescent i
|
|
||||||
98 ring-type=flaring i
|
|
||||||
99 ring-type=large i
|
|
||||||
100 ring-type=none i
|
|
||||||
101 ring-type=pendant i
|
|
||||||
102 ring-type=sheathing i
|
|
||||||
103 ring-type=zone i
|
|
||||||
104 spore-print-color=black i
|
|
||||||
105 spore-print-color=brown i
|
|
||||||
106 spore-print-color=buff i
|
|
||||||
107 spore-print-color=chocolate i
|
|
||||||
108 spore-print-color=green i
|
|
||||||
109 spore-print-color=orange i
|
|
||||||
110 spore-print-color=purple i
|
|
||||||
111 spore-print-color=white i
|
|
||||||
112 spore-print-color=yellow i
|
|
||||||
113 population=abundant i
|
|
||||||
114 population=clustered i
|
|
||||||
115 population=numerous i
|
|
||||||
116 population=scattered i
|
|
||||||
117 population=several i
|
|
||||||
118 population=solitary i
|
|
||||||
119 habitat=grasses i
|
|
||||||
120 habitat=leaves i
|
|
||||||
121 habitat=meadows i
|
|
||||||
122 habitat=paths i
|
|
||||||
123 habitat=urban i
|
|
||||||
124 habitat=waste i
|
|
||||||
125 habitat=woods i
|
|
||||||
@ -1 +1,5 @@
|
|||||||
This is a test for minimal files needed for windows version
|
The solution has been created with Visual Studio Express 2013.
|
||||||
|
Make sure to compile the Release version, unless you need to debug the code
|
||||||
|
(and in the latter case modify the path in xgboost.py from release to test).
|
||||||
|
Note that you have two projects in one solution and they need to be compiled to use the standalone executable from the command line
|
||||||
|
or the python module respectively.
|
||||||
@ -1,8 +1,12 @@
|
|||||||
|
|
||||||
Microsoft Visual Studio Solution File, Format Version 11.00
|
Microsoft Visual Studio Solution File, Format Version 12.00
|
||||||
# Visual Studio 2010
|
# Visual Studio Express 2013 for Windows Desktop
|
||||||
|
VisualStudioVersion = 12.0.30723.0
|
||||||
|
MinimumVisualStudioVersion = 10.0.40219.1
|
||||||
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xgboost", "xgboost\xgboost.vcxproj", "{1D6A56A5-5557-4D20-9D50-3DE4C30BE00C}"
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xgboost", "xgboost\xgboost.vcxproj", "{1D6A56A5-5557-4D20-9D50-3DE4C30BE00C}"
|
||||||
EndProject
|
EndProject
|
||||||
|
Project("{8BC9CEB8-8B4A-11D0-8D11-00A0C91BC942}") = "xgboost_wrapper", "xgboost_wrapper\xgboost_wrapper.vcxproj", "{2E1AF937-28BB-4832-B916-309C9A0F6C4F}"
|
||||||
|
EndProject
|
||||||
Global
|
Global
|
||||||
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
GlobalSection(SolutionConfigurationPlatforms) = preSolution
|
||||||
Debug|Win32 = Debug|Win32
|
Debug|Win32 = Debug|Win32
|
||||||
@ -19,6 +23,14 @@ Global
|
|||||||
{1D6A56A5-5557-4D20-9D50-3DE4C30BE00C}.Release|Win32.Build.0 = Release|Win32
|
{1D6A56A5-5557-4D20-9D50-3DE4C30BE00C}.Release|Win32.Build.0 = Release|Win32
|
||||||
{1D6A56A5-5557-4D20-9D50-3DE4C30BE00C}.Release|x64.ActiveCfg = Release|x64
|
{1D6A56A5-5557-4D20-9D50-3DE4C30BE00C}.Release|x64.ActiveCfg = Release|x64
|
||||||
{1D6A56A5-5557-4D20-9D50-3DE4C30BE00C}.Release|x64.Build.0 = Release|x64
|
{1D6A56A5-5557-4D20-9D50-3DE4C30BE00C}.Release|x64.Build.0 = Release|x64
|
||||||
|
{2E1AF937-28BB-4832-B916-309C9A0F6C4F}.Debug|Win32.ActiveCfg = Debug|Win32
|
||||||
|
{2E1AF937-28BB-4832-B916-309C9A0F6C4F}.Debug|Win32.Build.0 = Debug|Win32
|
||||||
|
{2E1AF937-28BB-4832-B916-309C9A0F6C4F}.Debug|x64.ActiveCfg = Debug|x64
|
||||||
|
{2E1AF937-28BB-4832-B916-309C9A0F6C4F}.Debug|x64.Build.0 = Debug|x64
|
||||||
|
{2E1AF937-28BB-4832-B916-309C9A0F6C4F}.Release|Win32.ActiveCfg = Release|Win32
|
||||||
|
{2E1AF937-28BB-4832-B916-309C9A0F6C4F}.Release|Win32.Build.0 = Release|Win32
|
||||||
|
{2E1AF937-28BB-4832-B916-309C9A0F6C4F}.Release|x64.ActiveCfg = Release|x64
|
||||||
|
{2E1AF937-28BB-4832-B916-309C9A0F6C4F}.Release|x64.Build.0 = Release|x64
|
||||||
EndGlobalSection
|
EndGlobalSection
|
||||||
GlobalSection(SolutionProperties) = preSolution
|
GlobalSection(SolutionProperties) = preSolution
|
||||||
HideSolutionNode = FALSE
|
HideSolutionNode = FALSE
|
||||||
|
|||||||
@ -1,5 +1,5 @@
|
|||||||
<?xml version="1.0" encoding="utf-8"?>
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
<Project DefaultTargets="Build" ToolsVersion="4.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
<ItemGroup Label="ProjectConfigurations">
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
<ProjectConfiguration Include="Debug|Win32">
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
<Configuration>Debug</Configuration>
|
<Configuration>Debug</Configuration>
|
||||||
@ -27,23 +27,27 @@
|
|||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>true</UseDebugLibraries>
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
<ConfigurationType>Application</ConfigurationType>
|
<ConfigurationType>Application</ConfigurationType>
|
||||||
<UseDebugLibraries>false</UseDebugLibraries>
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
<WholeProgramOptimization>true</WholeProgramOptimization>
|
<WholeProgramOptimization>true</WholeProgramOptimization>
|
||||||
<CharacterSet>MultiByte</CharacterSet>
|
<CharacterSet>MultiByte</CharacterSet>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
</PropertyGroup>
|
</PropertyGroup>
|
||||||
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
<ImportGroup Label="ExtensionSettings">
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
|||||||
154
windows/xgboost_wrapper/xgboost_wrapper.vcxproj
Normal file
154
windows/xgboost_wrapper/xgboost_wrapper.vcxproj
Normal file
@ -0,0 +1,154 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<Project DefaultTargets="Build" ToolsVersion="12.0" xmlns="http://schemas.microsoft.com/developer/msbuild/2003">
|
||||||
|
<ItemGroup Label="ProjectConfigurations">
|
||||||
|
<ProjectConfiguration Include="Debug|Win32">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Debug|x64">
|
||||||
|
<Configuration>Debug</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|Win32">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>Win32</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
<ProjectConfiguration Include="Release|x64">
|
||||||
|
<Configuration>Release</Configuration>
|
||||||
|
<Platform>x64</Platform>
|
||||||
|
</ProjectConfiguration>
|
||||||
|
</ItemGroup>
|
||||||
|
<PropertyGroup Label="Globals">
|
||||||
|
<ProjectGuid>{2E1AF937-28BB-4832-B916-309C9A0F6C4F}</ProjectGuid>
|
||||||
|
<TargetFrameworkVersion>v4.5</TargetFrameworkVersion>
|
||||||
|
<Keyword>ManagedCProj</Keyword>
|
||||||
|
<RootNamespace>xgboost_wrapper</RootNamespace>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.Default.props" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
|
<CLRSupport>true</CLRSupport>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>true</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
|
<CLRSupport>true</CLRSupport>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
|
<CLRSupport>true</CLRSupport>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="Configuration">
|
||||||
|
<ConfigurationType>DynamicLibrary</ConfigurationType>
|
||||||
|
<UseDebugLibraries>false</UseDebugLibraries>
|
||||||
|
<PlatformToolset>v120</PlatformToolset>
|
||||||
|
<CLRSupport>true</CLRSupport>
|
||||||
|
<CharacterSet>Unicode</CharacterSet>
|
||||||
|
</PropertyGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.props" />
|
||||||
|
<ImportGroup Label="ExtensionSettings">
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Label="PropertySheets" Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<ImportGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'" Label="PropertySheets">
|
||||||
|
<Import Project="$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props" Condition="exists('$(UserRootDir)\Microsoft.Cpp.$(Platform).user.props')" Label="LocalAppDataPlatform" />
|
||||||
|
</ImportGroup>
|
||||||
|
<PropertyGroup Label="UserMacros" />
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<LinkIncremental>true</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<LinkIncremental>false</LinkIncremental>
|
||||||
|
</PropertyGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies />
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Debug|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<Optimization>Disabled</Optimization>
|
||||||
|
<PreprocessorDefinitions>WIN32;_DEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
<OpenMPSupport>true</OpenMPSupport>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>
|
||||||
|
</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|Win32'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeader>Use</PrecompiledHeader>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies />
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemDefinitionGroup Condition="'$(Configuration)|$(Platform)'=='Release|x64'">
|
||||||
|
<ClCompile>
|
||||||
|
<WarningLevel>Level3</WarningLevel>
|
||||||
|
<PreprocessorDefinitions>WIN32;NDEBUG;%(PreprocessorDefinitions)</PreprocessorDefinitions>
|
||||||
|
<PrecompiledHeader>NotUsing</PrecompiledHeader>
|
||||||
|
<OpenMPSupport>true</OpenMPSupport>
|
||||||
|
</ClCompile>
|
||||||
|
<Link>
|
||||||
|
<GenerateDebugInformation>true</GenerateDebugInformation>
|
||||||
|
<AdditionalDependencies>
|
||||||
|
</AdditionalDependencies>
|
||||||
|
</Link>
|
||||||
|
</ItemDefinitionGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<Reference Include="System" />
|
||||||
|
<Reference Include="System.Data" />
|
||||||
|
<Reference Include="System.Xml" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClInclude Include="..\..\src\io\io.h" />
|
||||||
|
<ClInclude Include="..\..\src\io\simple_dmatrix-inl.hpp" />
|
||||||
|
<ClInclude Include="..\..\wrapper\xgboost_wrapper.h" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<ClCompile Include="..\..\src\io\io.cpp" />
|
||||||
|
<ClCompile Include="..\..\wrapper\xgboost_wrapper.cpp" />
|
||||||
|
</ItemGroup>
|
||||||
|
<ItemGroup>
|
||||||
|
<None Include="..\..\wrapper\xgboost.py" />
|
||||||
|
</ItemGroup>
|
||||||
|
<Import Project="$(VCTargetsPath)\Microsoft.Cpp.targets" />
|
||||||
|
<ImportGroup Label="ExtensionTargets">
|
||||||
|
</ImportGroup>
|
||||||
|
</Project>
|
||||||
@ -9,7 +9,10 @@ import numpy.ctypeslib
|
|||||||
import scipy.sparse as scp
|
import scipy.sparse as scp
|
||||||
|
|
||||||
# set this line correctly
|
# set this line correctly
|
||||||
XGBOOST_PATH = os.path.dirname(__file__)+'/libxgboostwrapper.so'
|
if os.name == 'nt':
|
||||||
|
XGBOOST_PATH = os.path.dirname(__file__)+'/../windows/x64/Release/xgboost_wrapper.dll'
|
||||||
|
else:
|
||||||
|
XGBOOST_PATH = os.path.dirname(__file__)+'/../libxgboostwrapper.so'
|
||||||
|
|
||||||
# load in xgboost library
|
# load in xgboost library
|
||||||
xglib = ctypes.cdll.LoadLibrary(XGBOOST_PATH)
|
xglib = ctypes.cdll.LoadLibrary(XGBOOST_PATH)
|
||||||
@ -231,7 +234,7 @@ class Booster:
|
|||||||
trees = self.get_dump(fmap)
|
trees = self.get_dump(fmap)
|
||||||
fmap = {}
|
fmap = {}
|
||||||
for tree in trees:
|
for tree in trees:
|
||||||
print tree
|
print (tree)
|
||||||
for l in tree.split('\n'):
|
for l in tree.split('\n'):
|
||||||
arr = l.split('[')
|
arr = l.split('[')
|
||||||
if len(arr) == 1:
|
if len(arr) == 1:
|
||||||
@ -263,7 +266,7 @@ def train(params, dtrain, num_boost_round = 10, evals = [], obj=None, feval=None
|
|||||||
for i in range(num_boost_round):
|
for i in range(num_boost_round):
|
||||||
bst.update( dtrain, i )
|
bst.update( dtrain, i )
|
||||||
if len(evals) != 0:
|
if len(evals) != 0:
|
||||||
sys.stderr.write(evaluate(bst, evals, i, feval)+'\n')
|
sys.stderr.write(evaluate(bst, evals, i, feval).decode()+'\n')
|
||||||
else:
|
else:
|
||||||
# try customized objective function
|
# try customized objective function
|
||||||
for i in range(num_boost_round):
|
for i in range(num_boost_round):
|
||||||
|
|||||||
@ -7,7 +7,11 @@
|
|||||||
* can be used to create wrapper of other languages
|
* can be used to create wrapper of other languages
|
||||||
*/
|
*/
|
||||||
#include <cstdio>
|
#include <cstdio>
|
||||||
|
#ifdef _MSC_VER
|
||||||
|
#define XGB_DLL __declspec(dllexport)
|
||||||
|
#else
|
||||||
#define XGB_DLL
|
#define XGB_DLL
|
||||||
|
#endif
|
||||||
// manually define unsign long
|
// manually define unsign long
|
||||||
typedef unsigned long bst_ulong;
|
typedef unsigned long bst_ulong;
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user