## PLANET: Massively Parallel Learning of Tree Ensembles with ...

tions, and implements each one using the MapReduce model of distributed ... MapReduce is a simple model for distributed computing that abstracts away many ...

PLANET: Massively Parallel Learning of Tree Ensembles with MapReduce Biswanath Panda, Joshua S. Herbach, Sugato Basu, Roberto J. Bayardo Google, Inc.

ABSTRACT Classification and regression tree learning on massive datasets is a common data mining task at Google, yet many state of the art tree learning algorithms require training data to reside in memory on a single machine. While more scalable implementations of tree learning have been proposed, they typically require specialized parallel computing architectures. In contrast, the majority of Google’s computing infrastructure is based on commodity hardware. In this paper, we describe PLANET: a scalable distributed framework for learning tree models over large datasets. PLANET defines tree learning as a series of distributed computations, and implements each one using the MapReduce model of distributed computation. We show how this framework supports scalable construction of classification and regression trees, as well as ensembles of such models. We discuss the benefits and challenges of using a MapReduce compute cluster for tree learning, and demonstrate the scalability of this approach by applying it to a real world learning task from the domain of computational advertising.

1. INTRODUCTION In this paper, we look at leveraging the MapReduce distributed computing framework for a complex data mining task of wide interest: learning ensembles of classification or regression trees. While there are other methods for parallel and distributed tree learning, building production-ready implementations remains complex and error-prone. With the wide and growing availability of MapReduce-capable compute infrastructures, it is natural to ask whether such infrastructures may be of use in parallelizing common data mining tasks such as tree learning. For many data mining operations, MapReduce may offer better scalability with vastly simplified deployment in a production setting. MapReduce is a simple model for distributed computing that abstracts away many of the difficulties in parallelizing data management operations across a cluster of commodity machines. MapReduce reduces, if not eliminates, many com-

Permission to copy without fee all or part of this material is granted provided that the copies are not made or distributed for direct commercial advantage, the VLDB copyright notice and the title of the publication and its date appear, and notice is given that copying is by permission of the Very Large Data Base Endowment. To copy otherwise, or to republish, to post on servers or to redistribute to lists, requires a fee and/or special permission from the publisher, ACM. VLDB ‘09, August 24-28, 2009, Lyon, France Copyright 2009 VLDB Endowment, ACM 000-0-00000-000-0/00/00.

http://aws.amazon.com/ec2/ http://www.cloudera.com/ 3 For example, see http://www.youtube.com/watch?v=UBrDPRlplyo and http://www.nsf.gov/news/news summ.jsp?cntn id=111470 2

including the formal problem definitions of classification and regression. We also review the process of solving these problems through tree induction, and describe the MapReduce paradigm for distributed computation. As a prelude to a more detailed description of our approach, in Section 3 we provide an example of how tree induction proceeds in PLANET. This example describes the roles of each of the major components as well as their high level requirements. Section 4 provides a more formal algorithm description for the case of learning a single classification or regression tree, and Section 5 describes how PLANET can be generalized to produce ensembles of trees via boosting and/or bagging. In Section 6 we discuss several important details we had to address in our efforts to develop an efficient and production-ready deployment. We describe the performance of PLANET on our sponsored search derived clickstream dataset in Section 7. We review related work in Section 8 and conclude with a discussion of future work in Section 9.

2. PRELIMINARIES Let X = {X1 , X2 , . . . XN } be a set of attributes with domains DX1 , DX2 , . . . DXN respectively. Let Y be an output with domain DY . Consider a dataset D∗ = {(xi , yi )|xi ∈ DX1 × DX2 × . . . DXN , yi ∈ DY } sampled from an unknown distribution, where the ith data vector xi has an output yi associated with it. Given the dataset D∗ , the goal in supervised learning is to learn a function (or model ) F : DX1 × DX2 × . . . DXN → DY that best approximates the true distribution of D∗ . If DY is continuous, the learning problem is a regression problem; if DY is categorical, it is a classification problem. Let L be a function that quantifies in some way the discrepancy between the function prediction F (xi ) on xi and the net loss P actual output yi . A model that minimizes the ∗ may not (xi ,yi )∈D ∗ L(F (xi ), yi ) on the training set D generalize well (have low loss) when applied to future data . Generalization is attained through controlling model complexity by various methods, e.g., pruning and ensemble learning for tree models . The learned model is evaluated by measuring its net loss when applied to a holdout data set.

2.1 Tree Models Classification and regression trees are one of the oldest and most popular data mining models . Tree models represent F by recursively partitioning the data space DX1 × DX2 × . . . DXN into non-overlapping regions, with a simple model in each region. Figure 1 shows an example tree model. Non-leaf nodes in the tree define region boundaries in the data space. Each region boundary is represented as a predicate on an attribute in X . If the attribute is ordered, the predicate is of the form X < v, v ∈ DX (e.g., Node A in Figure 1). Unordered attributes have predicates of the form X ∈ {v1 , v2 , . . . vk }, v1 ∈ DX , v2 ∈ DX , . . . vk ∈ DX , (e.g., Node B in Figure 1). The path from the root to a leaf node in the tree defines a region. Leaf nodes (e.g., the left child of A in Figure 1), contain a region prediction which in most cases is a constant value or some simple function. To make predictions on an unknown x, the tree is traversed to find the region containing x. The region containing x is the path from the root to a leaf in the tree along which all non-leaf predicates are true when evaluated on x. The prediction given by this leaf is used as the value for F (x).

Algorithm 1 InMemoryBuildNode Require: Node n, Data D ⊆ D∗ 1: (n →split,DL ,DR )=FindBestSplit(D) 2: if StoppingCriteria(DL ) then 3: n →left prediction=FindPrediction(DL ) 4: else 5: InMemoryBuildNode(n →left,DL ) 6: if StoppingCriteria(DR ) then 7: n →right prediction=FindPrediction(DR ) 8: else 9: InMemoryBuildNode(n →right,DR )

In our example tree model, predicate evaluations at nonleaf nodes have only two outcomes, leading to binary splits. While tree models can have non-binary splits, for the sake of simplicity we will focus on binary splits only for the remainder of this paper. All our techniques also apply to tree algorithms with non-binary splits with straightforward modifications. Tree models are popular because they are interpretable, capable of modeling complex classification and regression tasks, and handle both ordered and categorical domains. Recent work by Caruana et al.  has also shown that tree models, when combined with ensemble learning methods like bagging , boosting , and forests , outperform many other popular learning methods in terms of prediction accuracy. A thorough discussion of tree models and different ensemble methods is beyond the scope of this paper — see  for a good review.

2.2

Learning Tree Models

