1

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

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.

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

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

Благодарим за помощь!

ответ

1

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

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

каждый из них может быть легко выполнена с использованием scikit-учи (хотя для достижения третий вы будете нуждаться в SciPy для матричного квадратного корня и инверсии)

+0

Привет, спасибо за ваш ответ. Я очень ценю вклад. Я пробовал следующее: я использовал методы здесь, на scikit-learn, чтобы «нормализовать» мой учебный набор и вектор характеристик теста: http://scikit-learn.org/0.11/modules/preprocessing.html. Когда я делаю некоторое тестирование, я обнаружил, что мой вектор функций, который НЕ был нормализован, работает лучше, чем нормализованный. Как вы думаете, что это отражает результаты, которые я нашел? –

+0

Если все сделано правильно (что вы должны дважды проверить, так как это наиболее вероятная причина - ошибка), это будет означать, что ваши диспропорции на самом деле помогают классификатору принимать правильные решения, поэтому это предубеждение, вызванное отсутствием нормализации перемещает границу решения «правильным образом». Короче говоря - нормализация не выполняется, это будет гарантировать лучшие результаты. Это выполняется, потому что мы предполагаем, что мы не знаем априорно, какие функции лучше, а какие хуже. – lejlot

+2

@ T.S .: Возможно, эта функция является сильным предиктором правильного класса, а остальное - просто шумом. Выбор функций может помочь избавиться от ненужных функций. –

1

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

Тогда вот математика для вас. Возьмем линейное ядро ​​как простой пример. Он принимает образец 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 учиться инструменты, чтобы иметь дело с этим жить в sklearn.preprocessing модуле: MinMaxScaler, StandardScaler, Normalizer.

 Смежные вопросы

  • Нет связанных вопросов^_^