Подготовка данных — это процесс преобразования необработанных данных в форму, подходящую для моделирования.

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

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

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

Прочитав эту статью, вы будете знать:

  • Утечка данных происходит из-за наивного применения методов подготовки данных ко всему набору данных, что приводит к неточным оценкам производительности модели.
  • Подготовка данных должна быть подготовлена ​​только на обучающей выборке, чтобы избежать утечки данных.
  • Как реализовать k-кратную перекрестную проверку и разбиение обучающих тестов в Python без утечки данных.

Эта статья разделена на 3 части:

  1. Что такое утечка данных?
  2. Проблема с наивной подготовкой данных
  3. Подготовка данных с помощью обучающих и тестовых наборов
  4. Подготовка данных с k-кратной перекрестной проверкой

Что такое утечка данных?

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

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

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

Проблема с наивной подготовкой данных:

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

  1. Подготовить набор данных
  2. Разделить данные
  3. Оцените модели

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

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

Например, рассмотрим случай, когда мы хотим нормализовать данные, то есть масштабировать входные переменные до диапазона 0–1. Когда мы нормализуем входные переменные, это требует, чтобы мы сначала вычислили минимальное и максимальное значения для каждой переменной, прежде чем использовать эти значения для масштабирования переменных. Затем набор данных разделяется на обучающий и тестовый наборы данных, но примеры в обучающем наборе данных что-то знают о данных в тестовом наборе данных; они были масштабированы по глобальным минимальным и максимальным значениям, поэтому они знают о глобальном распределении переменной больше, чем должны.

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

  1. Разделить данные.
  2. Подгонка подготовки данных в наборе обучающих данных.
  3. Примените подготовку данных для обучения и тестирования наборов данных
  4. Оцените модели.

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

Теперь, когда мы знакомы с тем, как применять подготовку данных, чтобы избежать утечки данных, давайте рассмотрим некоторые рабочие примеры.

Подготовка данных с помощью обучающих и тестовых наборов:

В этом разделе мы оценим модель логистической регрессии с использованием обучающих и тестовых наборов в наборе данных синтетической бинарной классификации, где входные переменные были нормализованы. Во-первых, давайте определим наш синтетический набор данных. Мы будем использовать функцию make_classification() для создания набора данных с 1000 строками данных и 20 числовыми входными объектами.

Оценка обучающего теста с наивной подготовкой данных:

Наивный подход включает в себя сначала применение метода подготовки данных, а затем разделение данных перед окончательной оценкой модели. Класс MinMaxScaler используется для нормализации входных переменных. Первоначально он определяется с конфигурацией по умолчанию, масштабирующей данные в диапазоне 0–1, а затем вызывается функция fit_transform(), чтобы подогнать преобразование к набору данных и применить его к набору данных за один раз. шаг. Результатом является нормализованная версия входных переменных, при этом каждый столбец в массиве нормализуется отдельно (например, рассчитывается собственный минимум и максимум).

# naive approach to normalizing the data before splitting the data 
# and evaluating the model
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, 
                            n_redundant=5, random_state=7)

# standardize the dataset
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

# split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, 
                                                    random_state=1)

# fit the model
model = LogisticRegression()
model.fit(X_train, y_train)

# evaluate the model
yhat = model.predict(X_test)

# evaluate predictions
accuracy = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % (accuracy*100))

Выполнение примера нормализует данные, разбивает данные на обучающие и тестовые наборы, а затем подбирает и оценивает модель.

В этом случае мы видим, что оценка для модели составляет около 84,848.

Accuracy: 84.848

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

Оценка учебных испытаний с правильной подготовкой данных:

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

# correct approach for normalizing the data after the data is split before 
# the model is evaluated
from sklearn.datasets import make_classification
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.metrics import accuracy_score

# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, 
                            n_redundant=5, random_state=7)

# split into train and test sets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, 
                                                    random_state=1)
# define the scaler
scaler = MinMaxScaler()

# fit on the training dataset
scaler.fit(X_train)

# scale the training dataset
X_train = scaler.transform(X_train)

# scale the test dataset
X_test = scaler.transform(X_test)

# fit the model
model = LogisticRegression()
model.fit(X_train, y_train)

# evaluate the model
yhat = model.predict(X_test)

# evaluate predictions
accuracy = accuracy_score(y_test, yhat)
print('Accuracy: %.3f' % (accuracy*100))
Accuracy: 85.455

Это позволяет избежать утечки данных, поскольку расчет минимального и максимального значения для каждой входной переменной рассчитывается с использованием только набора обучающих данных (X_train), а не всего набора данных (X). Затем модель может быть оценена, как и раньше.