Previous work on learning tree models is extensive. For a given training dataset D∗ , finding the optimal tree is known to be NP-Hard; thus most algorithms use a greedy top-down approach to construct the tree (Algorithm 1) . At the root of the tree, the entire training dataset D∗ is examined to find the best split predicate for the root. The dataset is then partitioned along the split predicate and the process is repeated recursively on the partitions to build the child nodes. Finding the best split predicate for a node (Line 1) is the most important step in the greedy learning algorithm, and has been the subject of much of the research in tree learning. Numerous techniques have been proposed for finding the right split at a node, depending on the particular learning problem. The main idea is to reduce the impurity (I) in a node. Loosely defined, the impurity at a node is a measure of the dissimilarity in the Y values of the training records D that are input to the node. The general strategy is to pick a predicate that maximizes I(D) − (I(DL ) + I(DR )), where DL and DR are the datasets obtained after partitioning D on the chosen predicate. At each step the algorithm greedily partitions the data space to progressively reduce region impurity. The process continues until all Y values in the input dataset D to a node are the same, at which point the algorithm has isolated a pure region (Lines 2-3 and 6-7). Some algorithms do not continue splitting until regions are completely pure, and instead stop once the number of records in D falls below a predefined threshold. Popular impurity measures that have been proposed are derived from measures such as entropy, Gini index, and variance , to name only a few. PLANET uses an impurity

is sorted along Xi , and a split point is considered between each adjacent pair of values for Xi in the sorted list.

measure based on variance (V ar) to evaluate the quality of a split. The higher the variance in the Y values of a node, the greater the node’s impurity. Further details on the split criteria are discussed in Section 2.3. While we focus concretely on variance as our split criteria for the remainder of this presentation, as long as a split metric can be computed on subsets of the training data and later aggregated, PLANET can be easily extended to support it.

2.2.1

• For unordered domains, split predicates are of the form Xi ∈ {v1 , v2 , . . . vk }, where {v1 , v2 , . . . vk } ∈ P(DXi ), the power set of DXi . Breiman  presents an algorithm for finding the best split predicate for a categorical attribute without evaluating all possible subsets of DXi . The algorithm is based on the observation that the optimal split predicate is a subsequence in the list of values for Xi sorted by the average Y value.

Scalability Challenge

The greedy tree induction algorithm we have described is simple and works well in practice. However, it does not scale well to large training datasets. FindBestSplit requires a full scan of the node’s input data, which can be large at higher levels of the tree. Large inputs that do not fit in main memory become a bottleneck because of the cost of scanning data from secondary storage. Even at lower levels of the tree where a node’s input dataset D is typically much smaller than D∗ , loading D into memory still requires reading and writing partitions of D∗ to secondary storage multiple times. Previous work has looked at problem of building tree models from datasets which are too large to fit completely in main memory. Some of the known algorithms are disk-based approaches that use clever techniques to optimize the number of reads and writes to secondary storage during tree construction (e.g., ). Other algorithms scan the training data in parallel using specialized parallel architectures (e.g., ). We defer a detailed discussion of these approaches and how they compare to PLANET to Section 8. As we will show in Section 8, some of the ideas used in PLANET have been proposed in the past; however, we are not aware of any efforts to build massively parallel tree models on commodity hardware using the MapReduce framework. Post-pruning learned trees to prevent overfitting is also a well studied problem. However, with ensemble models (Section 5), post pruning is not always needed. Since PLANET is primarily used for building ensemble models, we do not discuss post pruning in this paper.

PLANET uses MapReduce  to distribute and scale tree induction to very large datasets. MapReduce provides a framework for performing a two-phase distributed computation on large datasets, which in our case is the training dataset D∗ . In the Map phase, the system partitions D∗ into a set of disjoint units which are assigned to workers, known as mappers. In parallel, each mapper scans through its assigned data and applies a user-specified map function to each record. The output of the user’s map function is a set of hkey, valuei pairs which are collected for MapReduce’s Reduce phase. In the reduce phase, the key-value pairs are grouped by key and are distributed to a series of workers, called reducers. Each reducer then applies a user-specified reduce function to all the values for a key and outputs a final value for the key. The collection of final values from all of the reducers is the final output of MapReduce.

2.3 Regression Trees

3.

Regression trees are a special case of tree models where the output attribute Y is continuous . We focus primarily on regression trees within this presentation because most of our use cases require predictions on continuous outputs. Note that any regression tree learner also supports binary (0-1) classification tasks by modeling them as instances of logistic regression. The core operations of regression tree learning in Algorithm 1 are implemented as follows:

The PLANET framework breaks up the process of constructing a tree model into a set of MapReduce tasks. Dependencies exist between the different tasks, and PLANET uses clever scheduling methods to efficiently execute and manage them. Before delving into the technical details of the framework, we begin with a detailed example of how tree induction proceeds in PLANET. The example introduces the different components in PLANET, describes their roles, and provides a high level overview of the entire system. To keep the example simple we only discuss the construction of a single tree. The method extends naturally to ensembles of trees, as we discuss in Section 5.

FindBestSplit(D): In a regression tree, D is split using the predicate that results in the largest reduction in variance. Let V ar(D) be the variance of the output attribute Y measured over all records in D. At each step the tree learning algorithm picks a split which maximizes |D| × V ar(D) − (|DL | × V ar(DL ) + |DR | × V ar(DR )), (1) where DL ⊂ D and DR ⊂ D are the training records in the left and right subtree after splitting D by a predicate. Regression trees use the following policy to determine the set of predicates whose split quality will be evaluated: • For ordered domains, split predicates are of the form Xi < v, for some v ∈ DXi . To find the best split, D

StoppingCriteria(D): A node in the tree is not expanded if the number of records in D falls below a threshold. Alternatively, the user can also specify the maximum depth to which a tree should be built. FindPrediction(D): The prediction at a leaf is simply the average of the all the Y values in D.

2.4

MapReduce

EXAMPLE

Example setup: Let us assume that we have a training dataset D∗ with 100 records. Further assume that tree induction stops once the number of training records at a node falls below 10. Let the tree in Figure 1 be the model that will be learned if we ran Algorithm 1 on a machine with sufficient memory. Our goal in this example is to demonstrate how PLANET constructs the tree in Figure 1 when there is a memory constraint limiting Algorithm 1 to operating on inputs of size 25 records or less.

• Nodes in InMemQ are processed using MR InMemory. Recall that nodes in InMemQ have input data sets D that are small enough to fit in memory. Therefore, given a set of nodes N , MR InMemory completes tree induction at nodes in N using Algorithm 1.

X1 < v 1

A

|D|=90

