Как выполняется масштабирование в мультиклассификации SVM?
Я работаю с R для решения проблемы множественной классификации. Я хочу использовать e1071
, Как выполняется масштабирование для мультиклассовой классификации? На этой странице они говорят, что
"Логический вектор, указывающий на переменные, которые нужно масштабировать. Если масштаб имеет длину 1, значение используется повторно столько раз, сколько необходимо. По умолчанию данные масштабируются внутренне (переменные x и y) до нулевого среднего и единичной дисперсии. Значения центра и масштаба возвращаются и используются для последующих прогнозов ".
Мне интересно, как у масштабируется. Когда у нас есть m классов, у нас есть m столбцов для y, которые имеют разные средние значения и различия. Таким образом, после масштабирования y у нас будет разное число в каждом столбце для одного и того же класса! И это не имеет смысла для меня.
Не могли бы вы дать мне знать, что происходит в масштабировании? Мне так любопытно узнать это.
Также мне интересно, что это значит:
"Если масштаб имеет длину 1, значение используется повторно столько раз, сколько необходимо".
1 ответ
Давайте посмотрим на некоторую информацию для аргумента scale
:
Логический вектор, указывающий на переменные, которые должны быть масштабированы. Если масштаб имеет длину 1, значение используется повторно столько раз, сколько необходимо. По умолчанию данные масштабируются внутренне (переменные x и y) до нулевого среднего и единичной дисперсии.
Ожидаемое здесь значение является логическим вектором (поэтому вектор TRUE
а также FALSE
). Если этот вектор имеет столько же значений, сколько столбцов в вашей матрице, то столбцы масштабируются или не соответствуют вашему вектору (например, если у вас есть svm(..., scale = c(TRUE, FALSE, TRUE), ...)
первый и третий столбцы масштабируются, а второй нет).
То, что происходит во время масштабирования, объясняется в третьем предложении, приведенном выше: "данные масштабируются [...] до нулевого среднего и единичной дисперсии". Сделать это:
- вы вычитаете каждое значение столбца с помощью этого столбца (это называется центрированием), и
- затем вы делите каждое значение этого столбца на стандартное отклонение столбцов (это фактическое масштабирование).
Вы можете воспроизвести масштабирование с помощью следующего примера:
# 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. Все эти измерения находятся в разных масштабах, поэтому их трудно сравнивать. Масштабирование переменных решает эту проблему. Более того, если одна переменная достигает высоких числовых значений, а другие - нет, этой переменной, скорее всего, будет придаваться большее значение в многомерных алгоритмах. Поэтому масштабирование рекомендуется в большинстве случаев для таких методов.
Масштабирование влияет на среднее значение и дисперсию каждой переменной, но, поскольку оно применяется в равной степени к каждой строке (потенциально принадлежащей различным классам), это не проблема.