Преобразование MinMax на фрейме данных с использованием Scala - PullRequest
2 голосов
/ 31 марта 2020

У меня есть DataFrame числовых функций, которые мне нужно стандартизировать. Для этого я использую python MinMaxScaler для выполнения следующих операций со всеми столбцами DataFrame:

X = (X - X.min(axis=0)) / (X.max(axis=0) - X.min(axis=0))

Теперь я думаю сделать это с помощью Scala. Один из способов - использовать MinMaxScaler в Scala, но он генерирует массив функций и сохраняет его как новый столбец. Как я могу использовать MinMaxScaler и при этом иметь несколько столбцов с масштабированными функциями?

1 Ответ

0 голосов
/ 31 марта 2020

Это правда - MinMaxScaler работает с векторным типом. Но вы можете легко превратить это в однозначный столбец и получить то, что вы хотите. Вы можете работать с одним столбцом за раз - масштабировать каждый и возвращать обратно масштабированный фрейм данных. Вот как это сделать:

val columns = df.columns

// for each column turn it into DenseVector and apply MinMaxScaler
val steps = columns.flatMap { column => Array(
    new VectorAssembler().setInputCols(Array(column)).setOutputCol(s"${column}_feature"), 
    new MinMaxScaler().setInputCol(s"${column}_feature").setOutputCol(s"${column}_scaled")
)}

// apply transformation
val pipeline = new Pipeline().setStages(steps)
val scaledDf = pipeline.fit(df).transform(df)

// helper UDF function
val headValue = udf((vec: DenseVector) => vec(0))

// rename scaled column to original column name
scaledDf
    .select(columns.map(column => headValue(col(s"${column}_scaled")).alias(column)): _*)
    .show()
...