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

Говоря о машинном обучении (II): перекрестная проверка

Перекрестная проверка. Tagged MachineLearning, учебные пособия, Python, новички.

Для разговора о перекрестной проверке сначала мы должны поговорить о переполнении. Переполнение происходит, когда модель обучает слишком много примеров, с избыточными. Наша модель не может обобщить. Прямой последовательной подключением этой ситуации является то, что наша модель будет работать с нашим примером поезда, но она не выполняет реальные данные. Чтобы предотвратить эту ситуацию, мы можем разделить наш набор данных на 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”