我有一个名为spam的数据集,其中包含58列和约3500行与垃圾邮件相关的数据。
我计划将来在这个数据集上运行一些线性回归,但我想事先做一些预处理,并将列标准化,使其具有零平均值和单位方差。
有人告诉我,最好的方法是用R,所以我想问,如何用R实现归一化?我已经正确加载了数据,我只是在寻找一些包或方法来执行这个任务。
我有一个名为spam的数据集,其中包含58列和约3500行与垃圾邮件相关的数据。
我计划将来在这个数据集上运行一些线性回归,但我想事先做一些预处理,并将列标准化,使其具有零平均值和单位方差。
有人告诉我,最好的方法是用R,所以我想问,如何用R实现归一化?我已经正确加载了数据,我只是在寻找一些包或方法来执行这个任务。
当前回答
您还可以使用数据轻松地将数据规范化。clusterSim包中的归一化函数。它提供了不同的数据规范化方法。
data.Normalization (x,type="n0",normalization="column")
参数
x 向量,矩阵或数据集 类型 归一化类型: N0 -没有归一化
N1 -标准化((x-mean)/sd)
N2 -位置标准化((x-median)/mad)
N3 -单元化((x-mean)/range)
N3a -位置单元化(x-median /range)
N4 -最小值为零的单元化((x-min)/范围)
N5 -归一化范围<-1,1> ((x-mean)/max(abs(x-mean)))
N5a -位置归一化范围<-1,1> ((x-median)/max(abs(x-median)))
N6 -商变换(x/sd)
N6a -位置商变换(x/mad)
N7 -商变换(x/range)
N8 -商变换(x/max)
N9 -商数变换(x/mean)
N9a -位置商变换(x/median)
N10 -商变换(x/sum)
n11 -商变换(x/√(SSQ))
N12 -归一化((x-mean)/根号(sum((x-mean)^2))
N12a -位置归一化((x-median)/平方根(sum(x-median)^2))
N13 -归一化,中心点为0 ((x-midrange)/(range/2))
归一化 "列" -由变量归一化,"行" -由对象归一化
其他回答
'插入'包提供了预处理数据的方法(例如居中和缩放)。你也可以使用下面的代码:
library(caret)
# Assuming goal class is column 10
preObj <- preProcess(data[, -10], method=c("center", "scale"))
newData <- predict(preObj, data[, -10])
详情:http://www.inside-r.org/node/86978
下面的代码可能是实现这一目标的最短方法。
dataframe <- apply(dataframe, 2, scale)
您还可以使用数据轻松地将数据规范化。clusterSim包中的归一化函数。它提供了不同的数据规范化方法。
data.Normalization (x,type="n0",normalization="column")
参数
x 向量,矩阵或数据集 类型 归一化类型: N0 -没有归一化
N1 -标准化((x-mean)/sd)
N2 -位置标准化((x-median)/mad)
N3 -单元化((x-mean)/range)
N3a -位置单元化(x-median /range)
N4 -最小值为零的单元化((x-min)/范围)
N5 -归一化范围<-1,1> ((x-mean)/max(abs(x-mean)))
N5a -位置归一化范围<-1,1> ((x-median)/max(abs(x-median)))
N6 -商变换(x/sd)
N6a -位置商变换(x/mad)
N7 -商变换(x/range)
N8 -商变换(x/max)
N9 -商数变换(x/mean)
N9a -位置商变换(x/median)
N10 -商变换(x/sum)
n11 -商变换(x/√(SSQ))
N12 -归一化((x-mean)/根号(sum((x-mean)^2))
N12a -位置归一化((x-median)/平方根(sum(x-median)^2))
N13 -归一化,中心点为0 ((x-midrange)/(range/2))
归一化 "列" -由变量归一化,"行" -由对象归一化
BBMisc包中的normalize函数对我来说是合适的工具,因为它可以处理NA值。
下面是如何使用它:
给定以下数据集,
ASR_API <- c("CV", "F", "IER", "LS-c", "LS-o")
Human <- c(NA, 5.8, 12.7, NA, NA)
Google <- c(23.2, 24.2, 16.6, 12.1, 28.8)
GoogleCloud <- c(23.3, 26.3, 18.3, 12.3, 27.3)
IBM <- c(21.8, 47.6, 24.0, 9.8, 25.3)
Microsoft <- c(29.1, 28.1, 23.1, 18.8, 35.9)
Speechmatics <- c(19.1, 38.4, 21.4, 7.3, 19.4)
Wit_ai <- c(35.6, 54.2, 37.4, 19.2, 41.7)
dt <- data.table(ASR_API,Human, Google, GoogleCloud, IBM, Microsoft, Speechmatics, Wit_ai)
> dt
ASR_API Human Google GoogleCloud IBM Microsoft Speechmatics Wit_ai
1: CV NA 23.2 23.3 21.8 29.1 19.1 35.6
2: F 5.8 24.2 26.3 47.6 28.1 38.4 54.2
3: IER 12.7 16.6 18.3 24.0 23.1 21.4 37.4
4: LS-c NA 12.1 12.3 9.8 18.8 7.3 19.2
5: LS-o NA 28.8 27.3 25.3 35.9 19.4 41.7
规范化的值可以这样得到:
> dtn <- normalize(dt, method = "standardize", range = c(0, 1), margin = 1L, on.constant = "quiet")
> dtn
ASR_API Human Google GoogleCloud IBM Microsoft Speechmatics Wit_ai
1: CV NA 0.3361245 0.2893457 -0.28468670 0.3247336 -0.18127203 -0.16032655
2: F -0.7071068 0.4875320 0.7715885 1.59862532 0.1700986 1.55068347 1.31594762
3: IER 0.7071068 -0.6631646 -0.5143923 -0.12409420 -0.6030768 0.02512682 -0.01746131
4: LS-c NA -1.3444981 -1.4788780 -1.16064578 -1.2680075 -1.24018782 -1.46198764
5: LS-o NA 1.1840062 0.9323361 -0.02919864 1.3762521 -0.15435044 0.32382788
手工计算方法忽略包含NAs的列:
> dt %>% mutate(normalizedHuman = (Human - mean(Human))/sd(Human)) %>%
+ mutate(normalizedGoogle = (Google - mean(Google))/sd(Google)) %>%
+ mutate(normalizedGoogleCloud = (GoogleCloud - mean(GoogleCloud))/sd(GoogleCloud)) %>%
+ mutate(normalizedIBM = (IBM - mean(IBM))/sd(IBM)) %>%
+ mutate(normalizedMicrosoft = (Microsoft - mean(Microsoft))/sd(Microsoft)) %>%
+ mutate(normalizedSpeechmatics = (Speechmatics - mean(Speechmatics))/sd(Speechmatics)) %>%
+ mutate(normalizedWit_ai = (Wit_ai - mean(Wit_ai))/sd(Wit_ai))
ASR_API Human Google GoogleCloud IBM Microsoft Speechmatics Wit_ai normalizedHuman normalizedGoogle
1 CV NA 23.2 23.3 21.8 29.1 19.1 35.6 NA 0.3361245
2 F 5.8 24.2 26.3 47.6 28.1 38.4 54.2 NA 0.4875320
3 IER 12.7 16.6 18.3 24.0 23.1 21.4 37.4 NA -0.6631646
4 LS-c NA 12.1 12.3 9.8 18.8 7.3 19.2 NA -1.3444981
5 LS-o NA 28.8 27.3 25.3 35.9 19.4 41.7 NA 1.1840062
normalizedGoogleCloud normalizedIBM normalizedMicrosoft normalizedSpeechmatics normalizedWit_ai
1 0.2893457 -0.28468670 0.3247336 -0.18127203 -0.16032655
2 0.7715885 1.59862532 0.1700986 1.55068347 1.31594762
3 -0.5143923 -0.12409420 -0.6030768 0.02512682 -0.01746131
4 -1.4788780 -1.16064578 -1.2680075 -1.24018782 -1.46198764
5 0.9323361 -0.02919864 1.3762521 -0.15435044 0.32382788
(normalizedHuman是一个NAs列表…)
对于计算具体列的选择,可以采用通用的方法,如下所示:
data_vars <- df_full %>% dplyr::select(-ASR_API,-otherVarNotToBeUsed)
meta_vars <- df_full %>% dplyr::select(ASR_API,otherVarNotToBeUsed)
data_varsn <- normalize(data_vars, method = "standardize", range = c(0, 1), margin = 1L, on.constant = "quiet")
dtn <- cbind(meta_vars,data_varsn)
这是三年前的。不过,我还是觉得有必要补充以下几点:
最常见的归一化是z变换,其中减去平均值并除以变量的标准差。结果将是mean=0, sd=1。
为此,你不需要任何包装。
zVar <- (myVar - mean(myVar)) / sd(myVar)
就是这样。