Опубликован: 25.12.2006 | Доступ: свободный | Студентов: 1832 / 361 | Оценка: 4.43 / 4.13 | Длительность: 15:29:00
Специальности: Программист, Экономист
Лекция 7:

Предобработка данных

Кодирование ординальных переменных

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

В соответствии с изложенным выше общим принципом, мы должны стремиться к тому, чтобы максимизировать энтропию закодированных данных. При использовании сигмоидных функций активации все выходные значения лежат в конечном интервале - обычно [0,1] или [-1,1]. Из всех статистических функций распределения, определенных на конечном интервале, максимальной энтропией обладает равномерное распределение.

Применительно к данному случаю это подразумевает, что кодирование переменных числовыми значениями должно приводить, по возможности, к равномерному заполнению единичного интервала закодированными примерами. (Захватывая заодно и этап нормировки.) При таком способе "оцифровки" все примеры будут нести примерно одинаковую информационную нагрузку.

Исходя из этих соображений, можно предложить следующий практический рецепт кодирования ординальных переменных. Единичный отрезок разбивается на отрезков - по числу классов - с длинами пропорциональными числу примеров каждого класса в обучающей выборке: \Delta x_k=P_k/P, где P_k - число примеров класса k, а P, как обычно, общее число примеров. Центр каждого такого отрезка будет являться численным значением для соответствующего ординального класса (см. рисунок 7.1).

Иллюстрация способа кодирования кардинальных переменных с учетом количества примеров каждой категории

Рис. 7.1. Иллюстрация способа кодирования кардинальных переменных с учетом количества примеров каждой категории

Кодирование категориальных переменных

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

Наиболее естественной выглядит и чаще всего используется на практике двоичное кодирование типа n\rightarrow n, когда имена n категорий кодируются значениями n бинарных нейронов, причем первая категория кодируется как (1,0,0,\ldots, 0), вторая, соответственно - (0,1,0,\ldots, 0) и т.д. вплоть до n -ной: (0,0,0,\ldots, 1). (Можно использовать биполярную кодировку, в которой нули заменяются на -1 ). Легко убедиться, что в такой симметричной кодировке расстояния между всеми векторами-категориями равны.

Такое кодирование, однако, неоптимально в случае, когда классы представлены существенно различающимся числом примеров. В этом случае, функция распределения значений переменной крайне неоднородна, что существенно снижает информативность этой переменной. Тогда имеет смысл использовать более компактный, но симметричный код n\rightarrow m, когда имена n классов кодируются m -битным двоичным кодом. Причем, в новой кодировке активность кодирующих нейронов должна быть равномерна: иметь приблизительно одинаковое среднее по примерам значение активации. Это гарантирует одинаковую значимость весов, соответствующих различным нейронам.

В качестве примера рассмотрим ситуацию, когда один из четырех классов (например, класс c_1 ) некой категориальной переменной представлен гораздо большим числом примеров, чем остальные: P_1\gg P_2 \sim P_3 \sim P_4. Простое кодирование n\rightarrow n привело бы к тому, что первый нейрон активировался бы гораздо чаще остальных. Соответственно, веса оставшихся нейронов имели бы меньше возможностей для обучения. Этой ситуации можно избежать, закодировав четыре класса двумя бинарными нейронами следующим образом: c_1=(0,0), c_2=(1,0), c_3=(0,1), c_4=(1,1), обеспечивающим равномерную "загрузку" кодирующих нейронов.

Отличие между входными и выходными переменными

В заключении данного раздела отметим одно существенное отличие способов кодирования входных и выходных переменных, вытекающее из определения градиента ошибки: \frac{\partial E}{\partial w_{ij}^{[n]}}=\delta_i^{[n]}x_j^{[n]}. А именно, входы участвуют в обучении непосредственно, тогда как выходы - лишь опосредованно - через ошибку верхнего слоя. Поэтому при кодировании категорий в качестве выходных нейронов можно использовать как логистическую функцию активации f(\alpha)=1/(e^{-\alpha}+1), определенную на отрезке [0,1], так и ее антисимметричный аналог для отрезка [-1,1], например: f(a)=tanh(a). При этом кодировка выходных переменных из обучающей выборки будет либо \{0,1\}, либо \{-1,1\}. Выбор того или иного варианта никак не скажется на обучении.

В случае со входными переменными дело обстоит по-другому: обучение весов нижнего слоя сети определяется непосредственно значениями входов: на них умножаются невязки, зависящие от выходов. Между тем, если с точки зрения операции умножения значения \pm 1 равноправны, между 0 и 1 имеется существенная асимметрия: нулевые значения не дают никакого вклада в градиент ошибки. Таким образом, выбор схемы кодирования входов влияет на процесс обучения. В силу логической равноправности обоих значений входов, более предпочтительной выглядит симметричная кодировка: \{-1,1\}, сохраняющая это равноправие в процессе обучения.