Как нормализовать данные в Python


Часто в статистике и машинном обучении мы нормализуем переменные таким образом, чтобы диапазон значений находился между 0 и 1.

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

Когда переменные измеряются в разных масштабах, они часто не вносят одинакового вклада в анализ. Например, если значения одной переменной находятся в диапазоне от 0 до 100 000, а значения другой переменной — в диапазоне от 0 до 100, переменной с большим диапазоном будет присвоен больший вес при анализе.

Нормируя переменные, мы можем быть уверены, что каждая переменная вносит одинаковый вклад в анализ.

Чтобы нормализовать значения между 0 и 1, мы можем использовать следующую формулу:

x норма = (x i – x мин ) / (x макс – x мин )

куда:

  • x norm : i -е нормализованное значение в наборе данных
  • x i : i -е значение в наборе данных
  • x max : минимальное значение в наборе данных
  • x min : максимальное значение в наборе данных

В следующих примерах показано, как нормализовать одну или несколько переменных в Python.

Пример 1. Нормализация массива NumPy

В следующем коде показано, как нормализовать все значения в массиве NumPy:

import numpy as np 

#create NumPy array
data = np.array([[13, 16, 19, 22, 23, 38, 47, 56, 58, 63, 65, 70, 71]])

#normalize all values in array
data_norm = (data - data. min ())/ (data. max () - data. min ())

#view normalized values
data_norm

array([[0. , 0.05172414, 0.10344828, 0.15517241, 0.17241379,
 0.43103448, 0.5862069 , 0.74137931, 0.77586207, 0.86206897,
 0.89655172, 0.98275862, 1. ]])

Каждое из значений в нормализованном массиве теперь находится между 0 и 1.

Пример 2: нормализовать все переменные в Pandas DataFrame

Следующий код показывает, как нормализовать все переменные в кадре данных pandas:

import pandas as pd

#create DataFrame
df = pd.DataFrame({'points': [25, 12, 15, 14, 19, 23, 25, 29],
 'assists': [5, 7, 7, 9, 12, 9, 9, 4],
 'rebounds': [11, 8, 10, 6, 6, 5, 9, 12]})

#normalize values in every column
df_norm = (df-df.min ())/ (df.max () - df.min ())

#view normalized DataFrame
df_norm

 points assists rebounds
0 0.764706 0.125 0.857143
1 0.000000 0.375 0.428571
2 0.176471 0.375 0.714286
3 0.117647 0.625 0.142857
4 0.411765 1.000 0.142857
5 0.647059 0.625 0.000000
6 0.764706 0.625 0.571429
7 1.000000 0.000 1.000000

Каждое из значений в каждом столбце теперь находится в диапазоне от 0 до 1.

Пример 3: нормализовать определенные переменные в Pandas DataFrame

В следующем коде показано, как нормализовать определенные переменные в кадре данных pandas:

import pandas as pd

#create DataFrame
df = pd.DataFrame({'points': [25, 12, 15, 14, 19, 23, 25, 29],
 'assists': [5, 7, 7, 9, 12, 9, 9, 4],
 'rebounds': [11, 8, 10, 6, 6, 5, 9, 12]})

define columns to normalize
x = df.iloc [:,0:2]

#normalize values in first two columns only 
df.iloc [:,0:2] = (x-x. min ())/ (x. max () - x. min ())

#view normalized DataFrame 
df

 points assists rebounds
0 0.764706 0.125 11
1 0.000000 0.375 8
2 0.176471 0.375 10
3 0.117647 0.625 6
4 0.411765 1.000 6
5 0.647059 0.625 5
6 0.764706 0.625 9
7 1.000000 0.000 12

Обратите внимание, что нормализуются только значения в первых двух столбцах.

Дополнительные ресурсы

В следующих руководствах представлена дополнительная информация о нормализации данных:

Как нормализовать данные между 0 и 1
Как нормализовать данные от 0 до 100
Стандартизация и нормализация: в чем разница?