Sklearn.preprocessing.StandardScaler: примеры (PYTHON)

Масштабирование данных с помощью StandardScaler в Python
Раздел: Машинное обучение, Предобработка
sklearn.preprocessing.StandardScaler(copy: bool=True, with_mean: bool=True, with_std: bool=True): sklearn.preprocessing.StandardScaler

Общая информация о StandardScaler

Функция StandardScaler из модуля sklearn.preprocessing выполняет стандартизацию данных путем удаления среднего значения и масштабирования до единичной дисперсии. Этот метод часто применяется как этап предобработки данных для многих алгоритмов машинного обучения, особенно чувствительных к масштабу признаков, таких как линейные модели, методы на основе расстояний и нейронные сети.

Стандартизация преобразует данные так, чтобы они имели нулевое среднее и единичное стандартное отклонение. Вычисляется по формуле: z = (x - u) / s, где x - исходное значение, u - среднее значение признака, s - стандартное отклонение.

Параметры класса StandardScaler:

  • copy (bool, по умолчанию True) - создает копию входных данных или работает с исходным массивом.
  • with_mean (bool, по умолчанию True) - центрирование данных путем вычитания среднего значения.
  • with_std (bool, по умолчанию True) - масштабирование данных до единичной дисперсии.

Основные методы и возвращаемые значения:

  • fit(X[, y]) - вычисляет среднее и стандартное отклонение для последующего масштабирования.
  • fit_transform(X[, y]) - вычисляет параметры и сразу преобразует данные.
  • transform(X) - применяет стандартизацию к новым данным.
  • inverse_transform(X) - преобразует масштабированные данные обратно в исходный формат.
  • get_feature_names_out([input_features]) - возвращает имена выходных признаков.
  • Атрибуты: mean_, var_, scale_, n_features_in_, feature_names_in_.

Базовые примеры использования

Простой пример стандартизации числового массива:

from sklearn.preprocessing import StandardScaler
import numpy as np

data = np.array([[1.0, 2.0], [3.0, 4.0], [5.0, 6.0]])
scaler = StandardScaler()
transformed = scaler.fit_transform(data)
print('Исходные данные:')
print(data)
print('\nСреднее значение:')
print(scaler.mean_)
print('\nМасштаб:')
print(scaler.scale_)
print('\nПреобразованные данные:')
print(transformed)
Исходные данные:
[[1. 2.]
 [3. 4.]
 [5. 6.]]

Среднее значение:
[3. 4.]

Масштаб:
[1.63299316 1.63299316]

Преобразованные данные:
[[-1.22474487 -1.22474487]
 [ 0.          0.        ]
 [ 1.22474487  1.22474487]]

Пример с отключением центрирования:

scaler_no_mean = StandardScaler(with_mean=False)
data = [[1, 2], [3, 4], [5, 6]]
transformed = scaler_no_mean.fit_transform(data)
print('Без центрирования:')
print(transformed)
Без центрирования:
[[0.26726124 0.53452248]
 [0.80178373 1.06904497]
 [1.33630621 1.60356745]]

Обратное преобразование данных:

original = scaler.inverse_transform(transformed)
print('Восстановленные данные:')
print(original)
Восстановленные данные:
[[1. 2.]
 [3. 4.]
 [5. 6.]]

Альтернативные методы масштабирования в Python

Библиотека scikit-learn предлагает несколько альтернативных методов предобработки числовых данных:

  • MinMaxScaler - масштабирует данные до заданного диапазона (по умолчанию [0, 1]). Подходит, когда важно сохранить нулевые значения или когда распределение не нормальное.
  • RobustScaler - использует медиану и межквартильный размах, устойчив к выбросам. Применяется при наличии аномальных значений в данных.
  • MaxAbsScaler - масштабирует данные по максимальному абсолютному значению, сохраняя разреженность данных. Работает в диапазоне [-1, 1].
  • Normalizer - нормализует каждую строку данных отдельно до единичной нормы. Используется в текстовых данных или когда важен относительный вклад признаков.

Выбор метода зависит от распределения данных, наличия выбросов и требований алгоритма машинного обучения.

Реализации в других языках программирования

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

JavaScript (использование библиотеки ml.js):

const { StandardScaler } = require('ml-preprocessing');
const scaler = new StandardScaler();
const data = [[1, 2], [3, 4], [5, 6]];
const transformed = scaler.fitTransform(data);
console.log(transformed);
[[-1.2247, -1.2247], [0, 0], [1.2247, 1.2247]]

R (встроенные функции):

data <- matrix(c(1, 2, 3, 4, 5, 6), ncol=2, byrow=TRUE)
scaled_data <- scale(data)
print(scaled_data)
     [,1] [,2]
