Monday, April 11, 2022

Cross-validation: evaluating estimator performance

 При оценке различных настроек («гиперпараметров») для оценщиков, таких как параметр C, который должен быть установлен вручную для SVM, все еще существует риск переобучения в тестовом наборе, поскольку параметры можно настраивать до тех пор, пока оценщик не будет работать оптимально. Таким образом, знания о тестовом наборе могут «просочиться» в модель, а метрики оценки больше не сообщают о производительности обобщения. Чтобы решить эту проблему, еще одна часть набора данных может быть представлена ​​в виде так называемого «проверочного набора»: обучение продолжается на обучающем наборе, после чего выполняется оценка на проверочном наборе, и когда эксперимент кажется успешным , окончательную оценку можно выполнить на тестовом наборе.

Однако, разбивая доступные данные на три набора, мы резко сокращаем количество выборок, которые можно использовать для обучения модели, а результаты могут зависеть от конкретного случайного выбора пары наборов (обучение, проверка).

Решением этой проблемы является процедура, называемая перекрестной проверкой (сокращенно CV). Тестовый набор по-прежнему должен храниться для окончательной оценки, но проверочный набор больше не нужен при выполнении CV. В базовом подходе, называемом k-fold CV, обучающая выборка разбивается на k меньших наборов (другие подходы описаны ниже, но в целом следуют тем же принципам). Для каждой из k «складок» выполняется следующая процедура:

Модель обучается с использованием складок в качестве обучающих данных;

полученная модель проверяется на оставшейся части данных (т. Е. Она используется в качестве тестового набора для вычисления показателя производительности, такого как точность).

Мера производительности, о которой сообщает k-кратная перекрестная проверка, представляет собой среднее значение значений, вычисленных в цикле. Этот подход может быть дорогостоящим в вычислительном отношении, но не тратит слишком много данных (как в случае фиксации произвольного набора проверки), что является большим преимуществом в таких задачах, как обратный вывод, когда количество выборок очень мало.






















Самый простой способ использовать перекрестную проверку — вызвать вспомогательную функцию cross_val_score для оценщика и набора данных.
В следующем примере показано, как оценить точность линейной машины опорных векторов ядра в наборе данных радужной оболочки путем разделения данных, подгонки модели и вычисления оценки 5 раз подряд (каждый раз с разными разделениями):

(.env) [boris@fedora35server CROSSVL]$ cat crossVal1.py
from sklearn.model_selection import cross_val_score
from sklearn import svm
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn import datasets


X, y = datasets.load_iris(return_X_y=True)
clf = svm.SVC(kernel='linear', C=1, random_state=42)
scores = cross_val_score(clf, X, y, cv=5)
print("%0.2f accuracy with a standard deviation of %0.2f" % (scores.mean(), scores.std()))

(.env) [boris@fedora35server CROSSVL]$ python crossVal1.py
0.98 accuracy with a standard deviation of 0.02






























Другой пример

(.env) [boris@fedora35server CROSSVL]$ cat crossVal2.py
import pandas as pd
import numpy as np
from sklearn.metrics import accuracy_score, confusion_matrix
from sklearn.ensemble import RandomForestClassifier
from sklearn import svm
from sklearn.model_selection import cross_val_score

#read csv file
data  =  pd.read_csv("./Iris.csv")
#Create Dependent and Independent Datasets based on our Dependent #and Independent features
X  = data[['SepalLengthCm','SepalWidthCm','PetalLengthCm']]
y= data['Species']
model = svm.SVC()
accuracy = cross_val_score(model, X, y, scoring='accuracy', cv = 10)
print(accuracy)

#get the mean of each fold 
print("Accuracy of Model with Cross Validation is:",accuracy.mean() * 100)

(.env) [boris@fedora35server CROSSVL]$ python crossVal2.py
[0.93333333 0.93333333 1.         1.         0.93333333 0.8
 0.93333333 0.93333333 1.         1.        ]
Accuracy of Model with Cross Validation is: 94.66666666666667






















Таким образом, перекрестная проверка — это процедура, используемая для предотвращения переобучения и оценки навыков модели на новых данных.
Существуют общие тактики, которые вы можете использовать для выбора значения k для вашего набора данных.
Существуют часто используемые варианты перекрестной проверки, такие как послойная и повторная, которые доступны в scikit-learn.

References





No comments:

Post a Comment