XGBoost: A Scalable Tree Boosting System
Abstract
Tree boosting is a highly effective and widely used machine learning method. In this paper, we describe a scalable endtoend tree boosting system called XGBoost, which is used widely by data scientists to achieve stateoftheart results on many machine learning challenges. We propose a novel sparsityaware algorithm for sparse data and weighted quantile sketch for approximate tree learning. More importantly, we provide insights on cache access patterns, data compression and sharding to build a scalable tree boosting system. By combining these insights, XGBoost scales beyond billions of examples using far fewer resources than existing systems.
2016 \setcopyrightrightsretained \conferenceinfoKDD ’16,August 1317, 2016, San Francisco, CA, USA \isbn \acmPrice \doi
2
<ccs2012> <concept_id>10010147.10010257</concept_id> <concept_desc>Computing methodologies Machine learning</concept_desc> <concept_significance>500</concept_significance> </concept> <concept> <concept> <concept_id>10002951.10003227.10003351</concept_id> <concept_desc>Information systems Data mining</concept_desc> <concept_significance>500</concept_significance> </concept> <concept> </ccs2012>
1 Introduction
Machine learning and datadriven approaches are becoming very important in many areas. Smart spam classifiers protect our email by learning from massive amounts of spam data and user feedback; advertising systems learn to match the right ads with the right context; fraud detection systems protect banks from malicious attackers; anomaly event detection systems help experimental physicists to find events that lead to new physics. There are two important factors that drive these successful applications: usage of effective (statistical) models that capture the complex data dependencies and scalable learning systems that learn the model of interest from large datasets.
Among the machine learning methods used in practice, gradient tree boosting [10]^{1}^{1}1Gradient tree boosting is also known as gradient boosting machine (GBM) or gradient boosted regression tree (GBRT) is one technique that shines in many applications. Tree boosting has been shown to give stateoftheart results on many standard classification benchmarks [16]. LambdaMART [5], a variant of tree boosting for ranking, achieves stateoftheart result for ranking problems. Besides being used as a standalone predictor, it is also incorporated into realworld production pipelines for ad click through rate prediction [15]. Finally, it is the defacto choice of ensemble method and is used in challenges such as the Netflix prize [3].
In this paper, we describe XGBoost, a scalable machine learning system for tree boosting. The system is available as an open source package^{2}^{2}2https://github.com/dmlc/xgboost. The impact of the system has been widely recognized in a number of machine learning and data mining challenges. Take the challenges hosted by the machine learning competition site Kaggle for example. Among the 29 challenge winning solutions ^{3}^{3}3Solutions come from of top3 teams of each competitions. published at Kaggle’s blog during 2015, 17 solutions used XGBoost. Among these solutions, eight solely used XGBoost to train the model, while most others combined XGBoost with neural nets in ensembles. For comparison, the second most popular method, deep neural nets, was used in 11 solutions. The success of the system was also witnessed in KDDCup 2015, where XGBoost was used by every winning team in the top10. Moreover, the winning teams reported that ensemble methods outperform a wellconfigured XGBoost by only a small amount [1].
These results demonstrate that our system gives stateoftheart results on a wide range of problems. Examples of the problems in these winning solutions include: store sales prediction; high energy physics event classification; web text classification; customer behavior prediction; motion detection; ad click through rate prediction; malware classification; product categorization; hazard risk prediction; massive online course dropout rate prediction. While domain dependent data analysis and feature engineering play an important role in these solutions, the fact that XGBoost is the consensus choice of learner shows the impact and importance of our system and tree boosting.
The most important factor behind the success of XGBoost is its scalability in all scenarios. The system runs more than ten times faster than existing popular solutions on a single machine and scales to billions of examples in distributed or memorylimited settings. The scalability of XGBoost is due to several important systems and algorithmic optimizations. These innovations include: a novel tree learning algorithm is for handling sparse data; a theoretically justified weighted quantile sketch procedure enables handling instance weights in approximate tree learning. Parallel and distributed computing makes learning faster which enables quicker model exploration. More importantly, XGBoost exploits outofcore computation and enables data scientists to process hundred millions of examples on a desktop. Finally, it is even more exciting to combine these techniques to make an endtoend system that scales to even larger data with the least amount of cluster resources. The major contributions of this paper is listed as follows:

We design and build a highly scalable endtoend tree boosting system.

We propose a theoretically justified weighted quantile sketch for efficient proposal calculation.

We introduce a novel sparsityaware algorithm for parallel tree learning.

