Валидация и интерпретируемость
Переобучение
Если ошибка на новых данных значительно больше ошибки на обучающей выборке — это переобучение. Модель запомнила обучающие примеры вместо того, чтобы выучить закономерность.
Отложенная выборка (Hold-out)
Простейший способ оценить обобщающую способность: делим данные на train и test, обучаем на train, оцениваем на test. Test трогаем только один раз.
Кросс-валидация
Делим выборку на \(k\) равных частей. Поочерёдно каждая часть становится тестовой, остальные — обучающими. Итоговая оценка — среднее по \(k\) экспериментам.
При \(k = \ell\) получаем Leave-One-Out (LOO).
После подбора гиперпараметров итоговую модель можно обучить двумя способами:
- Усреднить предсказания \(k\) моделей: \(a(x) = \frac{1}{k} \sum_{i=1}^k a_i(x)\).
- Обучить финальную модель на всех данных.
Важность признаков
Линейные модели
Значимость признака оценивается по его весу \(w_j\). Это работает только при нормированных и некоррелированных признаках. Нормированный вес:
\[w^* = \frac{\text{std}(x_j)}{\text{std}(y)} \cdot w_j\]
Деревья и ансамбли
Важность признака — суммарное снижение impurity (дисперсии, энтропии, индекса Джини) по всем сплитам, где использовался этот признак. Деревья и Random Forest хорошо интерпретируются. Бустинги — сложнее.
Бустинги: permutation importance
Два подхода:
- Удалить признак и посмотреть на изменение качества.
- Зашумить признак и посмотреть на изменение качества (используется чаще).
LIME
Local Interpretable Model-agnostic Explanations. Идея: для каждого объекта \(x\) строим простую интерпретируемую модель \(g\), которая локально аппроксимирует сложную модель \(f\):
\[\xi(x) = \mathop{\text{argmin}}_{g \in G} \left( L(f, g, \pi_x) + \Omega(g) \right)\]
где \(\pi_x\) — окрестность точки \(x\), \(\Omega(g)\) — мера сложности модели \(g\).
SHAP
Shapley Additive Explanations. Использует значения Шепли из теории игр для оценки вклада каждого признака:
\[\phi_i = \sum_{S \subseteq F \setminus \{i\}} \frac{|S|!\,(|F| - |S| - 1)!}{|F|!} \left[ f_{S \cup \{i\}}(x_{S \cup \{i\}}) - f_S(x_S) \right]\]
Требования:
- Local accuracy: \(f(x) = \phi_0 + \sum_{i=1}^n \phi_i x_i\)
- Missingness: \(x_i = 0 \implies \phi_i = 0\)
- Consistency: если признак стал важнее в новой модели, его SHAP-значение не уменьшится.
Target Encoding
Для категориального признака \(x_j\) заменяем категорию средним значением таргета по объектам этой категории:
\[g(x_j, \mathbb{X}) = \frac{\sum_{i=1}^\ell [x_{ij} = x_j]\, y_i}{\sum_{i=1}^\ell [x_{ij} = x_j]}\]
Способы борьбы:
1. Зашумление
\[\bar{g}(x_j, \mathbb{X}) + \varepsilon, \quad \varepsilon \sim \mathcal{N}(0, \sigma^2)\]
2. Сглаживание
\[\bar{g}(x_j, \mathbb{X}) = \lambda(n(x_j)) \cdot \frac{\sum [x_{ij}=x_j] y_i}{\sum [x_{ij}=x_j]} + (1 - \lambda(n(x_j))) \cdot \frac{\sum y_i}{\ell}\]
где \(\lambda(n)\) — монотонно возрастающая функция \(\in [0; 1]\):
- \(n \gg 1 \implies \lambda(n) = 1\) — обычное значение счётчика.
- \(n \sim 1 \implies \lambda(n) < 1\) — добавляем глобальное среднее как регуляризацию.
3. Кросс-валидация
Считаем Target Encoding на фолдах, исключая текущий объект из расчёта.
4. Кодирование по времени (Ordered TS)
Для кодирования объекта \(j\) используем только объекты с 1 по \((j-1)\)-й. Делаем несколько перемешиваний и усредняем. Именно этот подход используется по умолчанию в CatBoost.