Рубрики
Без рубрики

Роль кросс-подтверждения в модели проверки и гиперпараметрицем

Как мы подтверждаем модель обучения машины? При оценке модели обучения машины … Tagged Python, Машинное обучение, Учебник, начинающие.

Как мы подтверждаем модель обучения машины?

При оценке модели обучения машины обучение и тестирование на одном наборе данных не является отличной идеей; Почему? Давайте нарисуем относищуюсяную аналогию.

С учебными днями мы давали экзамены, а как наши экзамены разработаны? Ну, они были разработаны, чтобы проверить наше понимание предметов, а не нашей способности запоминать! Та же аналогия может быть перенесена на нашу модель обучения машины, а также!

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

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

Это rain_test_split Разделяет доступные данные на два набора: поезд и тестовые наборы в определенной пропорции; Например, поезд на 70% имеющихся данных и тестируйте оставшиеся 30% данных. Таким образом, мы можем гарантировать, что каждая запись в наборе данных может быть либо в наборе тренировок, либо на наборе теста, но не оба! Таким образом, мы уверены, что мы проверим производительность модели на невидимые данные.

Но это достаточно хорошо? Или мы берем это с щепоткой соли? Давайте тренируем простой KneighborsClassifier В Scikit – узнайте на наборе данных ириса. Как показано ниже, мы импортируем необходимые модули.

# Necessary imports
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
from sklearn.neighbors import KNeighborsClassifier
from sklearn import metrics

Давайте загрузимся в данные ириса и отделите функции (длина Sepal, ширину Sepal, длину лета и лепестка) и целевые переменные, которые являются ярлыками классов, указывающие тип IRIS. (Setosa, Versicolour, и Вирджина)

# read in the iris data
iris = load_iris()

# create X (features) and y (response)
X = iris.data
y = iris.target

Давайте создадим поезд и тестовые наборы с Random_state = 4 ; Установка Random_state обеспечивает воспроизводимость. В этом случае он гарантирует, что записи, которые вошли в поезд и тестовые наборы, остаются неизменными каждый раз, когда наш код работает.

# use train/test split with different random_state values
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=4)

Сейчас мы создаем создание KneighborsClassifier с n_neighbors = 5. И установите классификатор на наборе обучения и предсказать на тестовом наборе.

# check classification accuracy of KNN with K=5
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))

# Output
0.9736842105263158

Полученная точность – 0,9736842105263158 Отказ Теперь, давайте изменим Random_state по другому ценному, скажем 20. Как вы думаете, что оценка точности будет? Это сейчас 0,9473684210526315 Отказ Установка Random_state На другой ценность мы получим еще одно значение для оценки точности. Полученные таким образом оценки, полученные таким образом, подвержены для Высокая дисперсия Отказ

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

Как мы достиваем консенсуса о том, как рассчитать счет точности?

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

Понимание кросс-проверки K-Fold

Шаги в K-Fold Cross-Vailation

  • Разделите набор данных в K равные разделы (или «складки»).
  • Используйте Fold 1 для тестирования и объединения других складок в качестве учебного набора.
  • Рассчитайте точность на набор тестов.
  • Повторите шаги 2 и 3 k раз, используя различную складку для тестирования каждый раз.
  • Используйте среднюю точность на разных тестовых установках, как оценка точности вне выборки.

Давайте попробуем визуализировать это, расщепляя набор данных из 25 наблюдений на 5 равных складок, как показано ниже. DataSet содержит 25 наблюдений (пронумерован 0 по 24). 5-кратная перекрестная проверка работает на 5 итераций.

# simulate splitting a dataset of 25 observations into 5 folds
from sklearn.model_selection import KFold
kf = KFold(n_splits=5, shuffle=False).split(range(25))

# print the contents of each training and testing set
print('{} {:^61} {}'.format('Iteration', 'Training set observations', 'Testing set observations'))
for iteration, data in enumerate(kf, start=1):
   print('{:^9} {} {:^25}'.format(iteration, data[0], str(data[1])))

# Output

Iteration                   Training set observations                   Testing set observations
    1     [ 5  6  7  8  9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]        [0 1 2 3 4]       
    2     [ 0  1  2  3  4 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24]        [5 6 7 8 9]       
    3     [ 0  1  2  3  4  5  6  7  8  9 15 16 17 18 19 20 21 22 23 24]     [10 11 12 13 14]     
    4     [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 20 21 22 23 24]     [15 16 17 18 19]     
    5     [ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]     [20 21 22 23 24] 