|D|=10

B

0.42266

X2 ∈ {v2 , v3 }

D

C |D|=20 E

We defer details of the MapReduce jobs to the next section. In the remainder of this section, we will tie the above components together and walk through the example.

|D|=45

|D|=45

|D|=25 |D|=15 F

G

3.2 |D|=30 H

Figure 1: Example Tree. Note that the labels on the nodes (in boxes) are the split predicates, while the labels on the edges are the sizes of the dataset in each branch (|D| denotes the dataset size in that branch in this figure).

3.1 Components At the heart of PLANET is the Controller, a single machine that initiates, schedules and controls the entire tree induction process. The Controller has access to a compute cluster on which it schedules MapReduce jobs. In order to control and coordinate tree construction, the Controller maintains the following: • ModelFile (M): The Controller constructs a tree using a set of MapReduce jobs, each of which builds different parts of the tree. At any point, the model file contains the entire tree constructed so far. Given the ModelFile (M), the Controller determines the nodes at which split predicates can be computed. In the example of Figure 1, if M has nodes A and B, then the Controller can compute splits for C and D. This information is stored in two queues. • MapReduceQueue (MRQ): This queue contains nodes for which D is too large to fit in memory (i.e. > 25 in our example). • InMemoryQueue (InMemQ): This queue contains nodes for which D fits in memory (i.e ≤ 25 in our example). As tree induction proceeds, the Controller dequeues nodes off MRQ and InMemQ and schedules MapReduce jobs to find split predicates at the nodes. Once a MapReduce job completes, the Controller updates M with the nodes and their split predicates, and then updates MRQ and InMemQ with new nodes at which split predicates can be computed. Each MapReduce job takes as input a set of nodes (N ), the training data set (D∗ ), and the current state of the model (M). The Controller schedules two types of MapReduce jobs. • Nodes in MRQ are processed using MR ExpandNodes, which for a given set of nodes N computes a candidate set of good split predicates for each node in N .

Walkthrough

When tree induction begins, M, MRQ, and InMemQ are all empty. The only node the Controller can expand is the root (A). Finding the split for A requires a scan of the entire training dataset of 100 (≥ 25) records. Since this set is too large to fit in memory, A is pushed onto MRQ and InMemQ stays empty. After initialization the Controller dequeues A from MRQ and schedules a job MR ExpandNodes({A}, M, D∗ ). This job computes a set of good splits for node A along with some additional information about each split. Specifically, for each split we compute (1) the quality of the split (i.e., the reduction in impurity), (2) the predictions in the left and right branches, and (3) the number of training records in the left and right branches. The split information computed by MR ExpandNodes gets sent back to the Controller, which selects the best split for node A. In this example, the best split has 10 records in the left branch and 90 records in the right. The selected split information for node A is then added into the ModelFile. The Controller next updates the queues with new nodes at which split predicates can be computed. The left branch of A has 10 records. This matches the stopping criteria and hence no new nodes are added for this branch. For the right branch with 90 records (≥ 25), node B can be expanded and is pushed onto MRQ. Tree induction continues by dequeuing node B, and scheduling MR ExpandNodes({B}, M, D∗ ). Note that for expanding node B we only need the records that went down the right subtree of A, but to minimize book keeping, PLANET passes the entire training dataset to the MapReduce. As we describe in 4.3, MR ExpandNodes uses the current state of the ModelFile to determine the subset of D∗ that will be input to B. Once the Controller has received the results for the MapReduce on node B and updated M with the split for B, it can now expand both C and D. Both of these nodes get 45 records as input and are therefore pushed on to MRQ. The Controller can now schedule a single MR ExpandNodes({C, D}, M, D∗ ) job to find the best splits for both nodes C and D. Note that by expanding C and D in a single step, PLANET expands trees breadth first as opposed to the depth first process used by the in-memory Algorithm 1. Once the Controller has the obtained the splits for C and D, it can schedule jobs to expand nodes E, F, G, and H. Of these, H uses 30 records, which still cannot fit in memory, and hence gets added to MRQ. The input sets to E, F, G are small enough to fit into memory and hence tree induction at these nodes can be completed in-memory. The Controller pushes these nodes into the InMemQueue. The Controller next schedules two MapReduce jobs simultaneously. MR InMemory({E,F,G}, M, D∗ ) completes tree induction at nodes E, F, and G since the input datasets to these nodes are small. MR ExpandNodes({H}, M, D∗ )

Algorithm 2 MR ExpandNodes::Map Require: NodeSet N , ModelFile M, Training record (x, y) ∈ D∗ 1: n = TraverseTree(M, x) 2: if n ∈ N then 3: agg tupn ← y 4: for all X ∈ X do 5: v = Value on X in x 6: if X is ordered then 7: for all Split point s of X s.t. s < v do 8: Tn,X [s] ← y 9: else 10: Tn,X [v] ← y Algorithm 3 MR ExpandNodes::Map Finalize Require: NodeSet N 1: for all n ∈ N do 2: Output to all reducers(agg tupn ) 3: for all X ∈ X do 4: if X is ordered then 5: for all Split point s of X do 6: Output((n, X, s), Tn,X [s]) 7: else 8: for all v ∈ Tn,X do 9: Output((n, X), (v, Tn,X [v]))

computes good splits for H. Once the InMemory job returns, tree induction for the subtrees rooted at E, F, and G is complete. The Controller updates MRQ and InMemQ with the children of node H and continues tree induction. PLANET aggressively tries to maximize the number of nodes at which split predicates can be computed in parallel, and schedules multiple MapReduce jobs simultaneously.

4. TECHNICAL DETAILS In this section, we discuss the technical details of PLANET’s major components — the two critical MapReduces that handle splitting nodes and growing subtrees, and the Controller that manages the entire tree induction process.

4.1 MR ExpandNodes: Expanding a Single Node MR ExpandNodes is the component that allows PLANET to train on datasets too large to fit in memory. Given a set of nodes (N ), the training dataset (D∗ ), and the current model (M ), this MapReduce job computes a set of good splits for each node in N . Map Phase: The training dataset D∗ is partitioned across a set of mappers. Each mapper loads into memory the current model (M) and the input nodes N . Note that the union of the input datasets to all nodes in N need not be equal to D∗ . However, every MapReduce job scans the entire training data set applying a Map function to every training record. We will discuss this design decision in Section 4.3. Pseudocode describing the algorithms that are executed by each mapper appear in Algorithms 2 and 3. Given a training record (x, y), a mapper first determines if the record is part of the input dataset for any node in N by traversing the current model M with (x, y) (Line 1, Alg. 2). Once the input set to a node is determined, the next step is to evaluate

