Подготовка данных для ML

Начните с выгрузки сырых данных из проверенных источников. Используйте SQL-запросы для извлечения информации из баз данных, CSV-файлы для статических наборов или API-интерфейсы (например, Twitter API для текстовых данных). Проверьте лицензионные ограничения: например, изображения из Flickr должны соответствовать правилам Creative Commons.
Проверьте аномалии в первых 1000 строк. Примените df.describe() в Pandas для выявления отклонений в числовых признаках. Для категориальных данных используйте df.value_counts(), чтобы найти редкие метки (менее 1% от общего объема). Автоматизируйте удаление дубликатов через df.drop_duplicates(subset=[‘email’]).
Нормализуйте числовые признаки до единого масштаба. Для нейросетей применяйте MinMaxScaler(feature_range=(0,1)), для линейных моделей – StandardScaler(). Категории преобразуйте через OneHotEncoder(), если классов меньше 10, или TargetEncoder(), если больше. Для временных рядов добавьте lag-признаки: df[‘lag_1’] = df[‘price’].shift(1).
Разделите данные на три группы: 60% – обучение, 20% – валидация, 20% – тест. Для временных рядов сохраняйте хронологический порядок. Используйте StratifiedKFold(), если целевая переменная несбалансирована (например, 95% класса «0» и 5% класса «1»). Экспортируйте наборы в отдельные файлы: train.csv, val.csv, test.csv.
Добавьте автоматические проверки перед передачей данных в модель. Напишите скрипт, который проверяет совпадение типов признаков в train и test (dtypes), допустимые диапазоны значений (assert df[‘age’].between(0, 120).all()), отсутствие NaN в целевом столбце. Зафиксируйте версию датасета через DVC или MLflow.
Сбор исходных данных и устранение пропущенных значений
Определите источники данных: открытые репозитории (Kaggle, UCI Machine Learning Repository), внутренние базы данных компании или API сторонних сервисов. Используйте библиотеки Python (requests, Scrapy) для автоматизации парсинга.
Проверьте данные на пропуски:
- Используйте метод
.isnull().sum()
в pandas для подсчета пропущенных значений по каждому столбцу. - Если пропуски составляют менее 5% данных – удалите строки с помощью
.dropna()
. - При высоком проценте пропусков (>20%) рассмотрите удаление столбца или генерацию синтетических данных через алгоритмы SMOTE или KNNImputer.
Для заполнения пропусков:
- Числовые данные: замена на медиану или среднее значение (
.fillna(df['column'].median())
). - Категориальные данные: добавьте отдельную категорию «Unknown» или используйте модуль
SimpleImputer(strategy='most_frequent')
. - Временные ряды: заполните пропуски интерполяцией (
.interpolate()
).
Проверьте распределение данных после обработки. Если пропуски не случайны (например, связаны с определенной группой), добавьте бинарный признак-индикатор пропуска (df['column_missing'] = df['column'].isnull().astype(int)
).
Для работы с текстовыми данными удалите пустые строки или замените их на стандартный токен («[MISSING]»). Используйте CatBoost или LightGBM, если пропуски содержат информацию для моделей, учитывающих NA как отдельное значение.
Преобразование признаков и настройка форматов данных для алгоритмов
Преобразуйте категориальные признаки в числовые с помощью методов, соответствующих типу данных:
- One-Hot Encoding для номинальных категорий (например, города или цвета), если количество уникальных значений ≤15. Используйте
pd.get_dummies()
илиOneHotEncoder
. - Label Encoding для порядковых признаков (например, уровни образования: «школа»→0, «бакалавр»→1). Примените
OrdinalEncoder
с явным указанием порядка категорий.
Нормализуйте числовые признаки, если алгоритм чувствителен к масштабу (например, нейросети, метод опорных векторов):
- Min-Max Scaling (
MinMaxScaler
) для данных в диапазоне [0,1], если распределение не нормальное. - Z-Score Standardization (
StandardScaler
) для признаков с выбросами, чтобы среднее = 0, стандартное отклонение = 1.
Обработайте пропущенные значения:
- Для числовых данных: замена медианой (для распределений с выбросами) или средним (для нормальных распределений). Используйте
SimpleImputer
. - Для категориальных данных: добавьте категорию «Unknown» или используйте наиболее частую категорию.
- Добавьте бинарный признак-индикатор пропуска (0/1) для сохранения информации.
Создайте производные признаки для улучшения интерпретируемости модели:
- Комбинируйте числовые признаки: площадь квартиры = длина × ширина.
- Разделите временные метки на компоненты: год, месяц, день недели из даты.
- Для текстов: выделите длины строк, количество чисел или специальных символов.
Форматируйте данные для специфических алгоритмов:
- Древовидные модели (Random Forest, XGBoost): не требуют масштабирования, но чувствительны к дисбалансу классов.
- Нейросети: преобразуйте все признаки в числовые, масштабируйте до диапазона [-1,1] или [0,1].
- Алгоритмы кластеризации: удалите шумы с помощью DBSCAN или примените PCA для снижения размерности.