We propose an effective cacheaware block structure for outofcore tree learning.
While there are some existing works on parallel tree boosting [22, 23, 19], the directions such as outofcore computation, cacheaware and sparsityaware learning have not been explored. More importantly, an endtoend system that combines all of these aspects gives a novel solution for realworld usecases. This enables data scientists as well as researchers to build powerful variants of tree boosting algorithms [7, 8]. Besides these major contributions, we also make additional improvements in proposing a regularized learning objective, which we will include for completeness.
The remainder of the paper is organized as follows. We will first review tree boosting and introduce a regularized objective in Sec. 2. We then describe the split finding methods in Sec. 3 as well as the system design in Sec. 4, including experimental results when relevant to provide quantitative support for each optimization we describe. Related work is discussed in Sec. 5. Detailed endtoend evaluations are included in Sec. 6. Finally we conclude the paper in Sec. 7.
2 Tree Boosting in a NutShell
We review gradient tree boosting algorithms in this section. The derivation follows from the same idea in existing literatures in gradient boosting. Specicially the second order method is originated from Friedman et al. [12]. We make minor improvements in the reguralized objective, which were found helpful in practice.
2.1 Regularized Learning Objective
For a given data set with examples and features (), a tree ensemble model (shown in Fig. 1) uses additive functions to predict the output.
(1) 
where is the space of regression trees (also known as CART). Here represents the structure of each tree that maps an example to the corresponding leaf index. is the number of leaves in the tree. Each corresponds to an independent tree structure and leaf weights . Unlike decision trees, each regression tree contains a continuous score on each of the leaf, we use to represent score on th leaf. For a given example, we will use the decision rules in the trees (given by ) to classify it into the leaves and calculate the final prediction by summing up the score in the corresponding leaves (given by ). To learn the set of functions used in the model, we minimize the following regularized objective.
(2) 
Here is a differentiable convex loss function that measures the difference between the prediction and the target . The second term penalizes the complexity of the model (i.e., the regression tree functions). The additional regularization term helps to smooth the final learnt weights to avoid overfitting. Intuitively, the regularized objective will tend to select a model employing simple and predictive functions. A similar regularization technique has been used in Regularized greedy forest (RGF) [25] model. Our objective and the corresponding learning algorithm is simpler than RGF and easier to parallelize. When the regularization parameter is set to zero, the objective falls back to the traditional gradient tree boosting.
2.2 Gradient Tree Boosting
The tree ensemble model in Eq. (2) includes functions as parameters and cannot be optimized using traditional optimization methods in Euclidean space. Instead, the model is trained in an additive manner. Formally, let be the prediction of the th instance at the th iteration, we will need to add to minimize the following objective.
This means we greedily add the that most improves our model according to Eq. (2). Secondorder approximation can be used to quickly optimize the objective in the general setting [12].
where and are first and second order gradient statistics on the loss function. We can remove the constant terms to obtain the following simplified objective at step .
(3) 
Define as the instance set of leaf . We can rewrite Eq (3) by expanding as follows
(4) 
For a fixed structure , we can compute the optimal weight of leaf by
(5) 
and calculate the corresponding optimal value by
(6) 
Eq (6) can be used as a scoring function to measure the quality of a tree structure . This score is like the impurity score for evaluating decision trees, except that it is derived for a wider range of objective functions. Fig. 2 illustrates how this score can be calculated.
Normally it is impossible to enumerate all the possible tree structures . A greedy algorithm that starts from a single leaf and iteratively adds branches to the tree is used instead. Assume that and are the instance sets of left and right nodes after the split. Lettting , then the loss reduction after the split is given by
(7) 
This formula is usually used in practice for evaluating the split candidates.
2.3 Shrinkage and Column Subsampling
Besides the regularized objective mentioned in Sec. 2.1, two additional techniques are used to further prevent overfitting. The first technique is shrinkage introduced by Friedman [11]. Shrinkage scales newly added weights by a factor after each step of tree boosting. Similar to a learning rate in tochastic optimization, shrinkage reduces the influence of each individual tree and leaves space for future trees to improve the model. The second technique is column (feature) subsampling. This technique is used in RandomForest [4, 13], It is implemented in a commercial software TreeNet ^{4}^{4}4https://www.salfordsystems.com/products/treenet for gradient boosting, but is not implemented in existing opensource packages. According to user feedback, using column subsampling prevents overfitting even more so than the traditional row subsampling (which is also supported). The usage of column subsamples also speeds up computations of the parallel algorithm described later.
3 Split Finding Algorithms
3.1 Basic Exact Greedy Algorithm
One of the key problems in tree learning is to find the best split as indicated by Eq (7). In order to do so, a split finding algorithm enumerates over all the possible splits on all the features. We call this the exact greedy algorithm. Most existing single machine tree boosting implementations, such as scikitlearn [20], R’s gbm [21] as well as the single machine version of XGBoost support the exact greedy algorithm. The exact greedy algorithm is shown in Alg. 1. It is computationally demanding to enumerate all the possible splits for continuous features. In order to do so efficiently, the algorithm must first sort the data according to feature values and visit the data in sorted order to accumulate the gradient statistics for the structure score in Eq (7).
3.2 Approximate Algorithm
The exact greedy algorithm is very powerful since it enumerates over all possible splitting points greedily. However, it is impossible to efficiently do so when the data does not fit entirely into memory. Same problem also arises in the distributed setting. To support effective gradient tree boosting in these two settings, an approximate algorithm is needed.
We summarize an approximate framework, which resembles the ideas proposed in past literatures [17, 2, 22], in Alg. 2. To summarize, the algorithm first proposes candidate splitting points according to percentiles of feature distribution (a specific criteria will be given in Sec. 3.3). The algorithm then maps the continuous features into buckets split by these candidate points, aggregates the statistics and finds the best solution among proposals based on the aggregated statistics.
There are two variants of the algorithm, depending on when the proposal is given. The global variant proposes all the candidate splits during the initial phase of tree construction, and uses the same proposals for split finding at all levels. The local variant reproposes after each split. The global method requires less proposal steps than the local method. However, usually more candidate points are needed for the global proposal because candidates are not refined after each split. The local proposal refines the candidates after splits, and can potentially be more appropriate for deeper trees. A comparison of different algorithms on a Higgs boson dataset is given by Fig. 3. We find that the local proposal indeed requires fewer candidates. The global proposal can be as accurate as the local one given enough candidates.
Most existing approximate algorithms for distributed tree learning also follow this framework. Notably, it is also possible to directly construct approximate histograms of gradient statistics [22]. It is also possible to use other variants of binning strategies instead of quantile [17]. Quantile strategy benefit from being distributable and recomputable, which we will detail in next subsection. From Fig. 3, we also find that the quantile strategy can get the same accuracy as exact greedy given reasonable approximation level.
Our system efficiently supports exact greedy for the single machine setting, as well as approximate algorithm with both local and global proposal methods for all settings. Users can freely choose between the methods according to their needs.
3.3 Weighted Quantile Sketch
One important step in the approximate algorithm is to propose candidate split points. Usually percentiles of a feature are used to make candidates distribute evenly on the data. Formally, let multiset represent the th feature values and second order gradient statistics of each training instances. We can define a rank functions as
(8) 
which represents the proportion of instances whose feature value is smaller than . The goal is to find candidate split points , such that
(9) 
Here is an approximation factor. Intuitively, this means that there is roughly candidate points. Here each data point is weighted by . To see why represents the weight, we can rewrite Eq (3) as
which is exactly weighted squared loss with labels and weights . For large datasets, it is nontrivial to find candidate splits that satisfy the criteria. When every instance has equal weights, an existing algorithm called quantile sketch [14, 24] solves the problem. However, there is no existing quantile sketch for the weighted datasets. Therefore, most existing approximate algorithms either resorted to sorting on a random subset of data which have a chance of failure or heuristics that do not have theoretical guarantee.
To solve this problem, we introduced a novel distributed weighted quantile sketch algorithm that can handle weighted data with a provable theoretical guarantee. The general idea is to propose a data structure that supports merge and prune operations, with each operation proven to maintain a certain accuracy level. A detailed description of the algorithm as well as proofs are given in the appendix.
3.4 Sparsityaware Split Finding
In many realworld problems, it is quite common for the input to be sparse. There are multiple possible causes for sparsity: 1) presence of missing values in the data; 2) frequent zero entries in the statistics; and, 3) artifacts of feature engineering such as onehot encoding. It is important to make the algorithm aware of the sparsity pattern in the data. In order to do so, we propose to add a default direction in each tree node, which is shown in Fig. 4. When a value is missing in the sparse matrix , the instance is classified into the default direction. There are two choices of default direction in each branch. The optimal default directions are learnt from the data. The algorithm is shown in Alg. 3. The key improvement is to only visit the nonmissing entries . The presented algorithm treats the nonpresence as a missing value and learns the best direction to handle missing values. The same algorithm can also be applied when the nonpresence corresponds to a user specified value by limiting the enumeration only to consistent solutions.
To the best of our knowledge, most existing tree learning algorithms are either only optimized for dense data, or need specific procedures to handle limited cases such as categorical encoding. XGBoost handles all sparsity patterns in a unified way. More importantly, our method exploits the sparsity to make computation complexity linear to number of nonmissing entries in the input. Fig. 5 shows the comparison of sparsity aware and a naive implementation on an Allstate10K dataset (description of dataset given in Sec. 6). We find that the sparsity aware algorithm runs 50 times faster than the naive version. This confirms the importance of the sparsity aware algorithm.
4 System Design
4.1 Column Block for Parallel Learning
The most time consuming part of tree learning is to get the data into sorted order. In order to reduce the cost of sorting, we propose to store the data in inmemory units, which we called block. Data in each block is stored in the compressed column (CSC) format, with each column sorted by the corresponding feature value. This input data layout only needs to be computed once before training, and can be reused in later iterations.
In the exact greedy algorithm, we store the entire dataset in a single block and run the split search algorithm by linearly scanning over the presorted entries. We do the split finding of all leaves collectively, so one scan over the block will collect the statistics of the split candidates in all leaf branches. Fig. 6 shows how we transform a dataset into the format and find the optimal split using the block structure.
The block structure also helps when using the approximate algorithms. Multiple blocks can be used in this case, with each block corresponding to subset of rows in the dataset. Different blocks can be distributed across machines, or stored on disk in the outofcore setting. Using the sorted structure, the quantile finding step becomes a linear scan over the sorted columns. This is especially valuable for local proposal algorithms, where candidates are generated frequently at each branch. The binary search in histogram aggregation also becomes a linear time merge style algorithm.
Collecting statistics for each column can be parallelized, giving us a parallel algorithm for split finding. Importantly, the column block structure also supports column subsampling, as it is easy to select a subset of columns in a block.
Time Complexity Analysis Let be the maximum depth of the tree and be total number of trees. For the exact greedy algorithm, the time complexity of original spase aware algorithm is . Here we use to denote number of nonmissing entries in the training data. On the other hand, tree boosting on the block structure only cost . Here is the one time preprocessing cost that can be amortized. This analysis shows that the block structure helps to save an additional factor, which is significant when is large. For the approximate algorithm, the time complexity of original algorithm with binary search is . Here is the number of proposal candidates in the dataset. While is usually between 32 and 100, the log factor still introduces overhead. Using the block structure, we can reduce the time to , where is the maximum number of rows in each block. Again we can save the additional factor in computation.
4.2 Cacheaware Access
While the proposed block structure helps optimize the computation complexity of split finding, the new algorithm requires indirect fetches of gradient statistics by row index, since these values are accessed in order of feature. This is a noncontinuous memory access. A naive implementation of split enumeration introduces immediate read/write dependency between the accumulation and the noncontinuous memory fetch operation (see Fig. 8). This slows down split finding when the gradient statistics do not fit into CPU cache and cache miss occur.
System  exact greedy  approximate global  approximate local  outofcore  sparsity aware  parallel 