[1,] -1.2247 -1.2247
[2,]  0.0000  0.0000
[3,]  1.2247  1.2247

Java (библиотека Smile):

import smile.preprocessing.Standardizer;
double[][] data = {{1, 2}, {3, 4}, {5, 6}};
Standardizer scaler = Standardizer.fit(data);
double[][] transformed = scaler.apply(data);

Основные отличия от реализации в Python: различные названия методов, поддержка типов данных, возможность потоковой обработки и интеграция с экосистемой языка.

Типичные ошибки применения

1. Попытка преобразования данных с разным количеством признаков:

scaler = StandardScaler()
train_data = [[1, 2, 3], [4, 5, 6]]
scaler.fit(train_data)
test_data = [[7, 8]]  # Только 2 признака
try:
    scaler.transform(test_data)
except ValueError as e:
    print(f'Ошибка: {e}')
Ошибка: X has 2 features, but StandardScaler is expecting 3 features as input.

2. Преобразование разреженных матриц без указания параметра with_mean:

from scipy import sparse
scaler = StandardScaler()
sparse_data = sparse.csr_matrix([[1, 0, 3], [0, 5, 0]])
try:
    scaler.fit(sparse_data)
except TypeError as e:
    print(f'Ошибка: {e}')
Ошибка: Cannot center sparse matrices: pass `with_mean=False` instead.

3. Использование масштабировщика на данных с константными признаками:

data = [[1, 5], [1, 6], [1, 7]]  # Первый признак постоянный
scaler = StandardScaler()
transformed = scaler.fit_transform(data)
print('Масштаб для постоянного признака:', scaler.scale_)
Масштаб для постоянного признака: [0. 1.]

История изменений функции

В версии scikit-learn 1.0 были добавлены следующие изменения:

  • Появилась поддержка имен признаков через параметр feature_names_in_.
  • Добавлен метод get_feature_names_out для согласованного получения имен преобразованных признаков.
  • Улучшена обработка разреженных матриц и предупреждения о константных признаках.

В версии 0.24 были улучшены производительность и стабильность вычислений для больших наборов данных. Добавлена более точная обработка числовых погрешностей.

Расширенные сценарии использования

Стандартизация в конвейере обработки данных:

Пример python
from sklearn.pipeline import Pipeline
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
from sklearn.datasets import make_classification

X, y = make_classification(n_samples=100, n_features=5, random_state=42)
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2)

pipeline = Pipeline([
    ('scaler', StandardScaler()),
    ('classifier', LogisticRegression())
])
pipeline.fit(X_train, y_train)
score = pipeline.score(X_test, y_test)
print(f'Точность модели: {score:.3f}')
Точность модели: 0.900

Обработка отдельных столбцов с ColumnTransformer:

Пример python
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import OneHotEncoder
import pandas as pd

df = pd.DataFrame({
    'число1': [1, 2, 3, 4, 5],
    'число2': [10, 20, 30, 40, 50],
    'категория': ['A', 'B', 'A', 'C', 'B']
})

preprocessor = ColumnTransformer([
    ('num', StandardScaler(), ['число1', 'число2']),
    ('cat', OneHotEncoder(), ['категория'])
])

transformed = preprocessor.fit_transform(df)
print(f'Размерность после преобразования: {transformed.shape}')
Размерность после преобразования: (5, 6)

Инкрементальное обучение с partial_fit:

Пример python
scaler = StandardScaler()
chunks = [np.array([[1, 2], [3, 4]]), np.array([[5, 6], [7, 8]])]
for chunk in chunks:
    scaler.partial_fit(chunk)

print('Среднее после обработки чанков:', scaler.mean_)
print('Масштаб после обработки чанков:', scaler.scale_)
Среднее после обработки чанков: [4. 5.]
Масштаб после обработки чанков: [2.23606798 2.23606798]

Работа с разреженными данными:

Пример python
from scipy import sparse
sparse_matrix = sparse.csr_matrix([[0, 1, 0], [2, 0, 3], [0, 0, 4]])
scaler = StandardScaler(with_mean=False)
scaled_sparse = scaler.fit_transform(sparse_matrix)
print('Разреженная матрица после масштабирования:')
print(scaled_sparse.toarray())
Разреженная матрица после масштабирования:
[[0.         1.41421356 0.        ]
 [2.82842712 0.         2.12132034]
 [0.         0.         2.82842712]]

питон sklearn.preprocessing.StandardScaler function comments

En
Sklearn.preprocessing.StandardScaler Standardize features by removing the mean and scaling to unit variance