Преобразования данных в машинном обучении
Преобразования данных - это критически важный этап подготовки данных перед построением моделей машинного обучения. Они помогают улучшить качество данных, привести их к виду, который лучше подходит для алгоритмов, и часто значительно повышают производительность моделей.
Основные бласти применения
- Обработка текста — векторизация текста, лемматизация, токенизация
- Компьютерное зрение — нормализация изображений, аугментация данных, преобразование цветовых пространств
- Экономика и финансы — масштабирование признаков, обработка выбросов, создание производных показателей
- Биотехнологии и медицина — стандартизация данных, кодирование категориальных признаков, заполнение пропусков
- Предиктивная аналитика — полиномиальные преобразования, создание временных лагов, бинирование непрерывных переменных
Основные типы преобразований данных
1. Масштабирование и нормализация
Стандартизация (Z-score normalization)
from sklearn.preprocessing import StandardScaler
import numpy as np
data = np.array([[1, 2], [3, 4], [5, 6]])
scaler = StandardScaler()
scaled_data = scaler.fit_transform(data)
print("Исходные данные:\n", data)
print("Стандартизированные данные:\n", scaled_data)
print("Средние значения:", scaler.mean_)
print("Стандартные отклонения:", scaler.scale_)
Min-Max нормализация
from sklearn.preprocessing import MinMaxScaler
data = np.array([[1, 2], [3, 4], [5, 6]])
scaler = MinMaxScaler(feature_range=(0, 1))
scaled_data = scaler.fit_transform(data)
print("Исходные данные:\n", data)
print("Нормализованные данные:\n", scaled_data)
print("Минимальные значения:", scaler.data_min_)
print("Максимальные значения:", scaler.data_max_)
2. Кодирование категориальных признаков
One-Hot Encoding
from sklearn.preprocessing import OneHotEncoder
import pandas as pd
data = pd.DataFrame({'color': ['red', 'blue', 'green', 'blue', 'red']})
encoder = OneHotEncoder(sparse=False)
encoded_data = encoder.fit_transform(data)
print("Исходные данные:\n", data)
print("Закодированные данные:\n", encoded_data)
print("Категории:", encoder.categories_)
Label Encoding
from sklearn.preprocessing import LabelEncoder
data = ['cat', 'dog', 'bird', 'dog', 'cat']
encoder = LabelEncoder()
encoded_data = encoder.fit_transform(data)
print("Исходные данные:", data)
print("Закодированные данные:", encoded_data)
print("Соответствие классов:", list(encoder.classes_))
3. Преобразование текстовых данных
TF-IDF
from sklearn.feature_extraction.text import TfidfVectorizer
corpus = [
'this is the first document',
'this document is the second document',
'and this is the third one',
'is this the first document'
]
vectorizer = TfidfVectorizer()
X = vectorizer.fit_transform(corpus)
print("Словарь:", vectorizer.get_feature_names_out())
print("TF-IDF матрица:\n", X.toarray())
4. Обработка пропущенных значений
from sklearn.impute import SimpleImputer
import numpy as np
data = np.array([[1, np.nan, 3], [4, 5, np.nan], [7, 8, 9]])
imputer = SimpleImputer(strategy='mean')
imputed_data = imputer.fit_transform(data)
print("Исходные данные:\n", data)
print("Данные после обработки пропусков:\n", imputed_data)
print("Значения для замены:", imputer.statistics_)
5. Преобразование распределения (нормализация)
Логарифмическое преобразование
import numpy as np
from sklearn.preprocessing import FunctionTransformer
data = np.array([1, 10, 100, 1000]).reshape(-1, 1)
transformer = FunctionTransformer(np.log1p)
transformed_data = transformer.transform(data)
print("Исходные данные:", data.flatten())
print("После логарифмирования:", transformed_data.flatten())
Преобразование Бокса-Кокса
from sklearn.preprocessing import PowerTransformer
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
transformer = PowerTransformer(method='box-cox', standardize=False)
transformed_data = transformer.fit_transform(data)
print("Исходные данные:", data.flatten())
print("После преобразования Бокса-Кокса:", transformed_data.flatten())
print("Лямбда параметр:", transformer.lambdas_)
6. Создание полиномиальных признаков
from sklearn.preprocessing import PolynomialFeatures
data = np.array([[1, 2], [3, 4]])
poly = PolynomialFeatures(degree=2)
poly_data = poly.fit_transform(data)
print("Исходные данные:\n", data)
print("Полиномиальные признаки:\n", poly_data)
print("Имена признаков:", poly.get_feature_names_out())
7. Дискретизация (биннинг)
from sklearn.preprocessing import KBinsDiscretizer
data = np.array([1, 2, 3, 4, 5, 6, 7, 8, 9, 10]).reshape(-1, 1)
est = KBinsDiscretizer(n_bins=3, encode='ordinal', strategy='uniform')
est.fit(data)
discretized = est.transform(data)
print("Исходные данные:", data.flatten())
print("После дискретизации:", discretized.flatten())
print("Границы бинов:", est.bin_edges_)
Пайплайн преобразований
На практике часто используют несколько преобразований последовательно:
from sklearn.pipeline import Pipeline
from sklearn.compose import ColumnTransformer
from sklearn.preprocessing import StandardScaler, OneHotEncoder
from sklearn.impute import SimpleImputer
# Пример данных
data = pd.DataFrame({
'age': [25, 30, np.nan, 35, 40],
'salary': [50000, 60000, 70000, np.nan, 90000],
'department': ['IT', 'HR', 'IT', 'Finance', 'HR']
})
# Определяем преобразования для разных типов признаков
numeric_features = ['age', 'salary']
numeric_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='median')),
('scaler', StandardScaler())])
categorical_features = ['department']
categorical_transformer = Pipeline(steps=[
('imputer', SimpleImputer(strategy='constant', fill_value='missing')),
('onehot', OneHotEncoder(handle_unknown='ignore'))])
# Объединяем преобразования
preprocessor = ColumnTransformer(
transformers=[
('num', numeric_transformer, numeric_features),
('cat', categorical_transformer, categorical_features)])
# Применяем преобразования
processed_data = preprocessor.fit_transform(data)
print("Преобразованные данные:\n", processed_data)
Важность преобразований данных
-
Улучшение производительности моделей: Многие алгоритмы (например, SVM, k-NN, нейронные сети) чувствительны к масштабу данных.
-
Ускорение обучения: Нормализованные данные часто позволяют алгоритмам сходиться быстрее.
-
Интерпретируемость: Преобразования могут сделать данные более понятными для анализа.
-
Обработка выбросов: Некоторые преобразования (например, логарифмирование) уменьшают влияние выбросов.
-
Подготовка к специфичным алгоритмам: Например, PCA требует масштабированных данных.
Выбор конкретных преобразований зависит от природы данных, выбранной модели и поставленной задачи. Часто пробуют несколько вариантов и выбирают тот, который дает лучший результат.