--- status: seed type: concept tags: - machine-learning - neural-networks - preprocessing - normalization created: 2026-05-14 updated: 2026-05-14 aliases: - Предобработка данных для нейронных сетей --- # Предобработка данных для нейронных сетей Перед обучением [[Нейронные сети|нейронной сети]] данные необходимо привести к виду, пригодному для входных нейронов. "Сырые" данные приводят к неустойчивому обучению и большой ошибке выхода. После правильной предобработки сеть зачастую обучается быстрее и достигает меньшей ошибки. ## Принцип максимизации энтропии Общий принцип предобработки: **максимизировать энтропию входных и выходных значений**. Если значения переменной сосредоточены в узком диапазоне, информационное содержание каждого примера мало. Если значения равномерно распределены по единичному интервалу — информация максимальна. Значит, кодирование и нормировка должны стремиться к равномерному распределению закодированных примеров. ## Нормировка числовых переменных Все входные и выходные значения необходимо привести к единому масштабу — нейросеть не должна зависеть от единиц измерения. ### Линейная нормировка $$ \tilde{x}_i = \frac{x_i - x_{i,\min}}{x_{i,\max} - x_{i,\min}} $$ Результат лежит в $[0, 1]$. Оптимальна, когда значения плотно заполняют некоторый интервал без резких выбросов. При наличии выбросов весь основной массив данных сожмётся в окрестность нуля. ### Нормировка по статистике $$ \tilde{x}_i = \frac{x_i - \bar{x}_i}{\sigma_i}, \quad \bar{x}_i = \frac{1}{P}\sum_{\alpha=1}^{P}x_i^\alpha, \quad \sigma_i^2 = \frac{1}{P-1}\sum_{\alpha=1}^{P}(x_i^\alpha - \bar{x}_i)^2 $$ Нормированные значения не гарантированно лежат в $[0, 1]$. Если выходные нейроны используют сигмоиду, диапазон выходов ограничен — нужно дополнительно ограничить диапазон нормированных меток. Естественный выход: применить к нормированным данным ту же функцию активации, что и у выходных нейронов: $$ \tilde{x}_i = f\!\left(\frac{x_i - \bar{x}_i}{\sigma_i}\right), \quad f(a) = \frac{1}{1+e^{-a}} $$ ## Кодирование нечисловых переменных Нейронная сеть работает с числами, поэтому нечисловые переменные необходимо закодировать. Два основных типа: - **Ординальные** — упорядоченные категории, которые можно ранжировать: *плохо — хорошо — отлично*. - **Категориальные** — неупорядоченные классы: *красный, синий, зелёный*. ### Ординальные переменные Единичный отрезок $[0, 1]$ разбивается на $n$ частей (по числу классов) пропорционально числу примеров каждого класса в обучающей выборке: $$ \Delta x_k = \frac{P_k}{P} $$ где $P_k$ — число примеров класса $k$, $P$ — общее число примеров. Числовым значением класса становится центр соответствующего отрезка. Такой способ обеспечивает равномерное распределение закодированных значений, то есть максимальную энтропию. ### Категориальные переменные Навязывать несуществующий порядок нельзя — это искажает структуру данных. Используется **двоичное кодирование**: $n$ категорий кодируются $n$ бинарными нейронами. - первая категория: $(1, 0, \dots, 0)$ - вторая категория: $(0, 1, \dots, 0)$ - … - $n$-я категория: $(0, \dots, 0, 1)$ Можно использовать **биполярную кодировку**, заменяя нули на $-1$. При этом расстояния между всеми парами векторов-категорий одинаковы. ## Связанные заметки - [[Нейронные сети]] - [[Обратное распространение ошибки]] - [[Нейронная сеть Кохонена]]