Мы наблюдаем следующее:

  • Для каждой итерации каждое наблюдение либо в учебном наборе, либо набором тестирования, но не обоих.
  • Каждое наблюдение находится в тесте, установленном ровно один раз.
  • Каждая складка используется в качестве тестового набора ровно один раз и в учебном наборе (K – 1) раз.

Полученная таким образом средняя точность является более точной оценкой точности выборки. Этот процесс использует данные более эффективно, поскольку каждое наблюдение используется как для обучения, так и для тестирования. Рекомендуется использовать Стратифицированная выборка Для создания складок, поскольку это гарантирует, что все этикетки классов представлены в равных пропорциях в каждой сгибе. И Scikit-Learn’s cross_val_score делает это по умолчанию.

На практике мы можем сделать еще лучше, делая следующее:

  • «Держи» часть данных перед началом процесса строительства модели.
  • Найдите лучшую модель, используя перекрестную проверку в оставшихся данных и проверьте его с помощью набора HOLD-OUT.
  • Это дает более надежную оценку производительности вне пробы, поскольку набор проживания действительно выходит из образца.

Перекрестная проверка для гиперпараметрической настройки

Для классификатора KNN на DataSet Iris, возможно, мы можем использовать перекрестную проверку, чтобы найти оптимальное значение для K ? То есть искать оптимальное значение n_neighbors ? Помните, К В KNN Classifier – это количество соседей ( n_neighbors ), которые мы учитываем для прогнозирования классовой этикетки тестового образца. Не быть путать с k в кросс-подтверждении k в k-сгибах.

from sklearn.model_selection import cross_val_score
# 10-fold cross-validation with K=5 for KNN (the n_neighbors parameter)
knn = KNeighborsClassifier(n_neighbors=5)
scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
print(scores)

# Output

[1.         0.93333333 1.         1.         0.86666667 0.93333333
 0.93333333 1.         1.         1.        ]

# use average accuracy as an estimate of out-of-sample accuracy
print(scores.mean())
# Output

0.9666666666666668

Теперь мы будем запускать Cross-Vavyation k Fold для моделей с разными значениями n_neighbors , как показано ниже.

# search for an optimal value of K for KNN
k_range = list(range(1, 31))
k_scores = []
for k in k_range:    
   knn = KNeighborsClassifier(n_neighbors=k)    
   scores = cross_val_score(knn, X, y, cv=10, scoring='accuracy')
   k_scores.append(scores.mean())
   print(k_scores)

# Output k_scores

[0.96, 0.9533333333333334, 0.9666666666666666, 0.9666666666666666, 0.9666666666666668, 0.9666666666666668, 0.9666666666666668, 0.9666666666666668, 0.9733333333333334, 0.9666666666666668, 0.9666666666666668, 0.9733333333333334, 0.9800000000000001, 0.9733333333333334, 0.9733333333333334, 0.9733333333333334, 0.9733333333333334, 0.9800000000000001, 0.9733333333333334, 0.9800000000000001, 0.9666666666666666, 0.9666666666666666, 0.9733333333333334, 0.96, 0.9666666666666666, 0.96, 0.9666666666666666, 0.9533333333333334, 0.9533333333333334, 0.9533333333333334]

Это так трудно увидеть; Позвольте нам построить ценности, чтобы получить лучшую идею.

import matplotlib.pyplot as plt
%matplotlib inline

# plot the value of K for KNN (x-axis) versus the cross-validated accuracy (y-axis)
plt.plot(k_range, k_scores)
plt.xlabel('Value of K for KNN')
plt.ylabel('Cross-Validated Accuracy')

Мы видим, что n_neighbors. (K) значения от 13 до 20 выходят более высокую точность, особенно 18 и 20 и более широкое значение К Выберете менее сложной модели.

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

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

использованная литература

[1] Вот ссылка на Google Colab Notebook Для примера обсуждается выше.

[2] Введение в машину обучения в Python с Scikit-Learn по Dataschool.

[3] Документация Scikit – Scirection: http://scikitlearn.org/stable/modules/cross_validation.html

Обложка Изображение: Фото Кэти Гарф на Бессмысленно

Оригинал: “https://dev.to/balapriya/role-of-cross-validation-in-model-validation-and-hyperparameter-search-n3”