Как работать с пропусками и категориальными признаками в методах опорных векторов и нейросетях
Что проверяют
Понимаете ли вы, почему для SVM и нейросетей предобработка обязательна, хотя градиентному бустингу многое можно не делать. Интервьюер смотрит, выбираете ли вы кодирование под модель, а не одно на все случаи. Следом обычно спрашивают про категорию с десятками тысяч значений.
Как отвечать
Начните с ограничений моделей. SVC из scikit-learn не принимает NaN и падает с ошибкой, а ядро RBF считает расстояния, поэтому признаки обязательно масштабируют через StandardScaler. Нейросеть посчитает что угодно, но один NaN на входе превращает в NaN весь градиент. А градиентный бустинг (HistGradientBoostingClassifier, LightGBM, XGBoost, CatBoost) обрабатывает пропуски сам.
Пропуски:
- простое заполнение:
SimpleImputerмедианой или модой, сadd_indicator=True, чтобы модель знала, где значение отсутствовало; - модельное заполнение:
KNNImputerилиIterativeImputer, который помечен экспериментальным и требует импортаenable_iterative_imputer; - в нейросети: заполнение плюс маска пропуска отдельным входом, для категорий отдельный индекс «пропуск».
Категории:
- для SVM:
OneHotEncoder(handle_unknown="ignore"). Номинальные признаки нельзя кодировать числами 0, 1, 2, ядро воспримет их как расстояния. Порядковые кодируютOrdinalEncoder; - высокая кардинальность:
TargetEncoder(в scikit-learn с версии 1.3, внутри использует кросс-фиттинг) или хэширование; - в нейросети: слой эмбеддингов (
nn.Embeddingв PyTorch), неизвестным значениям отдают зарезервированный индекс.
Всё собирают в Pipeline с ColumnTransformer, чтобы заполнение и кодирование обучались только на обучающей выборке и одинаково применялись на проде.
Где спотыкаются
Берут LabelEncoder для признаков. Он предназначен для целевой переменной, а номинальному признаку в SVM навязывает ложный порядок.
Вызывают pd.get_dummies отдельно на обучении и тесте. Наборы колонок расходятся, а новая категория на проде ломает модель.
Делают one-hot для признака с 50 тысячами значений перед SVM. Размерность взлетает, редкие категории превращаются в шум, а обучение SVC и так плохо масштабируется на больших выборках.