Повысьте точность своей модели с помощью перекрестной проверки в машинном обучении

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

Понимание перекрестной проверки

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

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

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

Типы перекрестной проверки

Существуют различные типы методов перекрестной проверки. Наиболее распространенные из них:

K-кратная перекрестная проверка

K-кратная перекрестная проверка включает в себя разделение данных на k подмножеств или складок одинакового размера.

Затем модель обучается на k-1 сгибах и проверяется на оставшихся сгибах. Этот процесс повторяется k раз, при этом каждая складка используется для проверки ровно один раз. Вот пример того, как в краткой форме выполнить перекрестную проверку K-кратности с помощью scikit-learn:

from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
from sklearn.datasets import load_iris

# Load iris dataset
iris = load_iris()

# Create feature matrix (X) and target vector (y)
X = iris.data
y = iris.target

# Initialize logistic regression model
model = LogisticRegression()

# Perform 5-fold cross-validation and store accuracy scores
scores = cross_val_score(model, X, y, cv=5)

# Print mean accuracy score across all folds
print("Mean accuracy:", scores.mean())

# output: Mean accuracy: 0.9733333333333334

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

Затем мы можем использовать функцию cross_val_score из scikit-learn для выполнения 5-кратной перекрестной проверки. Эта функция принимает в качестве входных данных модель машинного обучения, матрицу признаков, целевой вектор и количество сгибов, используемых для перекрестной проверки (cv=5).

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

Этот код краток и прост для понимания, что делает его отличным вариантом для новичков, которые хотят научиться выполнять перекрестную проверку K-fold в scikit-learn.

Стратифицированная K-кратная перекрестная проверка

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

from sklearn.model_selection import StratifiedKFold

# Define Stratified K-Fold Cross-Validation with 5 splits
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)

# Define Logistic Regression model
model = LogisticRegression()

# Loop through each split and fit the model
for train_index, test_index in skf.split(X, y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    clf.fit(X_train, y_train)
    print("Accuracy:", model.score(X_test, y_test))

# output: Accuracy: 1.0

Мы определяем объект StratifiedKFold с 5 разбиениями, устанавливаем shuffle=True для случайного перемешивания данных и random_state=42 для воспроизводимости.

Мы также определяем модель логистической регрессии, используя LogisticRegression().

Наконец, мы прокручиваем каждое разбиение, используя метод split() объекта StratifiedKFold. Для каждого разделения мы разделяем данные на обучающий и тестовый наборы, подгоняем модель логистической регрессии к обучающему набору и печатаем оценку точности на тестовом наборе, используя метод score() модели.

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

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

Перекрестная проверка без исключения

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

from sklearn.model_selection import LeaveOneOut

# Create a Leave-One-Out Cross-Validation object
loo = LeaveOneOut()

# Iterate through each fold
for train_index, test_index in loo.split(X):
    # Split the data into training and test sets
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    # Fit the model on the training data
    model.fit(X_train, y_train)
    
    # Test the model on the test data
    score = model.score(X_test, y_test)
    
    # Print the score for each iteration
    print("Iteration:", train_index[0], "Score:", score)

    # outuput:  Iteration: 1 Score: 1.0
    #           Iteration: 0 Score: 0.0
    #           Iteration: 0 Score: 0.0
    #           Iteration: 0 Score: 1.0

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

Метод score модели логистической регрессии возвращает точность модели на тестовых данных.

Для каждой итерации вывод включает две части информации: номер итерации (например, «Итерация: 1») и оценку модели на этой итерации (например, «Оценка: 1,0»).

Оценка обычно является мерой того, насколько хорошо модель работала с данными во время этой конкретной итерации, причем более высокие оценки указывают на лучшую производительность. Судя по выходным данным, модель работала отлично (оценка 1,0) на первой итерации и плохо (оценка 0,0) на второй и третьей итерациях. Четвертая итерация также имела высший балл 1,0.

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

Преимущества перекрестной проверки

Перекрестная проверка имеет ряд преимуществ, в том числе:

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

Недостатки перекрестной проверки

Перекрестная проверка также имеет некоторые недостатки, в том числе:

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

Лучшие практики перекрестной проверки

Чтобы получить максимальную отдачу от перекрестной проверки, важно следовать некоторым рекомендациям, в том числе:

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

Заключение

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

Часто задаваемые вопросы

Какова цель перекрестной проверки?

Перекрестная проверка используется для оценки и проверки производительности моделей машинного обучения и предотвращения переобучения.

Сколько существует типов перекрестной проверки?

Существует несколько типов перекрестной проверки, в том числе перекрестная проверка K-кратности, стратифицированная перекрестная проверка K-кратности и перекрестная проверка исключения.

Каковы преимущества перекрестной проверки?

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

Каковы недостатки перекрестной проверки?

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

Как можно реализовать перекрестную проверку в Python?

Перекрестная проверка может быть реализована в Python с помощью библиотеки scikit-learn, которая предоставляет для этой цели несколько классов и функций.