Для разговора о перекрестной проверке сначала мы должны поговорить о переполнении. Переполнение происходит, когда модель обучает слишком много примеров, с избыточными. Наша модель не может обобщить. Прямой последовательной подключением этой ситуации является то, что наша модель будет работать с нашим примером поезда, но она не выполняет реальные данные. Чтобы предотвратить эту ситуацию, мы можем разделить наш набор данных на 2 подмножествах, обучение и тестирование, в этом классе каждый класс должен иметь репрезентативное количество строк.
В следующем примере мы разделили наш набор данных на образцы тестирования на поезде и набираем нашу обучение.
import numpy as np from sklearn.model_selection import train_test_split from sklearn import datasets from sklearn import svm iris = datasets.load_iris() iris.data.shape, iris.target.shape X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.4, random_state=0) clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train) print("Cross validation score = {0}".format(clf.score(X_test, y_test))) # Cross validation score = 0.9666666666666667
Делать это только один раз, будет ошибкой. Мы должны разделить наш полный набор данных на тест на поезде, и мы гарантируем, что наша конфигурация модели работает должным образом.
Разделение нашего набора данных по участкам называется перекрестной проверкой. Поперечная проверка имеет много вариаций, я буду использовать самые простые K-fold Анкет Вы можете взглянуть на эту вариацию Здесь Анкет
from sklearn.model_selection import KFold clf = svm.SVC(kernel='linear', C=1) kf = KFold(n_splits=10) for train, test in kf.split(iris.data): clf.fit(X_train, y_train) print(clf.score(X_test, y_test))
У Sklearn есть функция, которая тезится по перекрестной проверке и возвращает оценку нашей модели:
from sklearn.model_selection import cross_val_score clf = svm.SVC(kernel='linear', C=1) scores = cross_val_score(clf, iris.data, iris.target, cv=10) for idx, score in enumerate(scores): print("Cross validation {0} score = {1}".format(idx + 1, score)) print(scores.mean(), scores.std() * 2) # Cross validation 1 score = 1.0 # Cross validation 2 score = 0.9333333333333333 # Cross validation 3 score = 1.0 # Cross validation 4 score = 1.0 # Cross validation 5 score = 0.8666666666666667 # Cross validation 6 score = 1.0 # Cross validation 7 score = 0.9333333333333333 # Cross validation 8 score = 1.0 # Cross validation 9 score = 1.0 # Cross validation 10 score = 1.0
Вы можете увидеть объяснение штрафа на предыдущем посте. Я покажу графику, чтобы увидеть, как различные наказания влияют на нашу модель.
penalties = list( np.arange( 0.5, 10.0, 0.1 ) ) means = [] stds = [] for C in penalties: clf = svm.SVC(kernel='linear', C=C) scores = cross_val_score(clf, iris.data, iris.target, cv=10) means.append(scores.mean()) stds.append(scores.std() * 2) import matplotlib.pyplot as plt # plot the data fig = plt.figure(1) plt.subplot(211) plt.plot(penalties, means, 'r') plt.subplot(212) plt.plot(penalties, stds, 'r') plt.show()
Оригинал: “https://dev.to/mandrewcito/talking-about-machine-learning-ii-cross-validaton-2odi”