Руководство по предотвращению ям машинного обучения: проверка согласованности распределения обучающих/тестовых наборов

машинное обучение

В отрасли существует общепринятое мнение, что «данные и функции определяют верхний предел проектов машинного обучения, а алгоритм как раз максимально приближает этот верхний предел». В реальном бою проработка особенностей занимает почти половину времени, что является очень важной частью. Обработка отсутствующих значений, обработка выбросов, стандартизация данных, несбалансированность и другие проблемы должны быть легкой задачей для всех В этой статье мы обсуждаем яму, которую легко упустить из виду: согласованность данных.

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

吴恩达:《Machine Learning Yearning》

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

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

График распределения KDE (оценка плотности ядра)

Оценка плотности ядра используется для оценки неизвестных функций плотности в теории вероятностей и является одним из методов непараметрического тестирования.Характеристики распределения самих выборок данных можно интуитивно увидеть через график оценки плотности ядра.

kdeplot в Seaborn можно использовать для оценки плотности ядер и визуализации для одномерных и двумерных моделей.

См. небольшой пример:

import pandas as pd
import seaborn as sns
import matplotlib.pyplot as plt
train_set=pd.read_csv(r'D:\...\train_set.csv')
test_set=pd.read_csv(r'D:\...\test_set.csv')
plt.figure(figsize=(12,9))
ax1 = sns.kdeplot(train_set.balance,label='train_set')
ax2 = sns.kdeplot(test_set.balance,label='test_set')

KDE只能靠感觉,看起来分布很一致

КС проба (Колмогорова-Смирнова)

Тест KS основан на кумулятивной функции распределения и используется для проверки того, соответствует ли распределение теоретическому распределению, или для сравнения того, существенно ли различаются два эмпирических распределения. Двухвыборочный критерий К-С является одним из наиболее полезных и часто используемых непараметрических методов сравнения двух выборок, поскольку он чувствителен к различиям в параметрах положения и формы эмпирических функций распределения двух выборок.

Мы можем использовать ks_2samp из библиотеки scipy.stats для выполнения теста KS:

from scipy.stats import ks_2samp
ks_2samp(train_set.balance,test_set.balance)

Тест ks обычно возвращает два значения: первое значение представляет максимальное расстояние между двумя распределениями, и чем меньше значение, тем меньше разрыв между двумя распределениями и тем более согласованны распределения. Второе значение — это p-значение, параметр, используемый для определения результата проверки гипотезы.Чем больше p-значение, тем меньше вероятность отвергнуть нулевую гипотезу (два проверяемых распределения распределены одинаково), т. е. , тем более одинаково распределены два распределения.

Ks_2sampResult(statistic=0.005976590587342234, pvalue=0.9489915858135447)

Из окончательного возвращенного результата видно, что функция баланса подчиняется одному и тому же распределению в обучающем наборе и тестовом наборе.

Состязательная проверка

Помимо тестов KDE и KS, в настоящее время более популярна состязательная валидация, которая является не методом оценки эффекта модели, а методом подтверждения изменения распределения обучающей выборки и тестовой выборки.
конкретные методы:
1. Объедините обучающий набор и тестовый набор в набор данных, добавьте столбец меток, образцы в обучающем наборе помечены как 0 , а образцы в тестовом наборе помечены как 1 .
2. Повторно разделите новый набор train_set и test_set (отличный от исходного обучающего набора и тестового набора).
3. Используйте train_set для обучения двухклассовой модели, вы можете использовать LR, RF, XGBoost, LightGBM и т. д. с AUC в качестве индикатора модели.
4. Если AUC составляет около 0,5, это означает, что модель не может различить исходный обучающий набор и тестовый набор, то есть их распределение является согласованным. Если AUC относительно велик, это означает, что исходный обучающий набор и тестовый набор сильно различаются, а распределение несовместимо.
5. Используйте модель классификатора на шаге 2, чтобы оценить и предсказать исходный обучающий набор, и отсортируйте образцы в соответствии с оценкой модели от больших к малым.Чем больше оценка модели, тем ближе она к тестовому набору, затем возьмите обучающая выборка Выборки TOP N используются в качестве контрольной выборки целевой задачи, так что исходные выборки могут быть разделены для получения обучающей выборки, проверочной выборки и тестовой выборки.

В дополнение к определению согласованности распределений признаков между обучающими и тестовыми наборами, состязательная проверка также может использоваться для выбора признаков. Если вам интересно, вы можете поставить лайк + посмотреть В следующей лекции «Выбор функций» мы будем использовать пример, чтобы увидеть конкретное использование и эффект состязательной проверки.