2

Lors de la formation d'un modèle, par exemple la régression linéaire, nous pouvons effectuer une normalisation, comme MinMaxScaler, sur le train d'un jeu de données de test. Après avoir obtenu un modèle de formation et l'utiliser pour faire des prédictions, et réduire les prédictions à la représentation d'origine.N'existe-t-il pas de méthode "reverse_transform" pour un scaler comme MinMaxScaler dans spark?

En python, il existe une méthode "inverse_transform". Par exemple:

from sklearn.preprocessing import MinMaxScaler 
scalerModel.inverse_transform 

from sklearn.preprocessing import MinMaxScaler 

data = [[-1, 2], [-0.5, 6], [0, 10], [1, 18]] 

scaler = MinMaxScaler() 
MinMaxScaler(copy=True, feature_range=(0, 1)) 
print(data) 

dataScaled = scaler.fit(data).transform(data) 
print(dataScaled) 

scaler.inverse_transform(dataScaled) 

Existe-t-il une méthode similaire dans l'étincelle?

J'ai beaucoup googlé, mais je n'ai pas trouvé de réponse. Quelqu'un peut-il me donner quelques suggestions? Merci beaucoup!

+0

Bonjour et bienvenue sur StackOverflow. Cela vous dérangerait-il de passer en revue votre article et de faire quelques modifications: certaines phrases de la façon dont elles sont rédigées n'ont pas beaucoup de sens et pourraient faire en sorte que les gens oublient votre question. Vous pouvez également utiliser des blocs de code pour rendre vos extraits de code plus attrayants. –

Répondre

0

Dans notre société, afin de résoudre le même problème sur le StandardScaler, nous avons étendu spark.ml avec ce (entre autres):

package org.apache.spark.ml 

import org.apache.spark.ml.linalg.DenseVector 
import org.apache.spark.ml.util.Identifiable 

package object feature { 

    implicit class RichStandardScalerModel(model: StandardScalerModel) { 

     private def invertedStdDev(sigma: Double): Double = 1/sigma 

     private def invertedMean(mu: Double, sigma: Double): Double = -mu/sigma 

     def inverse(newOutputCol: String): StandardScalerModel = { 
      val sigma: linalg.Vector = model.std 
      val mu: linalg.Vector = model.mean 
      val newSigma: linalg.Vector = new DenseVector(sigma.toArray.map(invertedStdDev)) 
      val newMu: linalg.Vector = new DenseVector(mu.toArray.zip(sigma.toArray).map { case (m, s) => invertedMean(m, s) }) 
      val inverted: StandardScalerModel = new StandardScalerModel(Identifiable.randomUID("stdScal"), newSigma, newMu) 
       .setInputCol(model.getOutputCol) 
       .setOutputCol(newOutputCol) 

      inverted 
       .set(inverted.withMean, model.getWithMean) 
       .set(inverted.withStd, model.getWithStd) 
     } 
    } 

} 

Il devrait être assez facile de le modifier ou faire quelque chose similaire pour votre cas particulier. Gardez à l'esprit qu'en raison de la double implémentation de JVM, vous perdez normalement de la précision dans ces opérations, donc vous ne récupérerez pas les valeurs d'origine exactes avant la transformation (ex: vous obtiendrez probablement quelque chose comme 1.9999999999999998 au lieu de 2.0) .