Replace cBind by cbind (#3203)
* modify test_helper.R * fix noLD * update desc * fix solaris test * fix desc * improve fix * fix url * change Matrix cBind to cbind * fix * fix error in demo * fix examples
This commit is contained in:
parent
b087620661
commit
ace4016c36
@ -51,7 +51,6 @@ export(xgboost)
|
|||||||
import(methods)
|
import(methods)
|
||||||
importClassesFrom(Matrix,dgCMatrix)
|
importClassesFrom(Matrix,dgCMatrix)
|
||||||
importClassesFrom(Matrix,dgeMatrix)
|
importClassesFrom(Matrix,dgeMatrix)
|
||||||
importFrom(Matrix,cBind)
|
|
||||||
importFrom(Matrix,colSums)
|
importFrom(Matrix,colSums)
|
||||||
importFrom(Matrix,sparse.model.matrix)
|
importFrom(Matrix,sparse.model.matrix)
|
||||||
importFrom(Matrix,sparseMatrix)
|
importFrom(Matrix,sparseMatrix)
|
||||||
|
|||||||
@ -554,6 +554,7 @@ cb.cv.predict <- function(save_models = FALSE) {
|
|||||||
#' #
|
#' #
|
||||||
#' # In the iris dataset, it is hard to linearly separate Versicolor class from the rest
|
#' # In the iris dataset, it is hard to linearly separate Versicolor class from the rest
|
||||||
#' # without considering the 2nd order interactions:
|
#' # without considering the 2nd order interactions:
|
||||||
|
#' require(magrittr)
|
||||||
#' x <- model.matrix(Species ~ .^2, iris)[,-1]
|
#' x <- model.matrix(Species ~ .^2, iris)[,-1]
|
||||||
#' colnames(x)
|
#' colnames(x)
|
||||||
#' dtrain <- xgb.DMatrix(scale(x), label = 1*(iris$Species == "versicolor"))
|
#' dtrain <- xgb.DMatrix(scale(x), label = 1*(iris$Species == "versicolor"))
|
||||||
@ -602,7 +603,7 @@ cb.cv.predict <- function(save_models = FALSE) {
|
|||||||
#'
|
#'
|
||||||
#' # CV:
|
#' # CV:
|
||||||
#' bst <- xgb.cv(param, dtrain, nfold = 5, nrounds = 70, eta = 0.5,
|
#' bst <- xgb.cv(param, dtrain, nfold = 5, nrounds = 70, eta = 0.5,
|
||||||
#' callbacks = list(cb.gblinear.history(F)))
|
#' callbacks = list(cb.gblinear.history(FALSE)))
|
||||||
#' # 1st forld of 1st class
|
#' # 1st forld of 1st class
|
||||||
#' xgb.gblinear.history(bst, class_index = 0)[[1]] %>% matplot(type = 'l')
|
#' xgb.gblinear.history(bst, class_index = 0)[[1]] %>% matplot(type = 'l')
|
||||||
#'
|
#'
|
||||||
@ -691,7 +692,9 @@ cb.gblinear.history <- function(sparse=FALSE) {
|
|||||||
#' corresponding to CV folds.
|
#' corresponding to CV folds.
|
||||||
#'
|
#'
|
||||||
#' @examples
|
#' @examples
|
||||||
|
#' \dontrun{
|
||||||
#' See \code{\link{cv.gblinear.history}}
|
#' See \code{\link{cv.gblinear.history}}
|
||||||
|
#' }
|
||||||
#'
|
#'
|
||||||
#' @export
|
#' @export
|
||||||
xgb.gblinear.history <- function(model, class_index = NULL) {
|
xgb.gblinear.history <- function(model, class_index = NULL) {
|
||||||
|
|||||||
@ -83,5 +83,5 @@ xgb.create.features <- function(model, data, ...){
|
|||||||
check.deprecation(...)
|
check.deprecation(...)
|
||||||
pred_with_leaf <- predict(model, data, predleaf = TRUE)
|
pred_with_leaf <- predict(model, data, predleaf = TRUE)
|
||||||
cols <- lapply(as.data.frame(pred_with_leaf), factor)
|
cols <- lapply(as.data.frame(pred_with_leaf), factor)
|
||||||
cBind(data, sparse.model.matrix( ~ . -1, cols))
|
cbind(data, sparse.model.matrix( ~ . -1, cols))
|
||||||
}
|
}
|
||||||
|
|||||||
@ -77,7 +77,6 @@ NULL
|
|||||||
|
|
||||||
# Various imports
|
# Various imports
|
||||||
#' @importClassesFrom Matrix dgCMatrix dgeMatrix
|
#' @importClassesFrom Matrix dgCMatrix dgeMatrix
|
||||||
#' @importFrom Matrix cBind
|
|
||||||
#' @importFrom Matrix colSums
|
#' @importFrom Matrix colSums
|
||||||
#' @importFrom Matrix sparse.model.matrix
|
#' @importFrom Matrix sparse.model.matrix
|
||||||
#' @importFrom Matrix sparseVector
|
#' @importFrom Matrix sparseVector
|
||||||
|
|||||||
@ -32,7 +32,7 @@ create.new.tree.features <- function(model, original.features){
|
|||||||
leaf.id <- sort(unique(pred_with_leaf[,i]))
|
leaf.id <- sort(unique(pred_with_leaf[,i]))
|
||||||
cols[[i]] <- factor(x = pred_with_leaf[,i], level = leaf.id)
|
cols[[i]] <- factor(x = pred_with_leaf[,i], level = leaf.id)
|
||||||
}
|
}
|
||||||
cBind(original.features, sparse.model.matrix( ~ . -1, as.data.frame(cols)))
|
cbind(original.features, sparse.model.matrix( ~ . -1, as.data.frame(cols)))
|
||||||
}
|
}
|
||||||
|
|
||||||
# Convert previous features to one hot encoding
|
# Convert previous features to one hot encoding
|
||||||
|
|||||||
95
R-package/man/cb.gblinear.history.Rd
Normal file
95
R-package/man/cb.gblinear.history.Rd
Normal file
@ -0,0 +1,95 @@
|
|||||||
|
% Generated by roxygen2: do not edit by hand
|
||||||
|
% Please edit documentation in R/callbacks.R
|
||||||
|
\name{cb.gblinear.history}
|
||||||
|
\alias{cb.gblinear.history}
|
||||||
|
\title{Callback closure for collecting the model coefficients history of a gblinear booster
|
||||||
|
during its training.}
|
||||||
|
\usage{
|
||||||
|
cb.gblinear.history(sparse = FALSE)
|
||||||
|
}
|
||||||
|
\arguments{
|
||||||
|
\item{sparse}{when set to FALSE/TURE, a dense/sparse matrix is used to store the result.
|
||||||
|
Sparse format is useful when one expects only a subset of coefficients to be non-zero,
|
||||||
|
when using the "thrifty" feature selector with fairly small number of top features
|
||||||
|
selected per iteration.}
|
||||||
|
}
|
||||||
|
\value{
|
||||||
|
Results are stored in the \code{coefs} element of the closure.
|
||||||
|
The \code{\link{xgb.gblinear.history}} convenience function provides an easy way to access it.
|
||||||
|
With \code{xgb.train}, it is either a dense of a sparse matrix.
|
||||||
|
While with \code{xgb.cv}, it is a list (an element per each fold) of such matrices.
|
||||||
|
}
|
||||||
|
\description{
|
||||||
|
Callback closure for collecting the model coefficients history of a gblinear booster
|
||||||
|
during its training.
|
||||||
|
}
|
||||||
|
\details{
|
||||||
|
To keep things fast and simple, gblinear booster does not internally store the history of linear
|
||||||
|
model coefficients at each boosting iteration. This callback provides a workaround for storing
|
||||||
|
the coefficients' path, by extracting them after each training iteration.
|
||||||
|
|
||||||
|
Callback function expects the following values to be set in its calling frame:
|
||||||
|
\code{bst} (or \code{bst_folds}).
|
||||||
|
}
|
||||||
|
\examples{
|
||||||
|
#### Binary classification:
|
||||||
|
#
|
||||||
|
# In the iris dataset, it is hard to linearly separate Versicolor class from the rest
|
||||||
|
# without considering the 2nd order interactions:
|
||||||
|
require(magrittr)
|
||||||
|
x <- model.matrix(Species ~ .^2, iris)[,-1]
|
||||||
|
colnames(x)
|
||||||
|
dtrain <- xgb.DMatrix(scale(x), label = 1*(iris$Species == "versicolor"))
|
||||||
|
param <- list(booster = "gblinear", objective = "reg:logistic", eval_metric = "auc",
|
||||||
|
lambda = 0.0003, alpha = 0.0003, nthread = 2)
|
||||||
|
# For 'shotgun', which is a default linear updater, using high eta values may result in
|
||||||
|
# unstable behaviour in some datasets. With this simple dataset, however, the high learning
|
||||||
|
# rate does not break the convergence, but allows us to illustrate the typical pattern of
|
||||||
|
# "stochastic explosion" behaviour of this lock-free algorithm at early boosting iterations.
|
||||||
|
bst <- xgb.train(param, dtrain, list(tr=dtrain), nrounds = 200, eta = 1.,
|
||||||
|
callbacks = list(cb.gblinear.history()))
|
||||||
|
# Extract the coefficients' path and plot them vs boosting iteration number:
|
||||||
|
coef_path <- xgb.gblinear.history(bst)
|
||||||
|
matplot(coef_path, type = 'l')
|
||||||
|
|
||||||
|
# With the deterministic coordinate descent updater, it is safer to use higher learning rates.
|
||||||
|
# Will try the classical componentwise boosting which selects a single best feature per round:
|
||||||
|
bst <- xgb.train(param, dtrain, list(tr=dtrain), nrounds = 200, eta = 0.8,
|
||||||
|
updater = 'coord_descent', feature_selector = 'thrifty', top_k = 1,
|
||||||
|
callbacks = list(cb.gblinear.history()))
|
||||||
|
xgb.gblinear.history(bst) \%>\% matplot(type = 'l')
|
||||||
|
# Componentwise boosting is known to have similar effect to Lasso regularization.
|
||||||
|
# Try experimenting with various values of top_k, eta, nrounds,
|
||||||
|
# as well as different feature_selectors.
|
||||||
|
|
||||||
|
# For xgb.cv:
|
||||||
|
bst <- xgb.cv(param, dtrain, nfold = 5, nrounds = 100, eta = 0.8,
|
||||||
|
callbacks = list(cb.gblinear.history()))
|
||||||
|
# coefficients in the CV fold #3
|
||||||
|
xgb.gblinear.history(bst)[[3]] \%>\% matplot(type = 'l')
|
||||||
|
|
||||||
|
|
||||||
|
#### Multiclass classification:
|
||||||
|
#
|
||||||
|
dtrain <- xgb.DMatrix(scale(x), label = as.numeric(iris$Species) - 1)
|
||||||
|
param <- list(booster = "gblinear", objective = "multi:softprob", num_class = 3,
|
||||||
|
lambda = 0.0003, alpha = 0.0003, nthread = 2)
|
||||||
|
# For the default linear updater 'shotgun' it sometimes is helpful
|
||||||
|
# to use smaller eta to reduce instability
|
||||||
|
bst <- xgb.train(param, dtrain, list(tr=dtrain), nrounds = 70, eta = 0.5,
|
||||||
|
callbacks = list(cb.gblinear.history()))
|
||||||
|
# Will plot the coefficient paths separately for each class:
|
||||||
|
xgb.gblinear.history(bst, class_index = 0) \%>\% matplot(type = 'l')
|
||||||
|
xgb.gblinear.history(bst, class_index = 1) \%>\% matplot(type = 'l')
|
||||||
|
xgb.gblinear.history(bst, class_index = 2) \%>\% matplot(type = 'l')
|
||||||
|
|
||||||
|
# CV:
|
||||||
|
bst <- xgb.cv(param, dtrain, nfold = 5, nrounds = 70, eta = 0.5,
|
||||||
|
callbacks = list(cb.gblinear.history(FALSE)))
|
||||||
|
# 1st forld of 1st class
|
||||||
|
xgb.gblinear.history(bst, class_index = 0)[[1]] \%>\% matplot(type = 'l')
|
||||||
|
|
||||||
|
}
|
||||||
|
\seealso{
|
||||||
|
\code{\link{callbacks}}, \code{\link{xgb.gblinear.history}}.
|
||||||
|
}
|
||||||
35
R-package/man/xgb.gblinear.history.Rd
Normal file
35
R-package/man/xgb.gblinear.history.Rd
Normal file
@ -0,0 +1,35 @@
|
|||||||
|
% Generated by roxygen2: do not edit by hand
|
||||||
|
% Please edit documentation in R/callbacks.R
|
||||||
|
\name{xgb.gblinear.history}
|
||||||
|
\alias{xgb.gblinear.history}
|
||||||
|
\title{Extract gblinear coefficients history.}
|
||||||
|
\usage{
|
||||||
|
xgb.gblinear.history(model, class_index = NULL)
|
||||||
|
}
|
||||||
|
\arguments{
|
||||||
|
\item{model}{either an \code{xgb.Booster} or a result of \code{xgb.cv()}, trained
|
||||||
|
using the \code{cb.gblinear.history()} callback.}
|
||||||
|
|
||||||
|
\item{class_index}{zero-based class index to extract the coefficients for only that
|
||||||
|
specific class in a multinomial multiclass model. When it is NULL, all the
|
||||||
|
coeffients are returned. Has no effect in non-multiclass models.}
|
||||||
|
}
|
||||||
|
\value{
|
||||||
|
For an \code{xgb.train} result, a matrix (either dense or sparse) with the columns
|
||||||
|
corresponding to iteration's coefficients (in the order as \code{xgb.dump()} would
|
||||||
|
return) and the rows corresponding to boosting iterations.
|
||||||
|
|
||||||
|
For an \code{xgb.cv} result, a list of such matrices is returned with the elements
|
||||||
|
corresponding to CV folds.
|
||||||
|
}
|
||||||
|
\description{
|
||||||
|
A helper function to extract the matrix of linear coefficients' history
|
||||||
|
from a gblinear model created while using the \code{cb.gblinear.history()}
|
||||||
|
callback.
|
||||||
|
}
|
||||||
|
\examples{
|
||||||
|
\dontrun{
|
||||||
|
See \\code{\\link{cv.gblinear.history}}
|
||||||
|
}
|
||||||
|
|
||||||
|
}
|
||||||
Loading…
x
Reference in New Issue
Block a user