2017-01-12 3 views
0

Um neue und ungesehene Etiketten in einer Funke-ml-Pipeline zu behandeln, möchte ich am häufigsten Imputation verwenden. wenn die Rohrleitung besteht aus 3 Schrittenfunken ml pipeline handle ungesehene etiketten

  1. Vorverarbeiten
  2. lernen häufigste Element
  3. stringIndexer für jede Spalte kategorischen
  4. Vektor assembler
  5. Schätzer z.B.
  6. Random Forest

Unter der Annahme (1) und (2,3) und (4,5) bildet getrennte Pipelines

  • I kann 1 für Zug-und Testdaten passen und zu transformieren. Dies bedeutet, alle nan-Werte wurden behandelt, dh
  • kalkulatorische
  • 2,3 passt schön sowie 4,5
  • dann kann ich

folgende

val fittedLabels = pipeline23.stages collect { case a: StringIndexerModel => a } 
val result = categoricalColumns.zipWithIndex.foldLeft(validationData) { 
    (currentDF, colName) => 
     currentDF 
     .withColumn(colName._1, when(currentDF(colName._1) isin (fittedLabels(colName._2).labels: _*), currentDF(colName._1)) 
      .otherwise(lit(null))) 
    }.drop("replace") 

verwenden zu ersetzen neue/ungesehen Etiketten mit null

  • diese absichtlich eingeführt nulls durch die häufigste kalkulatorische Präteritum

Allerdings ist dieses Setup sehr hässlich. Tools wie CrossValidator funktionieren nicht mehr (da ich keine einzige Pipeline liefern kann)

Wie kann ich auf die angepassten Labels in der Pipeline zugreifen, um einen Transformer zu erstellen, der die neuen Werte auf null setzt?

Sehen Sie einen besseren Ansatz, um den Umgang mit neuen Werten zu erreichen? Ich nehme an, dass die häufigste Imputation in Ordnung ist, d. H. Für einen Datensatz mit etwa 90 Spalten enthalten nur sehr wenige Spalten eine unsichtbare Bezeichnung.

Antwort

0

Ich erkannte schließlich, dass diese Funktionalität erforderlich ist, um in der Pipeline zu bleiben, um ordnungsgemäß zu funktionieren, d. H. Erfordert eine zusätzliche neue PipelineStage-Komponente.

Verwandte Themen