В этом случае мы видим, что оценка для модели составляет около 85,455%, что является более точной, чем оценка с утечкой данных в предыдущем разделе, которая достигла точности 84,848%. Мы ожидаем, что утечка данных приведет к неправильной оценке производительности модели.

Подготовка данных с k-кратной перекрестной проверкой:

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

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

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

Перекрестная проверка с подготовкой наивных данных:

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

Сначала необходимо определить k-кратную процедуру перекрестной проверки. Мы будем использовать повторную стратифицированную 10-кратную перекрестную проверку, которая является лучшей практикой для классификации. Повторяется означает, что вся процедура перекрестной проверки повторяется несколько раз, в данном случае три. Стратифицированный означает, что каждая группа строк будет иметь относительный состав примеров из каждого класса как всего набора данных. Мы будем использовать k = 10 или 10-кратную перекрестную проверку. Этого можно добиться с помощью RepeatedStratifiedKFold, которую можно настроить на три повтора и 10 сгибов, а затем с помощью функции cross_val_score() для выполнения процедуры, передавая определенные модель, объект перекрестной проверки и метрика для расчета, в данном случае, точности.

# naive data preparation for model evaluation with k-fold cross-validation
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression

# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, 
                            n_redundant=5, random_state=7)

# standardize the dataset
scaler = MinMaxScaler()
X = scaler.fit_transform(X)

# define the model
model = LogisticRegression()

# define the evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)

# evaluate the model using cross-validation
scores = cross_val_score(model, X, y, scoring='accuracy', cv=cv, n_jobs=-1)

# report performance
print('Accuracy: %.3f (%.3f)' % (mean(scores)*100, std(scores)*100))
Accuracy: 85.300 (3.607)

В этом случае мы видим, что модель достигла оценочной точности около 85,300%, что, как мы знаем, неверно, учитывая утечку данных, допущенную в результате процедуры подготовки данных.

Перекрестная проверка с правильной подготовкой данных:

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

Процедура оценки изменяется от простой и неправильной оценки только модели к правильной оценке всего конвейера подготовки данных и модели вместе как единой элементарной единицы. Этого можно добиться с помощью класса Pipeline. Этот класс принимает список шагов, определяющих конвейер. Каждый шаг в списке представляет собой кортеж из двух элементов. Первый элемент — это имя шага (строка), а второй — сконфигурированный объект шага, например преобразование или модель. Модель поддерживается только в качестве последнего шага, хотя мы можем иметь столько преобразований, сколько захотим в последовательности.

# correct data preparation for model evaluation with k-fold cross-validation
from numpy import mean
from numpy import std
from sklearn.datasets import make_classification
from sklearn.model_selection import cross_val_score
from sklearn.model_selection import RepeatedStratifiedKFold
from sklearn.preprocessing import MinMaxScaler
from sklearn.linear_model import LogisticRegression
from sklearn.pipeline import Pipeline

# define dataset
X, y = make_classification(n_samples=1000, n_features=20, n_informative=15, 
                           n_redundant=5, random_state=7)

# define the pipeline
steps = list()
steps.append(('scaler', MinMaxScaler()))
steps.append(('model', LogisticRegression()))
pipeline = Pipeline(steps=steps)

# define the evaluation procedure
cv = RepeatedStratifiedKFold(n_splits=10, n_repeats=3, random_state=1)

# evaluate the model using cross-validation
scores = cross_val_score(pipeline, X, y, scoring='accuracy', cv=cv, n_jobs=-1)

# report performance
print('Accuracy: %.3f (%.3f)' % (mean(scores)*100, std(scores)*100))
Accuracy: 85.433 (3.471)

В этом случае мы видим, что точность модели оценивается примерно в 85,433 %, по сравнению с подходом с утечкой данных, который обеспечивает точность около 85,300 %.

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

Тем не менее примеры демонстрируют, что утечка данных может повлиять на оценку производительности модели и на то, как исправить утечку данных, правильно выполнив подготовку данных после их разделения.

API

  1. API sklearn.datasets.make_classification.
  2. API sklearn.preprocessing.MinMaxScaler.
  3. API sklearn.model_selection.train_test_split.
  4. API sklearn.linear_model.LogisticRegression.
  5. API sklearn.model_selection.RepeatedStratifiedKFold.
  6. API sklearn.model_selection.cross_val_score.

Краткое содержание

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

  • Утечка данных происходит из-за наивного применения методов подготовки данных ко всему набору данных, что приводит к неточным оценкам производительности модели.
  • Подготовка данных должна быть подготовлена ​​только на обучающей выборке, чтобы избежать утечки данных.
  • Как реализовать k-кратную перекрестную проверку и разбиение обучающих тестов в Python без утечки данных.