2017-03-24 5 views
0

Ich habe einige DataFrame, die die Vorhersagen aus einer Transformation eines Pipeline-Modells, die ein logistisches Regressionsmodell darstellt. Es erzeugt eine "Wahrscheinlichkeits" -Spalte, die ein Vektor ist, der vermutlich die Regressionslinie relativ zu den vorhersagbaren Werten (0 und 1) darstellt. Wie komme ich zu den Werten? Mein naiver Ansatz:wie mitColumn ein Element eines Vektors

predictionDF.select("probability").show() 
predictionDF.select("probability").printSchema() 
prediction.withColumn("certainty_no_brudd", 
         col("probability").cast("vector")(0)) 

gibt mir die folgende Ausgabe:

+--------------------+ 
|   probability| 
+--------------------+ 
|[0.79704719956042...| 
|[0.96065621060123...| 
|[0.94869126147921...| 
|[0.98881973295162...| 
|[0.94738842407184...| 
|[0.99517040850391...| 
|[0.67513098659304...| 
|[0.98185993174719...| 
|[0.88716858689769...| 
|[0.94886839225328...| 
|[0.87093946910993...| 
|[0.93752063096904...| 
|[0.99093365566705...| 
|[0.97163117781123...| 
|[0.88384736556118...| 
|[0.89095359364458...| 
|[0.94304454190511...| 
|[0.96116865958545...| 
|[0.91555675983743...| 
|[0.96092603080292...| 
+--------------------+ 
only showing top 20 rows 

root 
|-- probability: vector (nullable = true) 

Exception in thread "main" org.apache.spark.sql.catalyst.parser.ParseException: 
DataType vector() is not supported.(line 1, pos 0) 

== SQL == 
vector 
^^^ 


at org.apache.spark.sql.catalyst.parser.AstBuilder$$anonfun$visitPrimitiveDataType$1.apply(AstBuilder.scala:1440) 
... 
+0

@mtoto Wenn ich den Schwellenwert ändern möchte, könnte ich ProbabilisticClassifier.setThresholds verwenden, aber das ist nicht das, was ich hier versuche. – qonf

+0

Was meinst du mit '" Wie komme ich an die Werte? ", Bitte klären. – mtoto

Antwort

2

Verwendung UDF:

import org.apache.spark.ml.linalg._ 
import org.apache.spark.sql.functions._ 


val getItem = udf((v: Vector, i: Int) => v(i)) 

prediction.withColumn("certainty_no_brudd", getItem($"probability", lit(0))) 
+0

udf ist eine Abkürzung für User Defined Function? – qonf

+0

@qonf Ja, es ist benutzerdefinierte Funktion –

0

Ich warne generell gegen UDF für triviale Operationen, weil Funken sie keine Möglichkeit der Optimierung haben . Das kann eine große Sache sein, wenn Leistung wichtig ist und Ihre Daten groß genug sind.

Ich habe das nicht versucht, aber würde eine andere Besetzung für Sie arbeiten?

col("probability").cast(ArrayType(DoubleType)))

Oder wenn Sie auf der Vector Datenstruktur bestehen, könnten Sie nicht ein altmodisches map?

predictionDF.map(row => Vector(row.getDouble)) 

Denken Sie daran, Vector in Scala ist eine Datenstruktur und ist nicht unbedingt das gleiche wie Vektoren in Daten Wissenschaft.

Verwandte Themen