2017-09-01 1 views
2

Ich versuche, bei https://spark.apache.org/docs/latest/mllib-decision-tree.htmlFunkenlastdaten für Entscheidungsbaum - Bezeichnung ändern in LabelledPoint

das Beispiel für Entscheidungsbaum in Funken zu tun habe ich heruntergeladen A1A-Datensatz aus http://www.csie.ntu.edu.tw/~cjlin/libsvmtools/datasets/binary.html#a1a

Der Datensatz ist in LIBSVM Format, bei dem die zwei Klassen haben Etiketten +1,0 und -1,0 Wenn ich versuche,

import org.apache.spark.mllib.tree.DecisionTree 
import org.apache.spark.mllib.tree.model.DecisionTreeModel 
import org.apache.spark.mllib.util.MLUtils 

// Load and parse the data file. 
val data = MLUtils.loadLibSVMFile(sc, "/user/cloudera/testDT/a1a.t") 
// Split the data into training and test sets (30% held out for testing) 
val splits = data.randomSplit(Array(0.7, 0.3)) 
val (trainingData, testData) = (splits(0), splits(1)) 

// Train a DecisionTree model. 
// Empty categoricalFeaturesInfo indicates all features are continuous. 
val numClasses = 2 
val categoricalFeaturesInfo = Map[Int, Int]() 
val impurity = "gini" 
val maxDepth = 5 
val maxBins = 32 

val model = DecisionTree.trainClassifier(trainingData, numClasses, categoricalFeaturesInfo, 
| impurity, maxDepth, maxBins) 

ich:

java.lang.IllegalArgumentException: GiniAggregator given label -1.0 but requires label is non-negative.

Also habe ich versucht, die Bezeichnung -1.0 zu 0.0 zu ändern. Ich habe versucht, so etwas wie

def changeLabel(a: org.apache.spark.mllib.regression.LabeledPoint) = 
{ if (a.label == -1.0) {a.label = 0.0} } 

Wo ich Fehler:

reassignment to val

Also meine Frage ist: Wie kann ich die Etiketten meiner Daten ändern? Oder gibt es einen Workaround, damit DecisionTree.trainClassifier() mit Daten mit negativen Labels arbeiten kann?

Antwort

1

TL; DR Sie können nicht Wert Argument einer Product Klasse zurücktreten, und selbst wenn es möglich war (wie var deklariert), Sie sollten nie Daten an Ort und Stelle in Funken ändern.

Wie wäre:

def changeLabel(a: org.apache.spark.mllib.regression.LabeledPoint) = 
    if (a.label == -1.0) a.copy(label = 0.0) else a 
scala> changeLabel(LabeledPoint(-1.0, Vectors.dense(1.0, 2.0, 3.0))) 
res1: org.apache.spark.mllib.regression.LabeledPoint = (0.0,[1.0,2.0,3.0]) 

scala> changeLabel(LabeledPoint(1.0, Vectors.dense(1.0, 2.0, 3.0))) 
res2: org.apache.spark.mllib.regression.LabeledPoint = (1.0,[1.0,2.0,3.0]) 
Verwandte Themen