SparkR(Spark 2.1.0或2.2.0)中是否有MaxAbsScaler?

时间:2017-11-10 14:06:54

标签: r dataframe spark-dataframe preprocessor sparkr

在spark中,有scala的StandardScaler,MinMaxScaler,MaxAbsScaler,java和python。 Spark是否在R(SparkR)中有这样的方法?

1 个答案:

答案 0 :(得分:2)

在Spark 2.2.0或2.1.0中,有一些可用的缩放器,它们是scala,java和python中数据预处理所必需的。但是R(SparkR)中还没有可用的缩放器。因此,我编写了两个缩放数据框列的函数。

功能1:

# max abs scaler function (R dataframe to Spark Dataframe)
maxabsscaler <- function(df, cols, scalingUpperLimit){
  for(i in cols){
    max <- max(df[i])
    df[i] <- (df[, c(i)] / max) * scalingUpperLimit
  }
  return(as.DataFrame(df))
}

功能2:

# max abs scaler function (Only Spark Dataframe)
maxabsscaler2 <- function(df, cols, scalingUpperLimit){
  createOrReplaceTempView(df, "df_tmp")
  for(i in columns){
    max <- collect(sql(paste("SELECT MAX(", i ,") FROM df_tmp")))[[1]]
    df[[i]] <- df[[i]] / max * scalingUpperLimit
  }
  return(df)
}

注意: Function1适用于您的桌面应用程序或测试环境,因为调用此功能时需要将spark数据帧转换为R数据帧。 R数据帧在单台计算机上运行。因此,它不适合大数据集。在Function2中,没有必要将spark数据帧转换为R数据帧。因此,您可以将此功能部署到生产环境中。函数无法处理NA值。但是你可以改进它们。你需要指定列和scalingUpperLimit(100,10,1等)参数。

样本使用:

survival_of_patients <- read.df("D:\\projects\\R\\data\\survival_of_patients.csv", "csv", header = "true")

trainTest <-randomSplit(survival_of_patients, c(0.8, 0.2), 42)
train = trainTest[[1]]
test = trainTest[[2]]

columns <- colnames(as.data.frame(train))[!colnames(as.data.frame(train)) %in% c("SurvivalStatus")]

train <- maxabsscaler(as.data.frame(train), columns,  10)
test <- maxabsscaler(as.data.frame(test), columns,  10)

# or
# train <- maxabsscaler2(train, columns,  10)
# test <- maxabsscaler2(test, columns,  10)

您可以下载此数据集并测试功能。 https://archive.ics.uci.edu/ml/datasets/Haberman%27s+Survival