Предварительная обработка данных в Sklearn

Предварительная обработка данных — критически важный этап в проектах машинного обучения; она напрямую влияет на эффективность обучения модели и её итоговую производительность.

При построении моделей машинного обучения предварительная обработка данных является ключевым этапом; она помогает очищать и преобразовывать исходные данные, чтобы обеспечить наилучший вход для моделей машинного обучения.

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

Подходящая предварительная обработка не только повышает точность модели, но и помогает модели лучше обобщать.


1. Обработка пропущенных значений

Пропущенные значения означают отсутствие значений для некоторых признаков в наборе данных.

Алгоритмы машинного обучения обычно не могут напрямую обрабатывать пропущенные значения, поэтому нам нужно их обработать.

Проверка пропущенных значений

Сначала проверьте, содержит ли набор данных пропущенные значения.

Обычно мы можем использовать pandas для проверки пропущенных значений в наборе данных:

Пример

import pandas as pd

# Предположим, у нас есть DataFrame df
print(df.isnull().sum())  # Просмотреть количество пропущенных значений в каждом столбце

Заполнение пропущенных значений

Наиболее распространённый метод обработки пропущенных значений — импутация (заполнение).

Общие стратегии импутации включают:

  • Импутация средним: Подходит для числовых данных.
  • Импутация медианой: Для наборов данных с выбросами использование медианы может быть более эффективным.
  • Импутация модой (наиболее частым значением): Подходит для категориальных данных.

В scikit-learn SimpleImputer позволяет легко реализовать импутацию пропущенных значений:

Пример

from sklearn.impute import SimpleImputer

# Для числовых данных используйте импутацию средним
imputer = SimpleImputer(strategy='mean')  # Варианты: 'mean', 'median', 'most_frequent'
df_imputed = imputer.fit_transform(df)  # Заполнить пропущенные значения

Удаление пропущенных значений

Если количество пропущенных значений невелико и их удаление существенно не влияет на результаты анализа, ещё один вариант — напрямую удалить пропущенные значения.

df_cleaned = df.dropna()  # 删除包含缺失值的行
Подробнее см.:Очистка данных в Pandas

2. Масштабирование данных

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

Распространённые методы масштабирования включают:

  • Стандартизация: преобразование данных так, чтобы среднее было равно 0, а стандартное отклонение — 1. Подходит для большинства алгоритмов машинного обучения.
  • Нормализация: масштабирование данных к заданному диапазону (обычно [0, 1]).

Стандартизация

Стандартизацию можно реализовать с помощью StandardScaler, который преобразует каждый признак так, чтобы среднее было нулевым, а дисперсия — единичной:

Пример

from sklearn.preprocessing import StandardScaler

scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)  # Стандартизировать X

Нормализация

Нормализация масштабирует каждый признак к заданному диапазону (обычно [0, 1]).

MinMaxScaler используется для нормализации данных:

Пример

from sklearn.preprocessing import MinMaxScaler

scaler = MinMaxScaler()
X_normalized = scaler.fit_transform(X)  # Нормализовать X

Зачем нужны стандартизация и нормализация?

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

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


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

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

Распространённые методы кодирования включают:

Кодирование меток

Кодирование меток сопоставляет каждой категории уникальное целое число.

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

Пример

from sklearn.preprocessing import LabelEncoder

# Предположим, у нас есть категориальная переменная y
label_encoder = LabelEncoder()
y_encoded = label_encoder.fit_transform(y)  # Преобразовать категориальную переменную в целые числа

One-Hot Encoding

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

OneHotEncoder может преобразовывать категориальные переменные в one-hot-кодирование.

Пример

from sklearn.preprocessing import OneHotEncoder

# Предположим, у нас есть категориальная переменная X
encoder = OneHotEncoder(sparse=False)  # sparse=False возвращает плотную матрицу
X_encoded = encoder.fit_transform(X)  # Преобразовать категориальную переменную в one-hot-кодирование

В pandas функцию get_dummies() также можно использовать для one-hot-кодирования:

X_encoded = pd.get_dummies(X)

4. Отбор признаков

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

Распространённые методы отбора признаков включают:

Отбор признаков на основе модели

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

Пример

from sklearn.ensemble import RandomForestClassifier

# Обучить модель случайного леса
clf = RandomForestClassifier()
clf.fit(X_train, y_train)

# Получите важность признаков
importances = clf.feature_importances_
print(importances)

Рекурсивное исключение признаков (RFE)

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

RFE может помочь нам автоматически выбирать важные признаки.

Пример

from sklearn.feature_selection import RFE

# Использовать линейную модель для рекурсивного исключения признаков
rfe = RFE(clf, n_features_to_select=3)  # Сохранить 3 наиболее важных признака
X_rfe = rfe.fit_transform(X_train, y_train)

5. Инженерия признаков

Инженерия признаков направлена на улучшение качества модели путем обработки, объединения или конструирования новых признаков из существующих.

Общие методы конструирования признаков включают:

  • Комбинирование признаков: объединение двух или более признаков в новый признак.
  • Преобразование признаков: применение таких преобразований, как логарифмическое или извлечение квадратного корня, к признакам для учёта нелинейности в данных.
  • Создание признаков: создание новых признаков на основе существующих данных, например извлечение даты, месяца, дня недели и т. д. из временной метки.

Пример

# Например, объединить два числовых признака в новый признак
df['new_feature'] = df['feature1'] * df['feature2']

6. Извлечение признаков

Извлечение признаков направлено на извлечение новых, более выразительных признаков из исходных признаков.

Общие методы извлечения признаков включают:метод главных компонент (PCA)илинейный дискриминантный анализ (LDA)。

Метод главных компонент (PCA)

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

PCA особенно подходит, когда признаков слишком много, так как позволяет эффективно снизить вычислительную сложность.

Пример

from sklearn.decomposition import PCA

# Предположим, X — матрица признаков
pca = PCA(n_components=2)  # Сократить до 2 главных компонент
X_pca = pca.fit_transform(X)

PCA в основном используется в двух сценариях:

  • Снижение размерности: Когда признаков слишком много, использование PCA для снижения размерности может уменьшить вычислительные затраты, сохраняя основную информацию о данных.
  • Визуализация: Отображение многомерных данных в 2D или 3D пространство, чтобы помочь нам визуализировать структуру данных.

Линейный дискриминантный анализ (LDA)

LDA — это метод снижения размерности с обучением с учителем, цель которого — найти линейную комбинацию, максимизирующую расстояние между разными классами и минимизирующую расстояние внутри классов.

LDA обычно используется в задачах классификации.

Пример

from sklearn.discriminant_analysis import LinearDiscriminantAnalysis

# Предположим, X — матрица признаков, а y — целевая переменная
lda = LinearDiscriminantAnalysis(n_components=2)  # Снизить размерность до 2 линейных дискриминантных компонент
X_lda = lda.fit_transform(X, y)

7. Обработка несбалансированных данных

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

Распространённые методы обработки включают:

Передискретизация

Сбалансировать набор данных, увеличив количество образцов класса меньшинства.

Распространённый метод — использование алгоритма SMOTE (Synthetic Minority Over-sampling Technique).

Пример

from imblearn.over_sampling import SMOTE

smote = SMOTE()
X_resampled, y_resampled = smote.fit_resample(X_train, y_train)

Субдискретизация

Сбалансировать набор данных, уменьшив количество образцов класса большинства.

Пример

from imblearn.under_sampling import RandomUnderSampler

undersampler = RandomUnderSampler()
X_resampled, y_resampled = undersampler.fit_resample(X_train, y_train)
Другие расширения