XGBoost  yes  yes  yes  yes  yes  yes 
pGBRT  no  no  yes  no  no  yes 
Spark MLLib  no  yes  no  no  partially  yes 
H2O  no  yes  no  no  partially  yes 
scikitlearn  yes  no  no  no  no  no 
R GBM  yes  no  no  no  partially  no 
For the exact greedy algorithm, we can alleviate the problem by a cacheaware prefetching algorithm. Specifically, we allocate an internal buffer in each thread, fetch the gradient statistics into it, and then perform accumulation in a minibatch manner. This prefetching changes the direct read/write dependency to a longer dependency and helps to reduce the runtime overhead when number of rows in the is large. Figure 7 gives the comparison of cacheaware vs. non cacheaware algorithm on the the Higgs and the Allstate dataset. We find that cacheaware implementation of the exact greedy algorithm runs twice as fast as the naive version when the dataset is large.
For approximate algorithms, we solve the problem by choosing a correct block size. We define the block size to be maximum number of examples in contained in a block, as this reflects the cache storage cost of gradient statistics. Choosing an overly small block size results in small workload for each thread and leads to inefficient parallelization. On the other hand, overly large blocks result in cache misses, as the gradient statistics do not fit into the CPU cache. A good choice of block size balances these two factors. We compared various choices of block size on two data sets. The results are given in Fig. 9. This result validates our discussion and shows that choosing examples per block balances the cache property and parallelization.
4.3 Blocks for Outofcore Computation
One goal of our system is to fully utilize a machine’s resources to achieve scalable learning. Besides processors and memory, it is important to utilize disk space to handle data that does not fit into main memory. To enable outofcore computation, we divide the data into multiple blocks and store each block on disk. During computation, it is important to use an independent thread to prefetch the block into a main memory buffer, so computation can happen in concurrence with disk reading. However, this does not entirely solve the problem since the disk reading takes most of the computation time. It is important to reduce the overhead and increase the throughput of disk IO. We mainly use two techniques to improve the outofcore computation.
Block Compression The first technique we use is block compression. The block is compressed by columns, and decompressed on the fly by an independent thread when loading into main memory. This helps to trade some of the computation in decompression with the disk reading cost. We use a general purpose compression algorithm for compressing the features values. For the row index, we substract the row index by the begining index of the block and use a 16bit integer to store each offset. This requires examples per block, which is confirmed to be a good setting. In most of the dataset we tested, we achieve roughly a 26% to 29% compression ratio.
Block Sharding The second technique is to shard the data onto multiple disks in an alternative manner. A prefetcher thread is assigned to each disk and fetches the data into an inmemory buffer. The training thread then alternatively reads the data from each buffer. This helps to increase the throughput of disk reading when multiple disks are available.
5 Related Works
Our system implements gradient boosting [10], which performs additive optimization in functional space. Gradient tree boosting has been successfully used in classification [12], learning to rank [5], structured prediction [8] as well as other fields. XGBoost incorporates a regularized model to prevent overfitting. This this resembles previous work on regularized greedy forest [25], but simplifies the objective and algorithm for parallelization. Column sampling is a simple but effective technique borrowed from RandomForest [4]. While sparsityaware learning is essential in other types of models such as linear models [9], few works on tree learning have considered this topic in a principled way. The algorithm proposed in this paper is the first unified approach to handle all kinds of sparsity patterns.
There are several existing works on parallelizing tree learning [22, 19]. Most of these algorithms fall into the approximate framework described in this paper. Notably, it is also possible to partition data by columns [23] and apply the exact greedy algorithm. This is also supported in our framework, and the techniques such as cacheaware prefecthing can be used to benefit this type of algorithm. While most existing works focus on the algorithmic aspect of parallelization, our work improves in two unexplored system directions: outofcore computation and cacheaware learning. This gives us insights on how the system and the algorithm can be jointly optimized and provides an endtoend system that can handle large scale problems with very limited computing resources. We also summarize the comparison between our system and existing opensource implementations in Table 1.
Quantile summary (without weights) is a classical problem in the database community [14, 24]. However, the approximate tree boosting algorithm reveals a more general problem – finding quantiles on weighted data. To the best of our knowledge, the weighted quantile sketch proposed in this paper is the first method to solve this problem. The weighted quantile summary is also not specific to the tree learning and can benefit other applications in data science and machine learning in the future.
6 End to End Evaluations
6.1 System Implementation
We implemented XGBoost as an open source package^{5}^{5}5https://github.com/dmlc/xgboost. The package is portable and reusable. It supports various weighted classification and rank objective functions, as well as user defined objective function. It is available in popular languages such as python, R, Julia and integrates naturally with language native data science pipelines such as scikitlearn. The distributed version is built on top of the rabit library^{6}^{6}6https://github.com/dmlc/rabit for allreduce. The portability of XGBoost makes it available in many ecosystems, instead of only being tied to a specific platform. The distributed XGBoost runs natively on Hadoop, MPI Sun Grid engine. Recently, we also enable distributed XGBoost on jvm bigdata stacks such as Flink and Spark. The distributed version has also been integrated into cloud platform Tianchi^{7}^{7}7https://tianchi.aliyun.com of Alibaba. We believe that there will be more integrations in the future.
6.2 Dataset and Setup
Dataset  Task  

