Подтвердить что ты не робот

Правая функция для нормализации ввода SVM

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

Я тренирую линейный SVM поверх набора функций - Свернутые функции нейронной сети, возникающие в результате изображений. Я имею, например, матрицу 3500x4096 X с примерами по строкам и функциям на столбцах, как обычно.

Мне интересно, как правильно стандартизировать/нормализовать эту матрицу перед подачей SVM. Я вижу два пути (используя sklearn):

  • Стандартизация функций. Это приводит к функциям с 0 средним и унитарным std.

    X = sklearn.preprocessing.scale(X)
    
  • Нормализующие функции. Это приводит к особенностям с унитарной нормой.

    X = sklearn.preprocessing.normalize(X, axis=0)
    

Мои результаты значительно лучше с нормализацией (точность 76%), чем при стандартизации (точность 68%).

Является ли это полностью зависимым от набора данных выбором? Или как выбрать один из двух методов?

4b9b3361

Ответ 1

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

StandardScaler
Это то, что использует sklearn.preprocessing.scale(X). Предполагается, что ваши функции обычно распределяются (каждая функция имеет другое среднее и стандартное отклонение) и масштабирует их так, что каждая функция распределения Гаусса теперь сосредоточена вокруг 0, и стандартное отклонение равно 1.

Он делает это, вычисляя среднее значение и stdev для каждой функции, а затем преобразует каждое фактическое значение для функции в z-score: сколько stdevs от это значение? г = (значение-среднее)/STDEV

Это довольно часто работает хорошо, но если предположение о нормальности совершенно неверно для вашего случая, то это может быть не лучшая схема масштабирования для вас. Практически во многих случаях, когда предположение о нормальности не но распределения немного близки, эта схема все еще работает очень хорошо. Однако, если данные полностью далеки от нормальности, например, сильно искаженные распределения жира (например, степенной закон), эта схема не даст хороших результатов.

Normalizer
Это то, что использует sklearn.preprocessing.normalize(X, axis=0). Он рассматривает все значения признаков для данной точки данных как вектор и нормализует этот вектор, деля его на величину. Например, скажем, у вас есть 3 функции. Значения для конкретной точки [x1, x2, x3]. Если вы используете стандартную настройку 'l2', вы делите каждое значение на sqrt(x1^2 + x2^2 + x3^2). Если вы используете нормализацию 'l1', вы делите каждый на x1+x2+x3. Это гарантирует, что значения находятся в одинаковых диапазонах для каждой функции, поскольку каждый вектор функции является единичным вектором. Если значения функции для точки большие, то и величина, и вы делите на большое количество. Если они малы, вы делите их на небольшое число.

Мы полагаем, что ваши данные можно рассматривать как точки в n-мерном пространстве, где n - количество функций. Каждая особенность - ось. Нормализация тянет каждую точку назад к началу координат так, что она всего на единицу удалена от начала координат. В основном вы разрушаете пространство в единичном гиперкубе. Углы между векторами для каждой точки (от начала координат до точки данных) остаются неизменными.

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

Если сохранение отношения косинусного расстояния между точками - это то, что имеет больший смысл для ваших данных, или если нормализация соответствует естественному масштабированию (например, частота, а не счет), то это более подходит.

MinMaxScaler
Вы можете использовать его как sklearn.preprocessing.MinMaxScaler().fit_transform(X). Для каждой функции это смотрит на минимальное и максимальное значение. Это диапазон этой функции. Затем он сжимается или растягивает его до одного и того же диапазона для каждой функции (по умолчанию от 0 до 1).

Это делается путем преобразования каждого значения в (value-feature_min)/(feature_max - feature_min). В основном, в каком проценте диапазона я лгу? Помните, что диапазон определяется только min и max для функции. Для всех этих забот все значения могут находиться около 10, 11 или около того, и есть один выброс, который равен 900. Не имеет значения, ваш диапазон составляет от 10 до 900. Вы можете видеть, что в некоторых случаях это желательно и в других это будет проблематично, в зависимости от конкретной проблемы и данных.

Эта схема работает намного лучше в некоторых случаях, когда StandardScaler может работать не так хорошо. Например, , если стандартные отклонения очень малы для функций, StandardScaler очень чувствителен к крошечным изменениям между стандартными отклонениями различных функций, но MinMaxScaler очень надежный. Кроме того, для функций с сильно искаженными дистрибутивами или в редких случаях, когда каждая функция имеет много нулей, которые перемещают дистрибутив от гаусса, MinMaxScaler - лучший выбор.