0

我正在与 R 一起解决多分类问题。我想用e1071. 如何为多类分类进行缩放?在这个页面上,他们说

“一个逻辑向量,指示要缩放的变量。如果 scale 的长度为 1,则该值将根据需要循环多次。默认情况下,数据在内部(x 和 y 变量)被缩放到零均值和单位方差。返回中心值和比例值并用于以后的预测。”</p>

我想知道 y 是如何缩放的。当我们有 m 个类时,我们有 m 个 y 列,它们具有不同的均值和方差。所以在缩放 y 之后,我们在同一类的每一列中都有不同的数字!这对我来说没有意义。

您能否让我知道缩放发生了什么?我很想知道这一点。

我也想知道这是什么意思:

“如果 scale 的长度为 1,则该值会根据需要循环多次。”

4

1 回答 1

0

让我们看一下参数的一些信息scale

指示要缩放的变量的逻辑向量。如果 scale 的长度为 1,则该值将根据需要循环多次。默认情况下,数据在内部(x 和 y 变量)被缩放到零均值和单位方差。

此处预期的值是一个逻辑向量(因此是TRUE和的向量FALSE)。如果此向量的值与矩阵中的列数一样多,则根据您的向量对列进行缩放或不缩放(例如,如果您svm(..., scale = c(TRUE, FALSE, TRUE), ...)的第一列和第三列被缩放,而第二列则没有)。

上面引用的第三句话解释了缩放期间发生的情况:“数据被缩放 [...] 到零均值和单位方差”。去做这个:

  1. 您用该列的平均值减去该列的每个值(这称为居中),并且
  2. 然后将此列的每个值除以列标准偏差(这是实际缩放比例)。

您可以使用以下示例重现缩放:

# create a data.frame with four variables
# as you can see the difference between each term of aa and bb is one
# and the difference between each term of cc is 21.63 while dd is random
(df <- data.frame(aa = 11:15,
                  bb = 1:5,
                  cc = 1:5*21.63,
                  dd = rnorm(5,12,4.2)))

# then we substract the mean of each column to this colum and
# put everything back together to a data.frame
(df1 <- as.data.frame(sapply(df, function(x) {x-mean(x)})))
# you can observe that now the mean value of each column is 0 and
# that aa==bb because the difference between each term was the same

# now we divide each column by its standard deviation
(df1 <- as.data.frame(sapply(df1, function(x) {x/sd(x)})))
# as you can see, the first three columns are now equal because the
# only difference between them was that cc == 21.63*bb

# the data frame df1 is now identical to what you would obtain by
# using the default scaling function `scale`
(df2 <- scale(df))

当您的列代表不同比例的数据时,缩放是必要的。例如,如果您想区分肥胖者和瘦者,您可以收集他们的体重、身高和腰臀比。体重可能在 50 到 95 公斤之间,而身高在 175 厘米(± 20 厘米)左右,腰臀比在 0.60 到 0.95 之间。所有这些测量都在不同的尺度上,因此很难比较它们。缩放变量可以解决这个问题。此外,如果一个变量达到高数值而其他变量没有,则在多变量算法中,该变量可能会被赋予更多的重要性。因此,在大多数情况下,建议对此类方法进行缩放。

缩放确实会影响每个变量的均值和方差,但由于它平等地应用于每一行(可能属于不同的类),这不是问题。

于 2019-08-11T16:09:33.377 回答