Allstate  10 M  4227  Insurance claim classification 
Higgs Boson  10 M  28  Event classification 
Yahoo LTRC  473K  700  Learning to Rank 
Criteo  1.7 B  67  Click through rate prediction 
We used four datasets in our experiments. A summary of these datasets is given in Table 2. In some of the experiments, we use a randomly selected subset of the data either due to slow baselines or to demonstrate the performance of the algorithm with varying dataset size. We use a suffix to denote the size in these cases. For example Allstate10K means a subset of the Allstate dataset with 10K instances.
The first dataset we use is the Allstate insurance claim dataset^{8}^{8}8https://www.kaggle.com/c/ClaimPredictionChallenge. The task is to predict the likelihood and cost of an insurance claim given different risk factors. In the experiment, we simplified the task to only predict the likelihood of an insurance claim. This dataset is used to evaluate the impact of sparsityaware algorithm in Sec. 3.4. Most of the sparse features in this data come from onehot encoding. We randomly select 10M instances as training set and use the rest as evaluation set.
The second dataset is the Higgs boson dataset^{9}^{9}9https://archive.ics.uci.edu/ml/datasets/HIGGS from high energy physics. The data was produced using Monte Carlo simulations of physics events. It contains 21 kinematic properties measured by the particle detectors in the accelerator. It also contains seven additional derived physics quantities of the particles. The task is to classify whether an event corresponds to the Higgs boson. We randomly select 10M instances as training set and use the rest as evaluation set.
The third dataset is the Yahoo! learning to rank challenge dataset [6], which is one of the most commonly used benchmarks in learning to rank algorithms. The dataset contains 20K web search queries, with each query corresponding to a list of around 22 documents. The task is to rank the documents according to relevance of the query. We use the official train test split in our experiment.
The last dataset is the criteo terabyte click log dataset^{10}^{10}10http://labs.criteo.com/downloads/downloadterabyteclicklogs/. We use this dataset to evaluate the scaling property of the system in the outofcore and the distributed settings. The data contains 13 integer features and 26 ID features of user, item and advertiser information. Since a tree based model is better at handling continuous features, we preprocess the data by calculating the statistics of average CTR and count of ID features on the first ten days, replacing the ID features by the corresponding count statistics during the next ten days for training. The training set after preprocessing contains 1.7 billion instances with 67 features (13 integer, 26 average CTR statistics and 26 counts). The entire dataset is more than one terabyte in LibSVM format.
We use the first three datasets for the single machine parallel setting, and the last dataset for the distributed and outofcore settings. All the single machine experiments are conducted on a Dell PowerEdge R420 with two eightcore Intel Xeon (E52470) (2.3GHz) and 64GB of memory. If not specified, all the experiments are run using all the available cores in the machine. The machine settings of the distributed and the outofcore experiments will be described in the corresponding section. In all the experiments, we boost trees with a common setting of maximum depth equals 8, shrinkage equals 0.1 and no column subsampling unless explicitly specified. We can find similar results when we use other settings of maximum depth.
6.3 Classification
Method  Time per Tree (sec)  Test AUC 

