Back to home page

OSCL-LXR

 
 

    


0001 /*
0002  * Licensed to the Apache Software Foundation (ASF) under one or more
0003  * contributor license agreements.  See the NOTICE file distributed with
0004  * this work for additional information regarding copyright ownership.
0005  * The ASF licenses this file to You under the Apache License, Version 2.0
0006  * (the "License"); you may not use this file except in compliance with
0007  * the License.  You may obtain a copy of the License at
0008  *
0009  *    http://www.apache.org/licenses/LICENSE-2.0
0010  *
0011  * Unless required by applicable law or agreed to in writing, software
0012  * distributed under the License is distributed on an "AS IS" BASIS,
0013  * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
0014  * See the License for the specific language governing permissions and
0015  * limitations under the License.
0016  */
0017 
0018 package org.apache.spark.examples.ml;
0019 
0020 // $example on$
0021 import org.apache.spark.ml.Pipeline;
0022 import org.apache.spark.ml.PipelineModel;
0023 import org.apache.spark.ml.PipelineStage;
0024 import org.apache.spark.ml.classification.GBTClassificationModel;
0025 import org.apache.spark.ml.classification.GBTClassifier;
0026 import org.apache.spark.ml.evaluation.MulticlassClassificationEvaluator;
0027 import org.apache.spark.ml.feature.*;
0028 import org.apache.spark.sql.Dataset;
0029 import org.apache.spark.sql.Row;
0030 import org.apache.spark.sql.SparkSession;
0031 // $example off$
0032 
0033 public class JavaGradientBoostedTreeClassifierExample {
0034   public static void main(String[] args) {
0035     SparkSession spark = SparkSession
0036       .builder()
0037       .appName("JavaGradientBoostedTreeClassifierExample")
0038       .getOrCreate();
0039 
0040     // $example on$
0041     // Load and parse the data file, converting it to a DataFrame.
0042     Dataset<Row> data = spark
0043       .read()
0044       .format("libsvm")
0045       .load("data/mllib/sample_libsvm_data.txt");
0046 
0047     // Index labels, adding metadata to the label column.
0048     // Fit on whole dataset to include all labels in index.
0049     StringIndexerModel labelIndexer = new StringIndexer()
0050       .setInputCol("label")
0051       .setOutputCol("indexedLabel")
0052       .fit(data);
0053     // Automatically identify categorical features, and index them.
0054     // Set maxCategories so features with > 4 distinct values are treated as continuous.
0055     VectorIndexerModel featureIndexer = new VectorIndexer()
0056       .setInputCol("features")
0057       .setOutputCol("indexedFeatures")
0058       .setMaxCategories(4)
0059       .fit(data);
0060 
0061     // Split the data into training and test sets (30% held out for testing)
0062     Dataset<Row>[] splits = data.randomSplit(new double[] {0.7, 0.3});
0063     Dataset<Row> trainingData = splits[0];
0064     Dataset<Row> testData = splits[1];
0065 
0066     // Train a GBT model.
0067     GBTClassifier gbt = new GBTClassifier()
0068       .setLabelCol("indexedLabel")
0069       .setFeaturesCol("indexedFeatures")
0070       .setMaxIter(10);
0071 
0072     // Convert indexed labels back to original labels.
0073     IndexToString labelConverter = new IndexToString()
0074       .setInputCol("prediction")
0075       .setOutputCol("predictedLabel")
0076       .setLabels(labelIndexer.labelsArray()[0]);
0077 
0078     // Chain indexers and GBT in a Pipeline.
0079     Pipeline pipeline = new Pipeline()
0080       .setStages(new PipelineStage[] {labelIndexer, featureIndexer, gbt, labelConverter});
0081 
0082     // Train model. This also runs the indexers.
0083     PipelineModel model = pipeline.fit(trainingData);
0084 
0085     // Make predictions.
0086     Dataset<Row> predictions = model.transform(testData);
0087 
0088     // Select example rows to display.
0089     predictions.select("predictedLabel", "label", "features").show(5);
0090 
0091     // Select (prediction, true label) and compute test error.
0092     MulticlassClassificationEvaluator evaluator = new MulticlassClassificationEvaluator()
0093       .setLabelCol("indexedLabel")
0094       .setPredictionCol("prediction")
0095       .setMetricName("accuracy");
0096     double accuracy = evaluator.evaluate(predictions);
0097     System.out.println("Test Error = " + (1.0 - accuracy));
0098 
0099     GBTClassificationModel gbtModel = (GBTClassificationModel)(model.stages()[2]);
0100     System.out.println("Learned classification GBT model:\n" + gbtModel.toDebugString());
0101     // $example off$
0102 
0103     spark.stop();
0104   }
0105 }