почему нормализация значений признаков не сильно меняет результат обучения?

У меня есть 3113 обучающих примеров по плотному вектору признаков размером 78. Величина признаков разная: у некоторых около 20, у некоторых 200 тыс. Например, вот один из обучающих примеров в формате ввода vowpal-wabbit.

0.050000 1 '2006-07-10_00:00:00_0.050000| F0:9.670000 F1:0.130000 F2:0.320000 F3:0.570000 F4:9.837000 F5:9.593000 F6:9.238150 F7:9.646667 F8:9.631333 F9:8.338904 F10:9.748000 F11:10.227667 F12:10.253667 F13:9.800000 F14:0.010000 F15:0.030000 F16:-0.270000 F17:10.015000 F18:9.726000 F19:9.367100 F20:9.800000 F21:9.792667 F22:8.457452 F23:9.972000 F24:10.394833 F25:10.412667 F26:9.600000 F27:0.090000 F28:0.230000 F29:0.370000 F30:9.733000 F31:9.413000 F32:9.095150 F33:9.586667 F34:9.466000 F35:8.216658 F36:9.682000 F37:10.048333 F38:10.072000 F39:9.780000 F40:0.020000 F41:-0.060000 F42:-0.560000 F43:9.898000 F44:9.537500 F45:9.213700 F46:9.740000 F47:9.628000 F48:8.327233 F49:9.924000 F50:10.216333 F51:10.226667 F52:127925000.000000 F53:-15198000.000000 F54:-72286000.000000 F55:-196161000.000000 F56:143342800.000000 F57:148948500.000000 F58:118894335.000000 F59:119027666.666667 F60:181170133.333333 F61:89209167.123288 F62:141400600.000000 F63:241658716.666667 F64:199031688.888889 F65:132549.000000 F66:-16597.000000 F67:-77416.000000 F68:-205999.000000 F69:144690.000000 F70:155022.850000 F71:122618.450000 F72:123340.666667 F73:187013.300000 F74:99751.769863 F75:144013.200000 F76:237918.433333 F77:195173.377778

Результат обучения был не очень хорошим, поэтому я решил нормализовать признаки, чтобы сделать их одинаковой величины. Я рассчитал среднее значение и стандартное отклонение для каждого признака во всех примерах, затем выполнил newValue = (oldValue - mean) / stddev, чтобы их новые mean и stddev были равны 1. Для того же примера вот значения признаков после нормализации:

0.050000 1 '2006-07-10_00:00:00_0.050000| F0:-0.660690 F1:0.226462 F2:0.383638 F3:0.398393 F4:-0.644898 F5:-0.670712 F6:-0.758233 F7:-0.663447 F8:-0.667865 F9:-0.960165 F10:-0.653406 F11:-0.610559 F12:-0.612965 F13:-0.659234 F14:0.027834 F15:0.038049 F16:-0.201668 F17:-0.638971 F18:-0.668556 F19:-0.754856 F20:-0.659535 F21:-0.663001 F22:-0.953793 F23:-0.642736 F24:-0.606725 F25:-0.609946 F26:-0.657141 F27:0.173106 F28:0.310076 F29:0.295814 F30:-0.644357 F31:-0.678860 F32:-0.764422 F33:-0.658869 F34:-0.674367 F35:-0.968679 F36:-0.649145 F37:-0.616868 F38:-0.619564 F39:-0.649498 F40:0.041261 F41:-0.066987 F42:-0.355693 F43:-0.638604 F44:-0.676379 F45:-0.761250 F46:-0.653962 F47:-0.668194 F48:-0.962591 F49:-0.635441 F50:-0.611600 F51:-0.615670 F52:-0.593324 F53:-0.030322 F54:-0.095290 F55:-0.139602 F56:-0.652741 F57:-0.675629 F58:-0.851058 F59:-0.642028 F60:-0.648002 F61:-0.952896 F62:-0.629172 F63:-0.592340 F64:-0.682273 F65:-0.470121 F66:-0.045396 F67:-0.128265 F68:-0.185295 F69:-0.510251 F70:-0.515335 F71:-0.687727 F72:-0.512749 F73:-0.471032 F74:-0.789335 F75:-0.491188 F76:-0.400105 F77:-0.505242

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

Интересно, почему результат не изменился?

Вот мои команды обучения и тестирования:

rm -f cache
cat input.feat | vw -f model --passes 20 --cache_file cache
cat input.feat | vw -i model -t -p predictions --invert_hash readable_model

(Да, я сейчас тестирую обучающие данные, так как у меня очень мало примеров данных для обучения.)


Дополнительный контекст:

Некоторые из функций относятся к «уровню 2» — они были получены путем манипулирования или выполнения перекрестных произведений на функциях «уровня 1» (например, скользящее среднее, производные 1-3 порядка и т. д.). Если я нормализую функции уровня 1 перед вычислением функций уровня 2, это действительно значительно улучшит модель.

Поэтому я озадачен тем, почему нормализация функций уровня 1 (до создания функций уровня 2) очень помогает, а нормализация всех функций (после создания функций уровня 2) совсем не помогает?

Кстати, поскольку я тренирую регрессор, я использую SSE в качестве метрики для оценки качества модели.


person Roy    schedule 24.09.2015    source источник
comment
Вы можете отделить второй вопрос, почему нормализация функций уровня 1 перед созданием уровня 2 очень помогает ... в отдельный вопрос. Причина этого кажется не связанной с vowpal-wabbit. Я не уверен в ответе, но может быть, что такая нормализация на самом деле является обманом (заранее зная, что такое stdev/mean, означает заглянуть в будущее)   -  person arielf - Reinstate Monica    schedule 25.09.2015
comment
Это хорошее понимание, @arielf.   -  person Roy    schedule 25.09.2015


Ответы (2)


vw по умолчанию нормализует значения функций для масштаба.

Это часть онлайн-алгоритма. Это делается постепенно во время выполнения.

На самом деле он делает больше, vw улучшенный алгоритм SGD также сохраняет отдельные скорости обучения (для каждой функции), поэтому скорость обучения более редких функций не уменьшается так быстро, как обычные (--adaptive). Наконец, есть обновление с учетом важности, управляемое третьей опцией (--invariant).

Три отдельных параметра расширения SGD (все они включены по умолчанию):

  • --adaptive
  • --invariant
  • --normalized

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

Всего у вас есть 2^3 = 8 комбинаций опций SGD, которые вы можете использовать.

person arielf - Reinstate Monica    schedule 24.09.2015
comment
Нравится подтверждение того, что vw нормализует функции по умолчанию, и дополнительная информация о других параметрах. - person Roy; 25.09.2015

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

person function    schedule 24.09.2015
comment
Я использую VW, как следует из тега вопроса. Не уверен, что VW нормализует функции перед тренировкой. Но даже если бы это было так, это не объясняет, почему нормализация функций уровня 1 поможет обучению (при условии, что все мои функции уровня 2 являются линейными функциями, примененными к функциям уровня 1). - person Roy; 24.09.2015
comment
Просто чтобы было понятно: vw учится онлайн. Он никогда не просматривает все данные перед обучением. Он учится на примерах один за другим и немного корректирует модель за раз. Следовательно, он не знает значения признаков до начала обучения, поэтому он не может нормализоваться до обучения/обучения. - person arielf - Reinstate Monica; 16.11.2015