XGBoost  0.6841  0.8304 
XGBoost (colsample=0.5)  0.6401  0.8245 
scikitlearn  28.51  0.8302 
R.gbm  1.032  0.6224 
In this section, we evaluate the performance of XGBoost on a single machine using the exact greedy algorithm on Higgs1M data, by comparing it against two other commonly used exact greedy tree boosting implementations. Since scikitlearn only handles nonsparse input, we choose the dense Higgs dataset for a fair comparison. We use the 1M subset to make scikitlearn finish running in reasonable time. Among the methods in comparison, R’s GBM uses a greedy approach that only expands one branch of a tree, which makes it faster but can result in lower accuracy, while both scikitlearn and XGBoost learn a full tree. The results are shown in Table 3. Both XGBoost and scikitlearn give better performance than R’s GBM, while XGBoost runs more than 10x faster than scikitlearn. In this experiment, we also find column subsamples gives slightly worse performance than using all the features. This could due to the fact that there are few important features in this dataset and we can benefit from greedily select from all the features.
6.4 Learning to Rank
Method  Time per Tree (sec)  [email protected] 

XGBoost  0.826  0.7892 
XGBoost (colsample=0.5)  0.506  0.7913 
pGBRT [22]  2.576  0.7915 
We next evaluate the performance of XGBoost on the learning to rank problem. We compare against pGBRT [22], the best previously pubished system on this task. XGBoost runs exact greedy algorithm, while pGBRT only support an approximate algorithm. The results are shown in Table 4 and Fig. 10. We find that XGBoost runs faster. Interestingly, subsampling columns not only reduces running time, and but also gives a bit higher performance for this problem. This could due to the fact that the subsampling helps prevent overfitting, which is observed by many of the users.
6.5 Outofcore Experiment
We also evaluate our system in the outofcore setting on the criteo data. We conducted the experiment on one AWS c3.8xlarge machine (32 vcores, two 320 GB SSD, 60 GB RAM). The results are shown in Figure 11. We can find that compression helps to speed up computation by factor of three, and sharding into two disks further gives 2x speedup. For this type of experiment, it is important to use a very large dataset to drain the system file cache for a real outofcore setting. This is indeed our setup. We can observe a transition point when the system runs out of file cache. Note that the transition in the final method is less dramatic. This is due to larger disk throughput and better utilization of computation resources. Our final method is able to process 1.7 billion examples on a single machine.
6.6 Distributed Experiment
Finally, we evaluate the system in the distributed setting. We set up a YARN cluster on EC2 with m3.2xlarge machines, which is a very common choice for clusters. Each machine contains 8 virtual cores, 30GB of RAM and two 80GB SSD local disks. The dataset is stored on AWS S3 instead of HDFS to avoid purchasing persistent storage.
We first compare our system against two productionlevel distributed systems: Spark MLLib [18] and H2O ^{11}^{11}11www.h2o.ai. We use 32 m3.2xlarge machines and test the performance of the systems with various input size. Both of the baseline systems are inmemory analytics frameworks that need to store the data in RAM, while XGBoost can switch to outofcore setting when it runs out of memory. The results are shown in Fig. 12. We can find that XGBoost runs faster than the baseline systems. More importantly, it is able to take advantage of outofcore computing and smoothly scale to all 1.7 billion examples with the given limited computing resources. The baseline systems are only able to handle subset of the data with the given resources. This experiment shows the advantage to bring all the system improvement together and solve a realworld scale problem. We also evaluate the scaling property of XGBoost by varying the number of machines. The results are shown in Fig. 13. We can find XGBoost’s performance scales linearly as we add more machines. Importantly, XGBoost is able to handle the entire 1.7 billion data with only four machines. This shows the system’s potential to handle even larger data.
7 Conclusion
In this paper, we described the lessons we learnt when building XGBoost, a scalable tree boosting system that is widely used by data scientists and provides stateoftheart results on many problems. We proposed a novel sparsity aware algorithm for handling sparse data and a theoretically justified weighted quantile sketch for approximate learning. Our experience shows that cache access patterns, data compression and sharding are essential elements for building a scalable endtoend system for tree boosting. These lessons can be applied to other machine learning systems as well. By combining these insights, XGBoost is able to solve realworld scale problems using a minimal amount of resources.
Acknowledgments
We would like to thank Tyler B. Johnson, Marco Tulio Ribeiro, Sameer Singh, Arvind Krishnamurthy for their valuable feedback. We also sincerely thank Tong He, Bing Xu, Michael Benesty, Yuan Tang, Hongliang Liu, Qiang Kou, Nan Zhu and all other contributors in the XGBoost community. This work was supported in part by ONR (PECASE) N000141010672, NSF IIS 1258741 and the TerraSwarm Research Center sponsored by MARCO and DARPA.
References
 [1] R. Bekkerman. The present and the future of the kdd cup competition: an outsider’s perspective.
 [2] R. Bekkerman, M. Bilenko, and J. Langford. Scaling Up Machine Learning: Parallel and Distributed Approaches. Cambridge University Press, New York, NY, USA, 2011.
 [3] J. Bennett and S. Lanning. The netflix prize. In Proceedings of the KDD Cup Workshop 2007, pages 3–6, New York, Aug. 2007.
 [4] L. Breiman. Random forests. Maching Learning, 45(1):5–32, Oct. 2001.
 [5] C. Burges. From ranknet to lambdarank to lambdamart: An overview. Learning, 11:23–581, 2010.
 [6] O. Chapelle and Y. Chang. Yahoo! Learning to Rank Challenge Overview. Journal of Machine Learning Research  W & CP, 14:1–24, 2011.
 [7] T. Chen, H. Li, Q. Yang, and Y. Yu. General functional matrix factorization using gradient boosting. In Proceeding of 30th International Conference on Machine Learning (ICML’13), volume 1, pages 436–444, 2013.
 [8] T. Chen, S. Singh, B. Taskar, and C. Guestrin. Efficient secondorder gradient boosting for conditional random fields. In Proceeding of 18th Artificial Intelligence and Statistics Conference (AISTATS’15), volume 1, 2015.
 [9] R.E. Fan, K.W. Chang, C.J. Hsieh, X.R. Wang, and C.J. Lin. LIBLINEAR: A library for large linear classification. Journal of Machine Learning Research, 9:1871–1874, 2008.
 [10] J. Friedman. Greedy function approximation: a gradient boosting machine. Annals of Statistics, 29(5):1189–1232, 2001.
 [11] J. Friedman. Stochastic gradient boosting. Computational Statistics & Data Analysis, 38(4):367–378, 2002.
 [12] J. Friedman, T. Hastie, and R. Tibshirani. Additive logistic regression: a statistical view of boosting. Annals of Statistics, 28(2):337–407, 2000.
 [13] J. H. Friedman and B. E. Popescu. Importance sampled learning ensembles, 2003.
 [14] M. Greenwald and S. Khanna. Spaceefficient online computation of quantile summaries. In Proceedings of the 2001 ACM SIGMOD International Conference on Management of Data, pages 58–66, 2001.
 [15] X. He, J. Pan, O. Jin, T. Xu, B. Liu, T. Xu, Y. Shi, A. Atallah, R. Herbrich, S. Bowers, and J. Q. n. Candela. Practical lessons from predicting clicks on ads at facebook. In Proceedings of the Eighth International Workshop on Data Mining for Online Advertising, ADKDD’14, 2014.
 [16] P. Li. Robust Logitboost and adaptive base class (ABC) Logitboost. In Proceedings of the TwentySixth Conference Annual Conference on Uncertainty in Artificial Intelligence (UAI’10), pages 302–311, 2010.
 [17] P. Li, Q. Wu, and C. J. Burges. Mcrank: Learning to rank using multiple classification and gradient boosting. In Advances in Neural Information Processing Systems 20, pages 897–904. 2008.
 [18] X. Meng, J. Bradley, B. Yavuz, E. Sparks, S. Venkataraman, D. Liu, J. Freeman, D. Tsai, M. Amde, S. Owen, D. Xin, R. Xin, M. J. Franklin, R. Zadeh, M. Zaharia, and A. Talwalkar. MLlib: Machine learning in apache spark. Journal of Machine Learning Research, 17(34):1–7, 2016.
 [19] B. Panda, J. S. Herbach, S. Basu, and R. J. Bayardo. Planet: Massively parallel learning of tree ensembles with mapreduce. Proceeding of VLDB Endowment, 2(2):1426–1437, Aug. 2009.
 [20] F. Pedregosa, G. Varoquaux, A. Gramfort, V. Michel, B. Thirion, O. Grisel, M. Blondel, P. Prettenhofer, R. Weiss, V. Dubourg, J. Vanderplas, A. Passos, D. Cournapeau, M. Brucher, M. Perrot, and E. Duchesnay. Scikitlearn: Machine learning in Python. Journal of Machine Learning Research, 12:2825–2830, 2011.
 [21] G. Ridgeway. Generalized Boosted Models: A guide to the gbm package.
 [22] S. Tyree, K. Weinberger, K. Agrawal, and J. Paykin. Parallel boosted regression trees for web search ranking. In Proceedings of the 20th international conference on World wide web, pages 387–396. ACM, 2011.
 [23] J. Ye, J.H. Chow, J. Chen, and Z. Zheng. Stochastic gradient boosted distributed decision trees. In Proceedings of the 18th ACM Conference on Information and Knowledge Management, CIKM ’09.
 [24] Q. Zhang and W. Wang. A fast algorithm for approximate quantiles in high speed data streams. In Proceedings of the 19th International Conference on Scientific and Statistical Database Management, 2007.
 [25] T. Zhang and R. Johnson. Learning nonlinear functions using regularized greedy forest. IEEE Transactions on Pattern Analysis and Machine Intelligence, 36(5), 2014.
