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

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

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

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

Как избежать утечки данных?

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

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

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

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

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

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

Подходы к подготовке данных

Чтобы правильно понять утечку данных, мы создадим набор данных синтетической двоичной классификации с 2000 случайно сгенерированными выборками данных с 30 функциями.

# Create a dataset
from sklearn.datasets import make_classification
X, y = make_classification(n_samples=2000, n_features=30)

# Shape
print(X.shape, y.shape)

Этот пример кода создаст набор данных X из 2000 строк и 30 столбцов. Выходная метка y также содержит 2000 строк примеров с двумя классами 0 и 1 для каждого входа.

(2000, 30) (2000,)

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

Неправильный подход к подготовке данных

Общий подход к подготовке данных включает

  • Предварительно обработайте весь набор данных
  • Разделите данные на обучающие и тестовые данные
  • Оцените производительность модели

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

# Importing required libraries
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
from sklearn.neighbors import KNeighborsClassifier
from sklearn.metrics import accuracy_score

Давайте стандартизируем данные с помощью StandardScaler(), здесь мы преобразуем каждую переменную данных в диапазоне от -3 до 3.

# Standardization
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)

Затем мы разделим данные на 70 % обучающего и 30 % тестового набора данных, используя метод train_test_split .

# Split data into training and test subsets
X_train, X_test, y_train, y_test = train_test_split(X_scaled, 
                                                    y, 
                                                    test_size=0.3, 
                                                    random_state=0)

Теперь мы подгоним данные алгоритма KNeighborsClassifier к настройкам по умолчанию.

# Fit the model
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)

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

# Predict the output
y_preds = knn.predict(X_test)

# Model evaluation
acc = accuracy_score(y_test, y_preds)
print("Accuracy:: %.3f" % (acc*100))

# Output: Accuracy:: 78.333

Этот пример дает точность модели 78,333 процента. Поскольку есть утечка данных, мы знаем, что модель неверна.

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

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

Утечка данных не ограничивается стандартным скейлером, но также и всеми другими преобразованиями из обучения scikit. Помните, что fit или fit-transform используются только для обучающего набора данных. Чтобы применить преобразование к тестовым данным, вы должны использовать только метод transform.

Правильный подход к подготовке данных включает

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

В следующих фрагментах кода показан правильный подход к подготовке данных.

# Split the dataset into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

Далее мы выполним нормализацию данных поезда, а затем применим их к тестовым данным.

# Define scaler
scaler = StandardScaler()

# Fit transformation on train subset
scaler.fit(X_train)

# Apply transfromation on training dataset
X_train = scaler.transform(X_train)

# Apply transfromation on test dataset
X_test = scaler.transform(X_test)

Теперь мы будем использовать классификатор, чтобы подобрать модель и оценить ее производительность.

# Fit the model
knn = KNeighborsClassifier()
knn.fit(X_train, y_train)

# Predict the output
y_preds = knn.predict(X_test)

# Model evaluation
acc = accuracy_score(y_test, y_preds)
print(“Accuracy:: %.3f” % (acc*100))

# Output: Accuracy:: 76.667

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

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

  • Трубопровод

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

Давайте построим приведенную выше модель knn, используя конвейер.

# Using pipeline
from sklearn.pipeline import make_pipeline

# Split the dataset into train and test datasets
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.3, random_state=0)

# Make pipeline
pipeline = make_pipeline(StandardScaler(), KNeighborsClassifier())

# fit the model
pipeline.fit(X_train, y_train)
y_preds = pipeline.predict(X_test)

# Model evaluation
acc = accuracy_score(y_test, y_preds)
print(“Accuracy:: %.3f” % (acc*100))

Accuracy:: 76.667
  • K-кратная перекрестная проверка

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

# Using cross-val-score
from sklearn.model_selection import cross_val_score

# Model evaluation using cross-validation
scores = cross_val_score(pipeline, X, y)
print(“Accuracy:: %.3f” % (scores.mean()*100))

Точность модели перекрестной проверки оценивается в 71 500 процентов. Точность производительности модели падает по сравнению с разделением тестов конвейера и поезда.

Accuracy:: 71.500

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

Утечки данных можно избежать во время предварительной обработки данных с помощью

  • Разделение данных на обучающие и тестовые наборы данных перед любой подготовкой данных.
  • Никогда не используйте fit или fit-transform для тестовых данных.
  • Использование конвейера scikit-learn для предотвращения утечки данных.

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

Спасибо, что прочитали!