使用 mutate_each 在 sparklyr 中缩放和居中变量
Using mutate_each to scale and center variables in sparklyr
我正在 sparklyr
中处理聚类问题。训练集中的许多变量是在不同的尺度上测量的,因此相差几个数量级。根据最佳实践,我正在尝试缩放和居中数据。
有许多不同的公式可以执行此操作,最传统的公式是 (X - µ) / σ,其中 X 是随机变量,µ= 均值,σ= 标准差。我也喜欢使用 (X - x) / (x_max - x_min) 其中 X= 随机变量,x=样本均值,x_max= 最大值,x_min =最小值。
使用 dplyr
应用此转换后,我得到了一个奇怪的结果。考虑这个例子:
#connect to spark
library(sparklyr)
library(SparkR)
library(dplyr)
sc = spark_connect(master = 'yarn-client',
spark_home = '/usr/hdp/current/spark-client',
app_name = 'sparklyr'
# config = list(
# "sparklyr.shell.executor-memory" = "XG",
# "sparklyr.shell.driver-memory" = "XG",
# "spark.driver.maxResultSize" = "XG" # may need to transfer a lot of data into R
)
sparkR.init()
#create a dataframe where variables in the dataset differ by an order of magnitude
mat <- as.data.frame(matrix(data = rnorm(200, mean=100,sd=10), nrow = 1000, ncol = 50))
mat1 <- as.data.frame(matrix(data = rnorm(200, mean=0,sd=1), nrow = 1000, ncol = 50))
colnames(mat1) <- paste('X',1:50,sep='')
mat.final <- cbind(mat,mat1)
#copy to Spark
dat.out <- sdf_copy_to(sc,mat.final,'dat',overwrite=TRUE)
#define centering and scaling function
scale.center <- function(x){
(x-mean(x,na.rm=TRUE)) /(max(x,na.rm = TRUE)-min(x,na.rm = TRUE))
}
#scale data
dat.out1 <-
dat.out %>%
mutate_each(funs(s=scale.center))
代码运行,但我得到一些奇怪的东西:
str(dat.out1)
$ ops:List of 4
..$ name: chr "mutate"
..$ x :List of 4
.. ..$ name: chr "mutate"
.. ..$ x :List of 4
.. .. ..$ name: chr "mutate"
.. .. ..$ x :List of 4
.. .. .. ..$ name: chr "mutate"
.. .. .. ..$ x :List of 4
.. .. .. .. ..$ name: chr "mutate"
.. .. .. .. ..$ x :List of 4
.. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. .. .. .. .. ..$ name: chr "mutate"
.. ..
以上只是运行str
后输出的一部分。关于这里出了什么问题的想法。我很惊讶没有用于居中和缩放的内置函数。
Thoughts on what's going wrong here.
这与 中描述的问题本质上是相同的 - mutate
中使用的聚合函数被扩展到全局(没有 PARTITION BY
子句)window 函数使得这个方法在实践中完全没用。
I'm surprised there isn't a build in function for centering and scaling.
嗯,一般来说,Spark 使用 ML Transformers
进行操作,其中一些已经移植到 sparklyr
。这些可以通过 ft_
前缀来区分。不幸的是 StandardScaler
and MinMaxScaler
尚未移植。不过实现自己的界面并不难。
如果您想要一个可以按原样处理数据的快速方法:
library(rlang)
library(glue)
# Compute all the stats at once
stats <- dat.out %>% summarise_all(funs(avg, min, max)) %>% collect()
# Separate stats into components
cols <- dat.out %>% colnames()
avgs <- stats %>% select(ends_with("avg")) %>% unlist
mins <- stats %>% select(ends_with("min")) %>% unlist
maxs <- stats %>% select(ends_with("max")) %>% unlist
# Create expressions
exprs <- glue("({cols} - {avgs}) / ({maxs} - {mins})") %>%
setNames(cols) %>%
lapply(parse_quosure)
dat.out %>% mutate(!!! exprs)
学分再次转到 Artem Sokolov ()。
注:
不要将 .
与要与 sparklyr
一起使用的函数一起使用。 dplyr
将尝试将这些匹配为 "prefix" 数据库中的数据库函数,但会失败或产生意外结果。
我正在 sparklyr
中处理聚类问题。训练集中的许多变量是在不同的尺度上测量的,因此相差几个数量级。根据最佳实践,我正在尝试缩放和居中数据。
有许多不同的公式可以执行此操作,最传统的公式是 (X - µ) / σ,其中 X 是随机变量,µ= 均值,σ= 标准差。我也喜欢使用 (X - x) / (x_max - x_min) 其中 X= 随机变量,x=样本均值,x_max= 最大值,x_min =最小值。
使用 dplyr
应用此转换后,我得到了一个奇怪的结果。考虑这个例子:
#connect to spark
library(sparklyr)
library(SparkR)
library(dplyr)
sc = spark_connect(master = 'yarn-client',
spark_home = '/usr/hdp/current/spark-client',
app_name = 'sparklyr'
# config = list(
# "sparklyr.shell.executor-memory" = "XG",
# "sparklyr.shell.driver-memory" = "XG",
# "spark.driver.maxResultSize" = "XG" # may need to transfer a lot of data into R
)
sparkR.init()
#create a dataframe where variables in the dataset differ by an order of magnitude
mat <- as.data.frame(matrix(data = rnorm(200, mean=100,sd=10), nrow = 1000, ncol = 50))
mat1 <- as.data.frame(matrix(data = rnorm(200, mean=0,sd=1), nrow = 1000, ncol = 50))
colnames(mat1) <- paste('X',1:50,sep='')
mat.final <- cbind(mat,mat1)
#copy to Spark
dat.out <- sdf_copy_to(sc,mat.final,'dat',overwrite=TRUE)
#define centering and scaling function
scale.center <- function(x){
(x-mean(x,na.rm=TRUE)) /(max(x,na.rm = TRUE)-min(x,na.rm = TRUE))
}
#scale data
dat.out1 <-
dat.out %>%
mutate_each(funs(s=scale.center))
代码运行,但我得到一些奇怪的东西:
str(dat.out1)
$ ops:List of 4
..$ name: chr "mutate"
..$ x :List of 4
.. ..$ name: chr "mutate"
.. ..$ x :List of 4
.. .. ..$ name: chr "mutate"
.. .. ..$ x :List of 4
.. .. .. ..$ name: chr "mutate"
.. .. .. ..$ x :List of 4
.. .. .. .. ..$ name: chr "mutate"
.. .. .. .. ..$ x :List of 4
.. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. .. .. .. ..$ name: chr "mutate"
.. .. .. .. .. .. .. .. .. ..$ x :List of 4
.. .. .. .. .. .. .. .. .. .. ..$ name: chr "mutate"
.. ..
以上只是运行str
后输出的一部分。关于这里出了什么问题的想法。我很惊讶没有用于居中和缩放的内置函数。
Thoughts on what's going wrong here.
这与 mutate
中使用的聚合函数被扩展到全局(没有 PARTITION BY
子句)window 函数使得这个方法在实践中完全没用。
I'm surprised there isn't a build in function for centering and scaling.
嗯,一般来说,Spark 使用 ML Transformers
进行操作,其中一些已经移植到 sparklyr
。这些可以通过 ft_
前缀来区分。不幸的是 StandardScaler
and MinMaxScaler
尚未移植。不过实现自己的界面并不难。
如果您想要一个可以按原样处理数据的快速方法:
library(rlang)
library(glue)
# Compute all the stats at once
stats <- dat.out %>% summarise_all(funs(avg, min, max)) %>% collect()
# Separate stats into components
cols <- dat.out %>% colnames()
avgs <- stats %>% select(ends_with("avg")) %>% unlist
mins <- stats %>% select(ends_with("min")) %>% unlist
maxs <- stats %>% select(ends_with("max")) %>% unlist
# Create expressions
exprs <- glue("({cols} - {avgs}) / ({maxs} - {mins})") %>%
setNames(cols) %>%
lapply(parse_quosure)
dat.out %>% mutate(!!! exprs)
学分再次转到 Artem Sokolov (
注:
不要将 .
与要与 sparklyr
一起使用的函数一起使用。 dplyr
将尝试将这些匹配为 "prefix" 数据库中的数据库函数,但会失败或产生意外结果。