Appendix A Weighted Quantile Sketch
In this section, we introduce the weighted quantile sketch algorithm. Approximate answer of quantile queries is for many realworld applications. One classical approach to this problem is GK algorithm [14] and extensions based on the GK framework [24]. The main component of these algorithms is a data structure called quantile summary, that is able to answer quantile queries with relative accuracy of . Two operations are defined for a quantile summary:

A merge operation that combines two summaries with approximation error and together and create a merged summary with approximation error .

A prune operation that reduces the number of elements in the summary to and changes approximation error from to .
A quantile summary with merge and prune operations forms basic building blocks of the distributed and streaming quantile computing algorithms [24].
In order to use quantile computation for approximate tree boosting, we need to find quantiles on weighted data. This more general problem is not supported by any of the existing algorithm. In this section, we describe a nontrivial weighted quantile summary structure to solve this problem. Importantly, the new algorithm contains merge and prune operations with the same guarantee as GK summary. This allows our summary to be plugged into all the frameworks used GK summary as building block and answer quantile queries over weighted data efficiently.
a.1 Formalization and Definitions
Given an input multiset such that . Each corresponds to a position of the point and is the weight of the point. Assume we have a total order defined on . Let us define two rank functions
(10) 
(11) 
We should note that since is defined to be a multiset of the points. It can contain multiple record with exactly same position and weight . We also define another weight function as
(12) 
Finally, we also define the weight of multiset to be the sum of weights of all the points in the set
(13) 
Our task is given a series of input , to estimate and for as well as finding points with specific rank. Given these notations, we define quantile summary of weighted examples as follows:
Definition A.1
Quantile Summary of Weighted Data
A quantile summary for is defined to be tuple , where
is selected from the points in (i.e. ) with the following properties:
1) , and and are minimum and maximum point in :
2) , and are functions in , that satisfies
(14) 
the equality sign holds for maximum and minimum point (
, and for ).
Finally, the function value must also satisfy the following constraints
(15) 
Since these functions are only defined on , it is suffice to use record to store the summary. Specifically, we need to remember each and the corresponding function values of each .
Definition A.2
Extension of Function Domains
Given a quantile summary defined in Definition A.1, the domain of , and were defined only in . We extend the definition of these functions to as follows
When :
(16) 
When :
(17) 
When for some :
(18) 
Lemma A.1
Extended Constraint
The extended definition of , , satisfies the following constraints
(19) 
(20) 
The only nontrivial part is to prove the case when :
This proves Eq. (19). Furthermore, we can verify that
Using these facts and transitivity of relation, we can prove Eq. (20) We should note that the extension is based on the ground case defined in , and we do not require extra space to store the summary in order to use the extended definition. We are now ready to introduce the definition of approximate quantile summary.
Definition A.3
Approximate Quantile Summary
Given a quantile summary , we call it is approximate summary if for any
(21) 
We use this definition since we know that and . Eq. (21) means the we can get estimation of and by error of at most .
Lemma A.2
Property of Extended Function In this section, we have introduced the extension of function to . The key theme discussed in this section is the relation of constraints on the original function and constraints on the extended function. Lemma A.1 and A.2 show that the constraints on the original function can lead to in more general constraints on the extended function. This is a very useful property which will be used in the proofs in later sections.
a.2 Construction of Initial Summary
Given a small multiset , we can construct initial summary , with to the set of all values in (), and defined to be
(24) 
The constructed summary is approximate summary, since it can answer all the queries accurately. The constructed summary can be feed into future operations described in the latter sections.
a.3 Merge Operation
In this section, we define how we can merge the two summaries together. Assume we have and quantile summary of two dataset and . Let , and define the merged summary as follows.
(25) 
The points in are combination of points in and . And the function are defined to be
(26) 
(27) 
(28) 
Here we use functions defined on on the left sides of equalities and use the extended function definitions on the right sides.
Due to additive nature of , and , which can be formally written as
(29) 
and the extended constraint property in Lemma A.1, we can verify that satisfies all the constraints in Definition A.1. Therefore it is a valid quantile summary.
Lemma A.3
The combined quantile summary satisfies
(30) 
(31) 
(32) 
for all
This can be obtained by straightforward application of Definition A.2.
Theorem A.1
If is approximate summary, and is approximate summary. Then the merged summary is approximate summary.
a.4 Prune Operation
Before we start discussing the prune operation, we first introduce a query function . The definition of function is shown in Algorithm 4. For a given rank , the function returns a whose rank is close to . This property is formally described in the following Lemma.
Lemma A.4
For a given approximate summary , satisfies the following property
(33) 
We need to discuss four possible cases

and . Note that the rank information for is accurate (,