possible splits for the node, and select the best one. Recall from Section 2.3 the method for finding the best split for a node n. For an ordered attribute X, Equation 1 is computed between every adjacent pair of values for the attribute that appear in the node’s input dataset D. Performing this operation in a distributed setting would require us to sort D∗ along each ordered attribute and write out the results to secondary storage. These sorted records would then have to be partitioned carefully across mappers, keeping track of the range of values on each mapper. Distributed algorithms implementing such approaches are complex and end up using additional storage or network resources. PLANET makes a tradeoff between finding the perfect split for an ordered attribute and simple data partitioning. Splits are not evaluated between every pair of values of an attribute. Rather, prior to tree induction we run a MapReduce on D∗ and compute approximate equidepth histograms for every ordered attribute . When computing splits on an ordered attribute, a single split point is considered from every histogram bucket of the attribute. On startup, each mapper loads the set of split points to be considered for each ordered attribute. For each node n ∈ N and attribute X, the mapper maintains a table Tn,X of keyvalue pairs. Keys for the table are the split points to be considered P for P X and P the values are tuples (agg tup) of the form { y, y 2 , 1}. For a particular split point s ∈ DX being considered for node n, the tuple Tn,X [s] contains: (1) the sum of Y values for training records (x, y) that are input to n and have values for X that are less than s, (2) the sum of squares of these values, and (3) the number of training records that are input to n and have values of X less than s. Mappers scan subsets of D∗ and compute agg tups for all split points being considered for each node in N (Lines 7, 8 in Alg. 2). After processing all its input records, each mapper outputs keys of the form n, X, s and the corresponding Tn,X [s] as values (Line 6, Alg. 3). As we show later, a reduce function will aggregate the agg tups with the same key to compute the quality of the split X < s for node n. For computing splits on an unordered attribute X, Section 2.3 proposed computing Equation 1 for every subsequence of unique values of X sorted by the average Y . Each mapper performs this computation by maintaining a table Tn,X of key, agg tup pairs as described before. However, in this case keys correspond to unique values of X seen in the input records to node n. Tn,X [v] maintains the same aggregate statistics as described earlier for all training records that are input to n and have an X value of v (Line 10, Alg. 2). After processing all input data, the mappers output keys of the form n, X and value hv, Tn,X [v]i (Line 9, Alg. 3). Note the difference in key-value pairs output for ordered and unordered attributes. Quality of a split on an ordered attribute can be computed independently of other splits on that attribute, hence the split point s is part of the key. To run Breiman’s algorithm, all values of an unordered attribute need to be sorted by average Y value. Hence, the value v of an attribute is not part of the key. A single reducer processes and sorts all the values of the attribute to compute the best split on the attribute. In addition to the above outputs, each mapper also maintains agg tupn for each node n ∈ N (Line 3, Alg. 2) and outputs them to all reducers (Line 2, Alg. 3). These tuples are computed over all input records to their respective nodes, and help reducers in computing split qualities.

Algorithm 4 MR ExpandNodes::Reduce Require: Key k,Value Set V 1: if k == n then 2: {Aggregate agg tupn ’s from mappers} 3: agg tupn = Aggregate(V ) 4: else if k == n, X, s then 5: {Split on ordered attribute} 6: agg tuplef t = Aggregate(V ) 7: agg tupright = agg tupn - agg tuplef t 8: UpdateBestSplit(S [n],X,s,agg tuplef t , agg tupright ) 9: else if k == n, X then 10: {Split on unordered attribute} 11: for all v,agg tup ∈ V do 12: T [v] ← agg tup 13: UpdateBestSplit(S [n],BreimanSplit(X,T ,agg tupn ))

Reduce Phase: The reduce phase, which works on the outputs from the mappers, performs aggregations and computes the quality of each split being considered for nodes in N . Each reducer maintains a table S indexed by nodes. S[n] contains the best split seen by the reducer for node n. The pseudocode executed on each reducer is outlined in Algorithm 4. A reducer processes three types of keys. The first is of the form n with a value list V of the all agg tupn tuaggregated ples output by the mappers. These agg P tups P areP to get a single agg tupn with the { y, y 2 , 1} values for all input records to node n (Line 3, Alg. 4). Reducers process keys in sorted order so that they process all keys of type n first. The other types of keys that a reducer processes belong to ordered and unordered attributes. The keys corresponding to unordered attributes are of the form n, X. Here the set V associated with each key is a set of pairs consisting of an unordered attribute value v and an P agg Ptup.PFor each v the agg tups are aggregated to get { y, y 2 , 1} over all input records to n where the value of X is v. Once aggregated, Breiman’s algorithm is used to find the optimal split for X, and S [n] is updated if the resulting split is better than any previous split for n (Lines 11-13, Alg 4). For ordered attributes, keys are of the form n, X, s and V is again a listP of agg P tups. P Aggregating these into agg tuplef t gives the { y, y 2 , 1} values for all records input to n that fall in the left branch of X < s (Line 6, Alg. 4). Using agg tupn and agg tuplef t it is straightforward to compute the V ar based quality of the split X < s. If this split X < s is better than the best split seen by the reducer for n so far, then S [n] is updated to the current split (Lines 7-8, Alg. 4). Finally, each reducer outputs the best split S [n] that it has seen for each node. In addition to the split quality and predicate, it also outputs the average Y value, and number of the training records in the left and right branches of the split. The Controller takes the splits produced by all the reducers and finds the best split for each node in N , then updates the ModelFile M with this information. The Controller updates the queues with the child nodes that should be expanded using information about the number of training records in each branch.

4.2 MR InMemory: In Memory Tree Induction As tree induction progresses, the size of the input dataset for many nodes becomes small enough to fit in memory.

Algorithm 5 UpdateQueues Require: DataSetSize |D|, Node n 1: if not StoppingCriteria(|D|) then 2: if |D| < in memory threshold then 3: InMemQ.append(n) 4: else 5: MRQ.append(n) Algorithm 6 Schedule MR ExpandNode Require: NodeSet N ,Current Model M 1: CandidateGoodSplits = MR ExpandNodes(N ,M,D∗ ) 2: for all n ∈ N do 3: n →split,n →l pred, n →r pred,|DL |,|DR | = FindBestSplit(n, CandidateGoodSplits) 4: UpdateQueues(|DL |,n →left) 5: UpdateQueues(|DR |,n →right) 6: jobs running - -

