Может ли очень большое (или очень маленькое) значение в векторе признаков с использованием результатов смещения SVC? [научное обучение]

Я пытаюсь лучше понять, как значения моего вектора признаков могут повлиять на результат. Например, предположим, что у меня есть следующий вектор с конечным значением, являющимся результатом (например, это проблема классификации с использованием SVC):

0.713, -0.076, -0.921, 0.498, 2.526, 0.573, -1.117, 1.682, -1.918, 0.251, 0.376, 0.025291666666667, -200, 9, 1

Вы заметите, что большинство значений сосредоточено вокруг 0, однако есть одно значение, которое на несколько порядков меньше, -200.

Я обеспокоен тем, что это значение искажает прогноз и имеет несправедливо больший вес, чем остальные, просто потому, что значение сильно отличается.

Следует ли об этом беспокоиться при создании вектора признаков? Или статистический тест, который я использую для оценки моего векторного контроля для этого большого (или малого) значения, будет основан на обучающем наборе, который я ему предоставлю? Существуют ли в научном наборе специальные методы, которые вы бы порекомендовали для нормализации вектора?

Спасибо за помощь!


person T.S.    schedule 04.10.2013    source источник


Ответы (2)


Да, это то, о чем вы должны беспокоиться. На SVM сильно влияют любые отклонения масштаба признаков, поэтому вам нужен метод предварительной обработки, чтобы сделать его менее вероятным, из самых популярных:

  1. Линейное масштабирование каждого измерения объекта до интервала [0,1] или [-1,1].
  2. Нормализуйте каждое измерение функции, чтобы оно имело среднее значение = 0 и дисперсию = 1.
  3. Декоррелируйте значения преобразованием sigma^(-1/2)*X, где sigma = cov(X) (матрица ковариации данных)

каждый может быть легко выполнен с помощью scikit-learn (хотя для достижения третьего вам понадобится scipy для матричного квадратного корня и инверсии)

person lejlot    schedule 04.10.2013
comment
Привет, спасибо за ваш ответ. Я очень ценю ваш вклад. Я попробовал следующее: я использовал методы здесь, в scikit-learn, чтобы нормализовать свой обучающий набор и вектор тестовых функций: scikit-learn.org/0.11/modules/preprocessing.html. Когда я провожу некоторое тестирование, я обнаруживаю, что мой вектор признаков, который НЕ был нормализован, работает лучше, чем нормализованный. Как вы думаете, что это говорит о результатах, которые я нашел? - person T.S.; 05.10.2013
comment
Если все было сделано правильно (что вам следует перепроверить, так как это наиболее вероятная причина является ошибкой), это будет означать, что ваши диспропорции на самом деле помогают классификатору в принятии правильных решений - так что это смещение, вызванное отсутствием нормализации, правильное перемещение границы решения. Короче говоря - нормализация не производится, потому что это гарантирует лучшие результаты. Это выполняется потому, что мы предполагаем, что априори не знаем, какие функции лучше, а какие хуже. - person lejlot; 05.10.2013
comment
@TS: может быть, эта функция является сильным предиктором правильного класса, а все остальное - просто шум. Выбор функций может помочь отсеять бесполезные функции. - person Fred Foo; 05.10.2013

Я пытаюсь лучше понять, как значения моего вектора признаков могут повлиять на результат.

Тогда вот вам математика. Возьмем линейное ядро ​​в качестве простого примера. Он берет образец x и опорный вектор sv и вычисляет скалярное произведение между ними. Наивная реализация Python точечного продукта была бы

def dot(x, sv):
    return sum(x_i * sv_i for x_i, sv_i in zip(x, sv))

Теперь, если один из признаков имеет гораздо более экстремальный диапазон, чем все остальные (либо в x, либо в sv, или, что еще хуже, в обоих), то член, соответствующий этому признаку, будет доминировать в сумме.

Аналогичная ситуация возникает с полиномиальным и RBF-ядрами. Поли-ядро — это просто (сдвинутая) степень линейного ядра:

def poly_kernel(x, sv, d, gamma):
    return (dot(x, sv) + gamma) ** d

а ядро ​​RBF представляет собой квадрат расстояния между x и sv, умноженный на константу:

def rbf_kernel(x, sv, gamma):
    diff = [x_i - sv_i for x_i, sv_i in zip(x, sv)]
    return gamma * dot(diff, diff)

В каждом из этих случаев, если один признак имеет экстремальный диапазон, он будет доминировать в результате, а другие признаки будут эффективно игнорироваться, кроме как для разрыва связей.

Инструменты scikit-learn для решения этой проблемы представлены в sklearn.preprocessing модуль: MinMaxScaler, StandardScaler, Normalizer.

person Fred Foo    schedule 05.10.2013