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

Train_test_split против перекрестной проверки:

Подход с использованием метода удержания или набора проверки:

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

Загрузите необходимые библиотеки и набор данных.

from sklearn import datasets
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
import seaborn as sns
%matplotlib inline
iris = datasets.load_iris()
X = iris.data
y = iris.target

Разделите независимые (X) и зависимые (y) переменные на набор данных для обучения и тестирования с помощью train_test_split.

from sklearn.model_selection import train_test_split
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)

Здесь мы случайным образом выбрали данные для обучения и тестирования с помощью random_state. Затем давайте рассчитаем точность модели с помощью алгоритма k-ближайшего соседа.

from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print(metrics.accuracy_score(y_test, y_pred))

На выходе будет 0,97368. Теперь мы изменим значение random_state и снова рассчитаем точность.

X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)
knn = KNeighborsClassifier(n_neighbors=5)
knn.fit(X_train, y_train)
y_pred = knn.predict(X_test)
print(metrics.accuracy_score(y_test, y_pred))

На выходе будет 1.0.

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

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

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

я. Разделите набор данных на K равных частей или складок.

II. Используйте 1 складку в качестве набора для тестирования, а другие складки в качестве набора для обучения.

iii. Рассчитайте точность.

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

v. Возьмите среднее значение всей точности.

Пример 5-кратной перекрестной проверки показан ниже:

Выбор модели:

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

Во-первых, мы будем использовать 10-кратную перекрестную проверку с K = 15 для KNN.

from sklearn.model_selection import cross_val_score
knn = KNeighborsClassifier(n_neighbors=15)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
print(scores)

Выход: [0,93333333 0,93333333 1. 1. 1. 0.93333333 0.93333333 1. 1. 1.]

Здесь мы видим, что он был повторен 10 раз и, следовательно, дал 10 значений точности.

Возьмите среднее или среднее значение всей указанной выше точности.

print(scores.mean())

Выход: 0,9733333333333334

Теперь с той же 10-кратной перекрестной проверкой мы будем использовать логистическую регрессию.

from sklearn.linear_model import LogisticRegression
logreg = LogisticRegression(solver='liblinear')
scores_logreg = cross_val_score(logreg, X, y, cv=10, scoring='accuracy')
print(scores_logreg)

Выход: [1. 1. 1. 0.93333333 0.93333333 0.93333333 0.8 0.93333333 1. 1.]

print(scores_logreg.mean())

Среднее значение будет 0,9533333333333334.

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

Настройка параметров:

Выбор правильного параметра (или гиперпараметра) модели играет важную роль в прогнозировании точности. Как правило, мы используем параметры по умолчанию для наших моделей машинного обучения. Но оптимальный набор параметров может дать существенный прирост производительности модели. Например, параметр n_neighbor в KNN, параметр C и гамма в SVM и т. Д. Перекрестная проверка помогает выбрать правильный гиперпараметр модели. Мы можем оценить точность описанной выше модели KNN для разных значений параметра n_neighbor.

k_value = list(range(1, 36))
k_scores = []
for k in k_value:
knn = KNeighborsClassifier(n_neighbors=k)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
k_scores.append(scores.mean())

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

Заключение :

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

Это все на сегодня. Хорошего дня :)