At any such point, rather than continuing tree induction using MR ExpandNodes, the Controller completes tree induction in-memory using a different MapReduce job called MR InMemory. Like MR ExpandNodes, MR InMemory partitions D∗ across a set of mappers. The map function processes a training record (x, y) and traverses the tree in M, to see if the (x, y) is input to some node n ∈ N . If such a node is found then the map function outputs the node n as the key and (x, y) as the value. The reduce function receives as input a node n (as key) and the set of training records that are input to the node (as values). The reducer loads the training records for n into memory and completes subtree construction at n using Algorithm 1.

4.3

Controller Design

The example in Section 3 provides the intuition behind functionality of the Controller. Here we provide a more detailed look at its roles and implementation. The main Controller thread (Algorithm 8) schedules jobs off of its queues until the queues are empty and none of the jobs it schedules remain running. Scheduled MapReduce jobs are launched in separate threads so that the Controller can send out multiple jobs in parallel. When a MR ExpandNodes job returns, the queues are updated with the new nodes that can now be expanded (Algorithm 6). Note that when MR InMemory finishes running on a set of nodes N (Algorithm 7), no updates are made to the queues because tree induction at nodes in N is complete. While the overall architecture of the Controller is fairly straightforward, we would like to highlight a few important design decisions. First, in our example in Section 3, recall that the Controller always removed all existing nodes from MRQ and InMemQ and scheduled MapReduce jobs. Therefore, it may seem that the Controller need not maintain queues and can schedule subsequent MapReduce jobs directly after processing the output of a MapReduce job. Algorithm 7 Schedule MR InMemory Require: NodeSet N ,Current Model M 1: MR InMemory(N ,M,D) 2: jobs running - -

Algorithm 8 MainControllerThread Require: Model M = ∅, MRQ=∅, InMemQ=∅ 1: MRQ.append(root) 2: while true do 3: while MRQ not empty do 4: if TryReserveClusterResources then 5: jobs running ++ 6: NewThread(ScheduleMR ExpandNode(⊆MRQ,M)) 7: while InMemQ not empty do 8: if TryReserveClusterResources then 9: jobs running ++ 10: NewThread(ScheduleMR InMemory(⊆InMemQ,M)) 11: if jobs running==0 && MRQ empty && InMemQ empty then 12: Exit

However, in practice this is not always possible. The memory limitations on a machine and the number of available machines on the cluster often prevent the Controller from scheduling MapReduce jobs for all nodes on a queue at once. Second, when scheduling a set of nodes, recall that the Controller does not determine the set of input records required by the nodes. Instead, it simply sends the entire training dataset D∗ to every job. If the input to the set of nodes being expanded by a node is much smaller than D∗ , then this implementation results in the Controller sending much unnecessary input for processing. On the other hand, this design keeps the overall system simple. In order to avoiding sending unnecessary input, the Controller would need to write out the input training records for each node to storage. This in turn would require additional bookkeeping for the Controller when operating normally, and would further complicate important systems like the checkpointing mechanism (Section 6.3) and ensemble creation (Section 5). The amount of unnecessary information sent by our implementation is also mitigated by breadth-first tree construction. If we can expand all nodes at level i + 1 in one MapReduce job, then every training record is part of the input to some node that is being expanded. Finally, MapReduce frameworks are already optimized for scanning data efficiently in a distributed fashion – the additional cost of reading in a larger dataset can be mitigated by adding more mappers, if necessary.

5. LEARNING ENSEMBLES Until now we have described how the PLANET framework builds a single tree. Ensemble-based tree models have better predictive power when compared to single tree models [8, 9]. Bagging  and boosting  are the two most popular tree ensemble learning methods. In this section we show how PLANET supports the construction of tree ensembles through these two techniques. Boosting is an ensemble learning technique that uses a weighted combination of weak learners to form a highly accurate predictive model . Our current boosting implementation uses the GEM algorithm proposed by Friedman . In the GEM algorithm, every weak learner is a shallow tree (depth ≈ 2 or 3). Model construction proceeds as follows: assume k − 1 weak learners (shallow trees) have been added to the model. Let Fk−1 be the boosted model of those trees. Tree k is trained on a sample of D∗ and residual

predictions (z). For a given training record (x, y), the residual prediction for tree k is z = y − Fk−1 (x) for a regression 1 problem, and z = y − 1+exp(−F for a classification k−1 (x)) problem. The boosting process is initialized by setting F0 as some aggregate defined over the Y values in the training dataset. Abstracting out the details, we need three main features in our framework to build boosted models. • Building multiple trees: Extending the Controller to build multiple trees is straightforward. Since the Controller manages tree induction by reducing the process to repeated node expansion, the only change necessary for constructing a boosted model is to push the root node for tree k onto the MR after tree k − 1 is completed. • Residual computation: Training trees on residuals is simple since the current model is sent to every Map Reduce job in full. If the mapper decides to use a training record as input to a node, it can compute the current model’s prediction, and hence the residual. • Sampling: Each tree is built on a sample of D∗ . Dappers compute a hash of a training record’s id and the tree id. Records hashing into a particular range are used for constructing the tree. This hash-based sampling guarantees that the same sample will be used for all nodes in a tree, but different samples of D∗ will be used for different trees. Building an ensemble model using bagging involves learning multiple trees over independent samples of the training data. Predictions from each tree in the model are computed and averaged to compute the final model prediction. PLANET supports bagging as follows: when tree induction begins at the root, nodes of all trees in the bagged model are pushed onto the MRQ. The Controller then continues tree induction over dataset samples as already described. In this scenario, at any point in time the queues will contain nodes belonging to many different trees instead of a single tree, thereby allowing the Controller to exploit greater parallelism. The bagging algorithm proposed by Breiman expects each tree to be built on a sample of D∗ generated with replacement; however, our framework only supports sampling without replacement at this time. We are still exploring efficient techniques to do sampling with replacement in a distributed setting, and comparing how bagged models generated by sampling with and without replacement differ in practice.

6.

ENGINEERING ISSUES

In developing a production-capable deployment of PLANET, we encountered several unanticipated challenges. First, because MapReduce was not intended to be used for highly iterative procedures like tree learning, we found that MapReduce start up and tear down costs were primary performance bottlenecks. Second, the cost of traversing models in order to determine split points in parallel turned out to be higher than we expected. Finally, even though MapReduce offers graceful handling of failures within a specific MapReduce computation, since our computation spans multiple MapReduce phases, dealing with shared and unreliable commodity resources remained an issue which we had to address. We discuss our solutions to each of these issues within this section.

Setup−1 Run−MR−1 Setup−2 Run−MR−2

Setup−1 Run−MR−1 Setup−2

Run−MR−2

Time Figure 2: Forward Scheduling

