Масштабирование данных тестирования для LIBSVM: реализация MATLAB
В настоящее время я использую версию MATLAB для векторной машины LIBSVM для классификации моих данных. В документации LIBSVM упоминается, что масштабирование перед применением SVM очень важно, и мы должны использовать тот же метод для масштабирования как данных обучения, так и тестирования.
"Тот же метод масштабирования" объясняется следующим образом:
Например, предположим, что мы масштабировали первый атрибут данных обучения от [-10, +10]
до [-1, +1]
. Если первый атрибут данных тестирования находится в диапазоне [-11, +8]
, мы должны масштабировать данные тестирования до [-1.1, +0.8]
Масштабирование обучающих данных в диапазоне [0,1]
может быть выполнено с использованием следующего кода MATLAB:
(data - repmat(min(data,[],1),size(data,1),1))*spdiags(1./(max(data,[],1)-min(data,[],1))',0,size(data,2),size(data,2))
Но я не знаю, как правильно масштабировать данные тестирования.
Большое спасибо за вашу помощь.
Ответы
Ответ 1
Код, который вы даете, по существу, вычитает минимум и затем делит на диапазон.
Вам необходимо сохранить минимальный и диапазон возможностей обучающих данных.
minimums = min(data, [], 1);
ranges = max(data, [], 1) - minimums;
data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1);
test_data = (test_data - repmat(minimums, size(test_data, 1), 1)) ./ repmat(ranges, size(test_data, 1), 1);
Ответ 2
Код Richante, к сожалению, неверен, если есть столбцы, для которых все наблюдения имеют одинаковое значение (что может случиться, если данные разрежены). Пример:
>> data = [1 2 3; 5 2 8; 7 2 100]
data =
1 2 3
5 2 8
7 2 100
>> test_data = [1 2 3; 4 5 6; 7 8 9];
>> minimums = min(data,[],1);
>> ranges = max(data, [], 1) - minimums;
>> data = (data - repmat(minimums, size(data, 1), 1)) ./ repmat(ranges, size(data, 1), 1);
>> data
data =
0 NaN 0
0.6667 NaN 0.0515
1.0000 NaN 1.0000
Итак, вы должны проверить, есть ли столбцы, которые имеют только одно значение. Но что, если во всем наборе тренировок есть только одно значение, но в тестовом наборе есть несколько значений? И что мы делаем в сценарии Leave-one-out, в котором есть только одно наблюдение в тестовом наборе, тогда, если все значения в столбце обучающего набора равны 0, а соответствующее значение в тестовом наборе равно 100? Это действительно дегенеративные случаи, но это может произойти. Однако, когда я проверил файл svm_scale.c в библиотеке Libsvm, я заметил эту часть:
void output(int index, double value)
{
/* skip single-valued attribute */
if(feature_max[index] == feature_min[index])
return;
if(value == feature_min[index])
value = lower;
else if(value == feature_max[index])
value = upper;
else
value = lower + (upper-lower) *
(value-feature_min[index])/
(feature_max[index]-feature_min[index]);
if(value != 0)
{
printf("%d:%g ",index, value);
new_num_nonzeros++;
}
}
Итак, мы должны игнорировать эти случаи? Я действительно не знаю. Как я уже сказал, я не авторитет в этом вопросе, поэтому я буду ждать другого ответа, предпочтительно от самих авторов Libsvm, чтобы прояснить ситуацию.....