Вернуться на страницу brain2net: https://brain2net.ru/post/perekrestnaya-proverka/
Для оценки качества модели данные могут разбиваться на обучающий и тестовый наборы с помощью функции train_test_split.
Строится модель на обучающей выборке вызовом метода fit.
Оценивается качество модели на тестовом наборе методом score, который для классификации вычисляет долю правильно классифицированных примеров.
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)))
В случае регрессии метод score возвращает коэффициент детерминации
В scikit-learn перекрестная проверка реализована с помощью функции cross_val_score модуля model_selection. Аргументами функции cross_val_score являются оцениваемая модель, обучающие данные и фактические метки (или значения).
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))
По умолчанию cross_val_score выполняет трехблочную перекрестную проверку, возвращая три значения правильности.
Для изменения количество блоков, задается другое значение параметра cv:
scores = cross_val_score(logreg, iris.data, iris.target, cv=5)
print("Значения правильности перекрестной проверки: {}".format(scores))
Обычно вычисляют среднее значение
print("Средняя правильность перекрестной проверки: {:.2f}".format(scores.mean()))
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()))
NB В случае классификации cross_val_score выдаст набор из нулей и единиц (правильно или не правильно определен класс единственного примера). В случае регрессии для единственного примера вычисление коэффициента детерминации не представляется возможным.
print("Значения правильности перекрестной проверки: {}".format(scores))
Программный код, приведенный ниже, 10 раз разбивает данные на 50%-ный обучающий набор и 50%-ный тестовый набор
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))
Чтобы задать абсолютные размеры обучающего и тестового подмножеств можно использовать для train_size и test_size целочисленные значения, либо числа с плавающей точкой, чтобы задать доли от общей выборки.
Группировка данных задана массивом groups.
Набор данных состоит из 12 точек данных, и для каждой точки массив groups задает группу, к которой относится эта точка.
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))
Примеры не нужно сортировать по группам, это сделано в иллюстративных целях.
NB При выполнении разбиении каждая группа полностью попадает либо в обучающий набор, либо в тестовый набор
Вернуться на страницу brain2net: https://brain2net.ru/post/perekrestnaya-proverka/