our MapReduce jobs was the cost of traversing the model: an operation performed on every mapper to determine if the training record being processed is part of the input to any node being expanded in the job. After careful examination and profiling, we found that predicate evaluations at nodes that split on unordered attributes were a bottleneck because a single predicate evaluation required multiple string comparisons, and some of our attributes were long strings, e.g., URLs. To get around this, for a predicate of the form X ∈ {v1 , v2 , . . . vk }, we fingerprint the vi ’s and store a hash set at the node. This simple optimization provided about 40% improvement in tree traversal costs.

6.2 Fingerprinting Another significant source of latency that we observed in

Reliability

Deploying PLANET on a cluster of commodity machines presents a number of challenges not normally posed when running an application on a single machine. Because our clusters are shared resources, job failures due to preemption by other users is not uncommon. Similarly, job failures because of hardware issues occur occasionally. Because of the frequency of job failures, we require PLANET to have a mechanism for recovering from failures. Fortunately, the MapReduce framework provides us guarantees in terms of job completion. Therefore, we can reason about the system by considering the expansion of a set of nodes as an atomic operation and when a single MapReduce fails the Controller will simply restart the MapReduce again. To handle the failure of the Controller, we annotate the model file with metadata marking the completion of each splitting task. Then, when the Controller fails, we start a new Controller that reads in the annotated model file generated during the failed run. Given the annotated model file, it is simple for the Controller to reconstruct the state of MRQ and InMemQ prior to any jobs which were running when the Controller failed. With MRQ, InMemQ and M, the Controller can then continue with tree induction. Monitoring turned out to be another issue in deploying PLANET. As developers and users of the system, we often needed to be able to monitor the progress of model construction in real time. To support such monitoring, we added a dashboard to PLANET to track its currently running tasks as well as the pending tasks in MRQ and InMemQ. The dashboard collects training and validation error statistics and renders a plot of the error of the model as it grows (and offers a precision-recall curve when training a model for classification).

7.

EXPERIMENTS

In this section we demonstrate the performance of PLANET on a real world learning task in computational advertising. In particular, we study the scalability of the system and the benefits obtained from the different extensions and optimizations proposed in the paper.

7.1

Setup

We measure the performance of PLANET on the bounce rate prediction problem [22, 23]. A click on an sponsored search advertisement is called a bounce if the click is immediately followed by the user returning to the search engine. Ads with high bounce rates are indicative of poor user experience and provide a strong signal of advertisement quality. The training dataset (AdCorpus) for predicting bounce rates is derived from all clicks on search ads from the Google

Figure 3: Running time vs data size for various numbers of machines.

Figure 4: Running time vs tree depth. Note: the Sampled R curve was trained on 1/30 of the data used for the other curves. between 1 and 10. Peak RAM utilization was 6GB (average was close to 5GB). The runtime for producing the different trees varied between 315 and 358 seconds (Figure 4).

7.2

Results

Scalability: Our first experiment measures the scalability of the PLANET framework. For this experiment, we randomly split the AdCorpus into 5 roughly equal-sized groups and trained a single depth-3 classification tree, first on a single group, then two groups and so on up to five groups. For each of these increasingly larger training datasets, we examined the effects of using between 50 and 600 machines. In this experiment, the Controller never scheduled more than 2 MapReduce jobs at a time, and was configured to schedule MR ExpandNodes jobs only. In other words, we disabled the optimization to construct trees entirely in memory and limited forward scheduling to 1 MapReduce in order to evaluate the performance of the algorithm in a constrained (e.g. shared cluster) environment. Figure 3 shows the results of this experiment. As expected, training time increases in proportion to the amount of training data. Similarly, adding more machines significantly decreases training time (ignoring the 400 machine curve for the moment). The most interesting observation in Figure 3 is the notion of marginal returns. When the dataset is large, adding more machine reduces costs proportionally, up to a point. For example, in our experiment, increasing the number of machines from 200 to 400 per MapReduce did not improve training time. Similarly, as the training set size decreases, the benefits of adding more machines also diminishes. In both these cases, after a certain point the overhead of adding new machines (networking overhead to watch the worker for failure, to schedule backup workers, to distribute data to the worker, and to collect results from the

worker) dominate the benefits from each machine processing a smaller chunk of data. Empirically, it appears that for our dataset the optimal number of workers is under 400. Benefits of MR InMemory: Our next experiment highlights the benefits from in memory tree completion. Here, the Controller was configured to invoke MR InMemory for nodes whose inputs contained 10M or fewer records. The reducers in MR InMemory used the GBM package for tree construction and were configured with 8GB RAM in order to meet the memory requirements of the package. PLANET was used to train a single classification tree of varying depths on the entire AdCorpus. Figure 4 shows the results. PLANET-NoInMem plots the training time when MR InMemory is not used by the Controller. In this case training time keeps increasing with tree depth as the number of MR ExpandNodes jobs keeps increasing. Note that even though we expand trees breadth first, the increase in training time is not linear in the depth. This happens because each MR ExpandNodes job is configured (based on memory constraints in the mappers) to expand four nodes only. At lower levels of the tree a single MapReduce can no longer expand all nodes in a level, and hence we see a superlinear increase in training time. On the other hand, PLANET using a mix of MR ExpandNodes and MR InMemory scales well and training time does not increase as significantly with tree depth. As a reference point for the PLANET running times, we also provide the running time of Sampled-R in Figure 4, which shows the running time of the GBM in-memory algorithm on a 2GB sample of AdCorpus.

Figure 5: Error reduction as the number of trees increases. Effect of Ensembles: The last experiment we report shows how error rates decrease in the bounce rate problem. Figure 5 shows the reduction in training and validation errors

on a 90-10 split of the AdCorpus. The figure plots the reduction in variance as more trees are added to a boosted tree model. Two scenarios are shown – one in which the weak learners are depth one trees, and the other where the trees have depth three. For the depth-3 tree ensemble, the reduction in error is initially higher than with the depth-1 tree ensemble as expected; but, the reduction asymptotes after about 100 trees for this dataset. The PLANET dashboard updates and displays such error graphs in real time. This enables users to manually intervene and stop model training when the error converges or overfitting begins.

8.

RELATED WORK

