Вернуться на страницу brain2net: https://brain2net.ru/post/perekrestnaya-proverka/

Оценка качества модели без кросс-валидации (для сравнения)

Для оценки качества модели данные могут разбиваться на обучающий и тестовый наборы с помощью функции train_test_split.

Строится модель на обучающей выборке вызовом метода fit.

Оценивается качество модели на тестовом наборе методом score, который для классификации вычисляет долю правильно классифицированных примеров.

In [2]:
from sklearn.datasets import make_blobs
from sklearn.linear_model import LogisticRegression
from sklearn.model_selection import train_test_split
# создаем синтетический набор данных
X, y = make_blobs(random_state=0)
# разобъем данные на обучающий и тестовый наборы
X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=0)
# создаем экземпляр модели и подгоняем его на обучающем наборе
logreg = LogisticRegression().fit(X_train, y_train)
# оцениваем качество модели на тестовом наборе
print("Правильность на тестовом наборе: {:.2f}".format(logreg.score(X_test, y_test)))
Правильность на тестовом наборе: 0.88

В случае регрессии метод score возвращает коэффициент детерминации

Перекрестная проверка в scikit-learn

В scikit-learn перекрестная проверка реализована с помощью функции cross_val_score модуля model_selection. Аргументами функции cross_val_score являются оцениваемая модель, обучающие данные и фактические метки (или значения).

In [3]:
from sklearn.model_selection import cross_val_score
from sklearn.datasets import load_iris
from sklearn.linear_model import LogisticRegression
iris = load_iris()
logreg = LogisticRegression(max_iter = 500)
scores = cross_val_score(logreg, iris.data, iris.target)
print("Значения правильности перекрестной проверки: {}".format(scores))
Значения правильности перекрестной проверки: [0.96666667 1.         0.93333333 0.96666667 1.        ]

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

Для изменения количество блоков, задается другое значение параметра cv:

In [4]:
scores = cross_val_score(logreg, iris.data, iris.target, cv=5)
print("Значения правильности перекрестной проверки: {}".format(scores))
Значения правильности перекрестной проверки: [0.96666667 1.         0.93333333 0.96666667 1.        ]

Обычно вычисляют среднее значение

In [6]:
print("Средняя правильность перекрестной проверки: {:.2f}".format(scores.mean()))
Средняя правильность перекрестной проверки: 0.97

Исключение по одному (leave-one-out)

In [7]:
from sklearn.model_selection import LeaveOneOut
loo = LeaveOneOut()
scores = cross_val_score(logreg, iris.data, iris.target, cv=loo)
print("Количество итераций: ", len(scores))
print("Средняя правильность: {:.2f}".format(scores.mean()))
Количество итераций:  150
Средняя правильность: 0.97

NB В случае классификации cross_val_score выдаст набор из нулей и единиц (правильно или не правильно определен класс единственного примера). В случае регрессии для единственного примера вычисление коэффициента детерминации не представляется возможным.

In [8]:
print("Значения правильности перекрестной проверки: {}".format(scores))
Значения правильности перекрестной проверки: [1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1.
 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 0.
 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1. 1.
 1. 1. 1. 1. 1. 1.]

Перекрестная проверка со случайными перестановками при разбиении (shuffle-split cross-validation)

Программный код, приведенный ниже, 10 раз разбивает данные на 50%-ный обучающий набор и 50%-ный тестовый набор

In [9]:
from sklearn.model_selection import ShuffleSplit
shuffle_split = ShuffleSplit(test_size=.5, train_size=.5, n_splits=10)
scores = cross_val_score(logreg, iris.data, iris.target, cv=shuffle_split)
print("Значения правильности перекрестной проверки:\n{}".format(scores))
Значения правильности перекрестной проверки:
[0.94666667 0.93333333 0.96       0.94666667 0.98666667 0.96
 0.93333333 0.97333333 0.97333333 0.97333333]

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

Перекрестная проверка с использованием групп

Группировка данных задана массивом groups.

Набор данных состоит из 12 точек данных, и для каждой точки массив groups задает группу, к которой относится эта точка.

In [10]:
from sklearn.model_selection import GroupKFold
# создаем синтетический набор данных
X, y = make_blobs(n_samples=12, random_state=0)
# предположим, что первые три примера относятся к одной и той же группе,
# затем следующие четыре и так далее.
groups = [0, 0, 0, 1, 1, 1, 1, 2, 2, 3, 3, 3]
scores = cross_val_score(logreg, X, y, groups, cv=GroupKFold(n_splits=3))
print("Значения правильности перекрестной проверки:\n{}".format(scores))
Значения правильности перекрестной проверки:
[0.75       0.6        0.66666667]

Примеры не нужно сортировать по группам, это сделано в иллюстративных целях.

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

Вернуться на страницу brain2net: https://brain2net.ru/post/perekrestnaya-proverka/

In [ ]: