使用java的apache spark中的决策树实现问题

Posted

技术标签:

【中文标题】使用java的apache spark中的决策树实现问题【英文标题】:Decision tree implementation issue in apache spark with java 【发布时间】:2014-08-19 17:29:29 【问题描述】:

我正在尝试使用 java 和 apache spark 1.0.0 版本为决策树分类器实现简单的演示。我基于http://spark.apache.org/docs/1.0.0/mllib-decision-tree.html。到目前为止,我已经编写了下面列出的代码。

按照以下代码我得到错误:

org.apache.spark.mllib.tree.impurity.Impurity impurity = new org.apache.spark.mllib.tree.impurity.Entropy();

类型不匹配:无法从 Entropy 转换为 Impurity。 对我来说很奇怪,而 Entropy 类实现了 Impurity 接口:

https://spark.apache.org/docs/1.0.0/api/java/org/apache/spark/mllib/tree/impurity/Entropy.html

我正在寻找为什么我不能完成这项任务的问题的答案?

package decisionTree;

import java.util.regex.Pattern;

import org.apache.spark.api.java.JavaRDD;
import org.apache.spark.api.java.JavaSparkContext;
import org.apache.spark.api.java.function.Function;
import org.apache.spark.mllib.linalg.Vectors;
import org.apache.spark.mllib.regression.LabeledPoint;
import org.apache.spark.mllib.tree.DecisionTree;
import org.apache.spark.mllib.tree.configuration.Algo;
import org.apache.spark.mllib.tree.configuration.Strategy;
import org.apache.spark.mllib.tree.impurity.Gini;
import org.apache.spark.mllib.tree.impurity.Impurity;

import scala.Enumeration.Value;

public final class DecisionTreeDemo 

    static class ParsePoint implements Function<String, LabeledPoint> 
        private static final Pattern COMMA = Pattern.compile(",");
        private static final Pattern SPACE = Pattern.compile(" ");

        @Override
        public LabeledPoint call(String line) 
            String[] parts = COMMA.split(line);
            double y = Double.parseDouble(parts[0]);
            String[] tok = SPACE.split(parts[1]);
            double[] x = new double[tok.length];
            for (int i = 0; i < tok.length; ++i) 
                x[i] = Double.parseDouble(tok[i]);
            
            return new LabeledPoint(y, Vectors.dense(x));
        
    

    public static void main(String[] args) throws Exception 

        if (args.length < 1) 
            System.err.println("Usage:DecisionTreeDemo <file>");
            System.exit(1);
        

        JavaSparkContext ctx = new JavaSparkContext("local[4]", "Log Analizer",
                System.getenv("SPARK_HOME"),
                JavaSparkContext.jarOfClass(DecisionTreeDemo.class));

        JavaRDD<String> lines = ctx.textFile(args[0]);
        JavaRDD<LabeledPoint> points = lines.map(new ParsePoint()).cache();

        int iterations = 100;

        int maxBins = 2;
        int maxMemory = 512;
        int maxDepth = 1;

        org.apache.spark.mllib.tree.impurity.Impurity impurity = new org.apache.spark.mllib.tree.impurity.Entropy();

        Strategy strategy = new Strategy(Algo.Classification(), impurity, maxDepth,
                maxBins, null, null, maxMemory);

        ctx.stop();
    
   

@samthebest 如果我删除杂质变量并更改为以下形式:

Strategy strategy = new Strategy(Algo.Classification(), new org.apache.spark.mllib.tree.impurity.Entropy(), maxDepth, maxBins, null, null, maxMemory);

错误改为:构造函数 Entropy() 未定义。

[编辑] 我发现我认为正确调用方法(https://issues.apache.org/jira/browse/SPARK-2197):

Strategy strategy = new Strategy(Algo.Classification(), new Impurity() 
@Override
public double calculate(double arg0, double arg1, double arg2)
 return Gini.calculate(arg0, arg1, arg2); 

@Override
public double calculate(double arg0, double arg1)
 return Gini.calculate(arg0, arg1); 

, 5, 100, QuantileStrategy.Sort(), null, 256);

不幸的是我遇到了错误:(

【问题讨论】:

奇数。尝试仅内联它而不是分配给变量。毕竟你只使用一次变量。还真的推荐使用 Scala 而不是 Java API,你可以在几行字面上完成整个事情,它会更容易阅读。 【参考方案1】:

现在可以通过this pull request 获得针对错误 2197 的 Java 解决方案:

对决策树的其他改进,以便在 Java 中轻松使用: * 杂质类:添加了 instance() 方法来帮助 Java 接口。 * 策略:添加了对 Java 友好的构造函数 --> 注意:我从 Java 友好的构造函数中删除了 quantileCalculationStrategy,因为 (a) 它是一个特殊的类,并且 (b) 只有 1 当前选项。我怀疑我们会在另一个之前重做 API 包括选项。

您可以看到一个完整的示例,即使用 Gini impurity here 的 intance() 方法解决您的问题

Strategy strategy = new Strategy(Algo.Classification(), Gini.instance(), maxDepth, numClasses,maxBins, categoricalFeaturesInfo);
DecisionTreeModel model = DecisionTree$.MODULE$.train(rdd.rdd(), strategy);

【讨论】:

以上是关于使用java的apache spark中的决策树实现问题的主要内容,如果未能解决你的问题,请参考以下文章

全面解析Apache Spark中的决策树

将决策树训练分类器的模型输出保存为 Spark Scala 平台中的文本文件

使用 Apache Spark 决策树分类器进行多类分类时出错

Spark 决策树--回归模型

如何在 Apache Spark (PySpark 1.4.1) 中可视化/绘制决策树?

使用 Spark 中的共享变量