Scaling up tree learning algorithms to large datasets is an area of active research interest. There have been two main research directions taken by previous work: (1) centralized algorithms for large datasets on disk to avoid inmemory limitations, and (2) parallel algorithms on specific parallel computing architectures. In applying the MapReduce framework to large scale tree learning, PLANET borrows and builds upon several ideas from these previous approaches. Centralized Algorithms: Notable centralized algorithms for scaling decision tree learning to large datasets include SLIQ , CLOUDS , RAINFOREST , and BOAT . SLIQ uses strategies like pre-sorting and attribute lists in breadth-first tree-growing to enable learning from large training data on disk. While PLANET does not use pre-sorting or attribute lists, it grows the tree breadth-first like SLIQ. The key insight in RAINFOREST is that the splitting decision at a tree node needs a compact data structure of sufficient statistics (called AVC group in the paper), which in most cases can be fit in-memory. PLANET similarly maintains sufficient statistics on mappers during MR ExpandNodes. CLOUDS samples the split points for numeric attributes and uses an estimation step to find the best split point, resulting in lower computation and I/O cost compared to other tree learning algorithms like C4.5. For efficient estimation of the best split, PLANET uses equidepth histograms of ordered attributes to estimate split points. Finally, BOAT uses statistical sampling to construct a tree based on a small subset of the whole data and then does corrections to the tree based on estimated differences compared to the actual tree learned on the whole data. In comparison, PLANET builds the tree from the whole data directly. Parallel Algorithms: Numerous approaches for parallelizing tree learning have been proposed.  contains an excellent survey of existing approaches, along with the motivations for large scale tree learning. Bradford et al.  discuss how the C4.5 decision tree induction algorithm can be effectively parallelized in the ccNUMA parallel computing platform. It also mentions other parallel implementations of decision trees, namely SLIQ, SPRINT, and ScalParC for message-passing systems, and SUBTREE, MWK and MLC++ for SMPs. Most of these algorithms have been developed for specific parallel computing architectures, many of which have specific advantages, e.g., shared memory to avoid replicating or communicating the whole dataset among the processors. In comparison, PLANET is based on the MapReduce platform that uses commodity hardware for massive-scale parallel computing.

For deciding the split points of attributes, SPRINT  uses attribute lists like SLIQ. Each processor is given a sublist of each attribute list, corresponding to the instance indices in the data chunk sent to the processor. While computing good split points, each processor determines the gains over the instances assigned to that processor for each ordered attribute, and sends the master a portion of the statistics needed to determine the best split. However, this requires an all-to-all broadcast of instance ids at the end. PLANET takes a simpler and more scalable approach – instead of considering all possible split points, it computes a representative subset of the splits using approximate histograms, after which the selection of the best split can be done using only one MapReduce job (details in Section 4.1). ScalParC , which builds on SLIQ and SPRINT, also splits each attribute list into multiple parts and assigns each part to a processor. However, rather than building the tree in a depth-first manner (as done by C4.5, MLC++, etc.), it does a breadth-first tree growth like SLIQ (and PLANET) to prevent possible load imbalance in a parallel computing framework. Other notable techniques for parallel tree learning include: (1) parallel decision tree learning on a SMP architecture based on attribute scheduling among processors, including task pipelining and dynamic load balancing for speedup ; (2) meta-learning schemes that train multiple trees in parallel along with a final arbiter tree that combines their predictions ; (3) distributed learning of trees by boosting, which operates over partitions of a large dataset that are exchanged among the processors ; (4) the SPIES algorithm, which combines the AVC-group idea of RAINFOREST with effective sampling of the training data to obtain a communication- and memory-efficient parallel tree learning method ; (5) a distributed tree learning algorithm that uses only 20% of the communication cost to centralize the data, but achieves 80% of the accuracy of the centralized version . On the theoretical side, Caragea et al.  formulated the problem of learning from distributed data and showed different algorithm settings for learning trees from distributed data, each of which is provably exact, i.e., they give the same results as a tree learned using all the data in a centralized setting. Approximate algorithms for parallel learning of trees on streaming data have also been recently proposed [2, 20]. MapReduce in Machine Learning: In recent years, some learning algorithms have been implemented using the MapReduce framework. Chu et al.  give an excellent overview of how different popular learning algorithms (e.g., locally weighted linear regression, na¨ıve Bayes classification, Gaussian discriminative analysis, k-means, logistic regression, neural networks, principal component analysis, independent component analysis, expectation maximization, support vector machines) can be effectively solved in the MapReduce framework. However, these algorithms have all been implemented using a shared-memory multi-processor architecture. Our focus is on scaling learning algorithms (especially ensemble tree learning) to massive datasets using a MapReduce framework deployed on commodity hardware.

9. CONCLUSIONS We have presented PLANET, a framework for large-scale

tree learning using a MapReduce cluster. We are currently applying PLANET to problems within the sponsored search domain. Our experience is that the system scales well and performs reliably in this context, and we expect results would be similar in a variety of other domains involving large scale learning problems. Our initial goal in building PLANET was to develop a scalable tree learner with accuracy comparable to a traditional in-memory algorithm, but capable of handling much more training data. We believe our experience in building and deploying PLANET provides lessons in using MapReduce for other non-trivial mining and data processing tasks. The strategies we developed for handling tree learning should be applicable to other problems requiring multiple iterations, each requiring one or more applications of MapReduce. For future work, our short term focus is to extend the functionality of PLANET in various ways to support more learning problems at Google. For example, we intend to support split metrics other than those based on variance. We also intend to investigate how intelligent sampling schemes might be used in conjunction with the scalability offered by PLANET. Other future plans include extending the implementation to handle multi-class classification and incremental learning.

Acknowledgments We would like to thank Ashish Agarwal, Puneet Chopra, Mayur Datar, Oystein Fledsberg, Rob Malkin, Gurmeet Singh Manku, Andrew Moore, Fernando Pereira, D. Sculley and Diane Tang for their feedback and contributions to this work.

10.

REFERENCES

 K. Alsabti, S. Ranka, and V. Singh. Clouds: A decision tree classier for large datasets. Technical report, University of Florida, 1998.  Y. Ben-Haim and E. Yom-Tov. A streaming parallel decision tree algorithm. In Large Scale Learning Challenge Workshop at the International Conference on Machine Learning (ICML), 2008.  J. P. Bradford, J. A. B. Fortes, and J. Bradford. Characterization and parallelization of decision tree induction. Technical report, Purdue University, 1999.  L. Breiman. Bagging predictors. Machine Learning Journal, 24(2):123–140, 1996.  L. Breiman. Random forests. Machine Learning Journal, 45(1):5–32, 2001.  L. Breiman, J. H. Friedman, R. Olshen, and C. Stone. Classification and Regression Trees. Wadsworth and Brooks, 1984.  D. Caragea, A. Silvescu, and V. Honavar. A framework for learning from distributed data using sufficient statistics and its application to learning decision trees. International Journal of Hybrid Intelligent Systems, 1(1–2):80–89, 2004.  R. Caruana, N. Karampatziakis, and A. Yessenalina. An empirical evaluation of supervised learning in high dimensions. In International Conference on Machine Learning (ICML), pages 96–103, 2008.  R. Caruana and A. Niculescu-Mizil. An empirical comparison of supervised learning algorithms. In







 





















