Sto cercando di implementare una semplice demo per il classificatore ad albero delle decisioni usando la versione 1.0.0 di java e apache spark. Sono basato su http://spark.apache.org/docs/1.0.0/mllib-decision-tree.html. Finora ho scritto il codice elencato di seguito.Problema di implementazione della struttura ad albero delle decisioni in apache spark con java
in linea con seguente codice ottengo errore:
org.apache.spark.mllib.tree.impurity.Impurity impurity = new org.apache.spark.mllib.tree.impurity.Entropy();
Tipo non corrispondente: non può convertire da Entropia all'impurità. E 'strano per me, mentre la classe Entropia implementa l'interfaccia impurità:
https://spark.apache.org/docs/1.0.0/api/java/org/apache/spark/mllib/tree/impurity/Entropy.html
Sto cercando risposta per la domanda il motivo per cui non posso fare questo incarico?
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 se rimuovere impurità variabile e passare alla seguente forma:
Strategy strategy = new Strategy(Algo.Classification(), new org.apache.spark.mllib.tree.impurity.Entropy(), maxDepth, maxBins, null, null, maxMemory);
errore cambiato: Il costruttore Entropy() è indefinito.
[a cura] ho trovato penso corretta invocazione del metodo (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);
Purtroppo mi imbatto in bug :(
Dispari. Prova semplicemente ad integrarlo piuttosto che assegnarlo a una variabile. Dopotutto si usa la variabile una sola volta. Consigliamo anche di usare Scala piuttosto che l'API Java, puoi fare tutto ciò in letteralmente un paio di righe e sarà molto più facile da leggere. – samthebest