6

モデルをトレーニングするとき、たとえば線形回帰では、テスト データセットのトレーニングで MinMaxScaler のような正規化を行うことがあります。

トレーニング済みのモデルを取得し、それを使用して予測を行い、予測を元の表現に縮小した後。

Pythonには「inverse_transform」メソッドがあります。例えば:

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)

スパークに同様の方法はありますか?

私はたくさんグーグルで検索しましたが、答えが見つかりませんでした。誰か私にいくつかの提案をしてもらえますか? どうもありがとうございました!

4

3 に答える 3

2

当社では、StandardScaler で同じ問題を解決するために、spark.ml を次のように拡張しました。

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)
        }
    }

}

それを変更したり、特定のケースで同様のことをしたりするのはかなり簡単なはずです。

JVM の double 実装により、通常、これらの操作では精度が失われるため、変換前の元の値を正確に復元することはできないことに注意してください (たとえば、2.0 ではなく 1.9999999999999998 のような値が得られる可能性があります)。

于 2018-02-15T15:07:53.190 に答える