International Conference on Machine Learning (ICML), pages 161–168, 2006. P. K. Chan and S. J. Stolfo. Toward parallel and distributed learning by meta-learning. In Workshop on Knowledge Discovery in Databases at the Conference of Association for the Advancement of Artificial Intelligence (AAAI), pages 227–240, 1993. C.-T. Chu, S. K. Kim, Y.-A. Lin, Y. Yu, G. Bradski, A. Y. Ng, and K. Olukotun. Map-reduce for machine learning on multicore. In Advances in Neural Information Processing Systems (NIPS) 19, pages 281–288, 2007. J. Dean and S. Ghemawat. Mapreduce: Simplified data processing on large clusters. In Symposium on Operating System Design and Implementation (OSDI), 2004. R. O. Duda, P. E. Hart, and D. G. Stork. Pattern Classification. Wiley, New York, second edition, 2001. Y. Freund and R. E. Schapire. Experiments with a new boosting algorithm. In International Conference on Machine Learning (ICML), pages 148–156, 1996. J. H. Friedman. Greedy function approximation: A gradient boosting machine. Annals of Statistics, 29(5):1189–1232, 2001. J. Gehrke, V. Ganti, R. Ramakrishnan, and W.-Y. Loh. BOAT – Optimistic decision tree construction. In International Conference on ACM Special Interest Group on Management of Data (SIGMOD), pages 169–180, 1999. J. Gehrke, R. Ramakrishnan, and V. Ganti. Rainforest - A framework for fast decision tree construction of large datasets. In International Conference on Very Large Data Bases (VLDB), pages 416–427, 1998. C. Giannella, K. Liu, T. Olsen, and H. Kargupta. Communication efficient construction of decision trees over heterogeneously distributed data. In International Conference on Data Mining (ICDM), pages 67–74, 2004. R. Jin and G. Agrawal. Communication and memory efficient parallel decision tree construction. In SIAM Conference on Data Mining (SDM), pages 119–129, 2003. R. Jin and G. Agrawal. Efficient decision tree construction on streaming data. In SIGKDD Conference on Knowledge Discovery and Data Mining (KDD), pages 571–576, 2003. M. Joshi, G. Karypis, and V. Kumar. Scalparc: A new scalable and efficient parallel classification algorithm for mining large datasets. In International Parallel Processing Symposium (IPPS), pages 573–579, 1998. A. Kaushik. Bounce rate as sexiest web metric ever. MarketingProfs, August 2007. http://www.marketingprofs.com/7/bounce-ratesexiest-web-metric-ever-kaushik.asp?sp=1. A. Kaushik. Excellent analytics tip 11: Measure effectiveness of your web pages. Occam’s Razor (blog), May 2007. http://www.kaushik.net/avinash/2007/05/excellentanalytics-tip-11-measure-effectiveness-of-your-webpages.html. A. Lazarevic. The distributed boosting algorithm. In SIGKDD Conference on Knowledge Discovery and

Data Mining (KDD), pages 311–316, 2001.  G. S. Manku, S. Rajagopalan, and B. G. Lindsay. Random sampling techniques for space efficient online computation of order statistics of large datasets. In International Conference on ACM Special Interest Group on Management of Data (SIGMOD), pages 251–262, 1999.  M. Mehta, R. Agrawal, and J. Rissanen. Sliq: A fast scalable classifier for data mining. In International Conference on Extending Data Base Technology (EDBT), pages 18–32, 1996.  F. Provost and U. Fayyad. A survey of methods for scaling up inductive algorithms. Data Mining and Knowledge Discovery, 3:131–169, 1999.  G. Ridgeway. Generalized boosted models: A guide to the gbm package. http://cran.r-project.org/web/packages/gbm, 2006.  L. Rokach and O. Maimon. Data Mining with Decision Trees: Theory and Applications. World Scientific Publishing Company, 2008.  D. Sculley, R. Malkin, S. Basu, and R. J. Bayardo. Predicting bounce rates in sponsored search advertisements. In SIGKDD Conference on Knowledge Discovery and Data Mining (KDD), pages 1325–1334, 2009.  J. C. Shafer, R. Agrawal, and M. Mehta. Sprint: A scalable parallel classifier for data mining. In International Conference on Very Large Data Bases (VLDB), pages 544–555, 1996.  V. N. Vapnik. The Nature of Statistical Learning Theory. Springer-Verlag, Berlin, 1995.  M. J. Zaki, C.-T. Ho, and R. Agrawal. Parallel classification for data mining on shared-memory multiprocessors. In International Conference on Data Engineering (ICDE), pages 198–205, 1999.
{"ft_lang_label":"__label__en","ft_lang_prob":0.8977008,"math_prob":0.8762684,"size":66722,"snap":"2022-27-2022-33","text_gpt3_token_len":14821,"char_repetition_ratio":0.15214784,"word_repetition_ratio":0.038582608,"special_character_ratio":0.21823387,"punctuation_ratio":0.12257007,"nsfw_num_words":0,"has_unicode_error":false,"math_prob_llama3":0.96312666,"pos_list":[0],"im_url_duplicate_count":[null],"WARC_HEADER":"{\"WARC-Type\":\"response\",\"WARC-Date\":\"2022-07-02T23:58:59Z\",\"WARC-Record-ID\":\"<urn:uuid:5de79b64-21e3-4e20-bf9f-096d4e84ae0e>\",\"Content-Length\":\"123925\",\"Content-Type\":\"application/http; msgtype=response\",\"WARC-Warcinfo-ID\":\"<urn:uuid:3060516f-b0e3-424e-8e1d-bd7dee4d11e5>\",\"WARC-Concurrent-To\":\"<urn:uuid:c1ed61a1-66c9-43ce-8ec3-05222bab4e27>\",\"WARC-IP-Address\":\"104.21.83.11\",\"WARC-Target-URI\":\"https://moam.info/planet-massively-parallel-learning-of-tree-ensembles-with-_59aedbe21723ddbfc5889491.html\",\"WARC-Payload-Digest\":\"sha1:DCJF7BVSTT3QNG56TMFZ2YHRFYOS4YD2\",\"WARC-Block-Digest\":\"sha1:PCCINO65SXJSEMZDFCD2FNL2NQZAAU25\",\"WARC-Identified-Payload-Type\":\"text/html\",\"warc_filename\":\"/cc_download/warc_2022/CC-MAIN-2022-27/CC-MAIN-2022-27_segments_1656104205534.63_warc_CC-MAIN-20220702222819-20220703012819-00377.warc.gz\"}"}