3

Я использую skilearn для обучения SVM. Я использую кросс-валидацию для оценки оценки и избегаю модели переопределения.Перекрестная проверка и выбор модели

Я разделил данные на две части. Данные поезда и данные испытаний. Вот код:

import numpy as np 
from sklearn import cross_validation 
from sklearn import datasets 
from sklearn import svm 
X_train, X_test, y_train, y_test = cross_validation.train_test_split(
    iris.data, iris.target, test_size=0.4, random_state=0 
) 
clf = svm.SVC(kernel='linear', C=1) 
scores = cross_validation.cross_val_score(clf, X_train, y_train, cv=5) 
print scores 

# Now I need to evaluate the estimator *clf* on X_test. 
clf.score(X_test,y_test) 
# here, I get an error say that the model is not fitted using fit(), but normally, 
# in cross_val_score function the model is fitted? What is the problem? 
+0

При выполнении перекрестной проверки вы бы тренировать модель на '' X_train', y_train', а затем оценить его производительность на '' X_test', y_test'. Было бы нецелесообразно оценивать производительность вашего классификатора без предварительного обучения. –

+0

@ali_m, Что делает cross_validation.cross_val_score()? Обычно он сначала тренирует режим. Я прекрасно понимаю и понимаю, что вы говорите. Для моего случая мне нужна ранняя остановка, чтобы избежать переобучения. Я разделил набор данных на 3 части для примера, поезд, действительный, тест. Я тренирую модель на части поезда после того, как я настраиваю ее на действительную часть. Как только я получу разумный поезд и действительную ошибку. Я тестирую его на тестовой части. Вот и все! – Jeanne

ответ

7

cross_val_score в основном удобство обертка для sklearn cross-validation iterators. Вы даете ему классификатор и весь набор (обучение + валидация), и он автоматически выполняет один или несколько раундов кросс-валидации, разбивая ваши данные на случайные обучающие/валидационные наборы, устанавливая набор тренировок и вычисляя счет на наборе валидации , Дополнительную информацию см. В документации here.

Причина, почему clf.score(X_test, y_test) вызывает исключение происходит потому, что cross_val_score выполняет установку на копии блока оценки, а не оригинал (см использование clone(estimator) в исходном коде here). Из-за этого clf остается неизменным вне вызова функции и поэтому неправильно инициализируется при вызове clf.fit.

+0

Спасибо, я вижу. Но в этом случае, если эта функция не возвращает «хорошую» оценку после оценки с перекрестной проверкой, какова ее полезность? Его полезность заключается в том, чтобы время ожидания выполнялось перекрестной проверкой, и после этого мы не даем подогнанную модель! Однако, если есть способ клонировать оценку, это будет важно и имеет смысл. – Jeanne

+2

Цель кросс-валидации - оценить, насколько хорошо ваш классификатор будет работать на невидимых примерах. Если бы вы оценили свою производительность непосредственно на своем тренировочном наборе, вы бы получили нереалистично хороший результат. * Само по себе * перекрестная проверка не делает ничего, чтобы ваш классификатор работал лучше. Тем не менее, вы часто используете оценки перекрестной проверки как показатель своей эффективности при оптимизации своей стратегии обучения, например, путем корректировки мета-параметров вашего классификатора (таких как 'C' и' gamma' в случае SVM) , –

+0

Хорошо. Я согласен с тобой. Но как вернуть эти лучшие параметры после перекрестной проверки, если эта функция работает на копии классификатора? С другой стороны, я знаю, что набор валидации используется в стратегии ранней остановки для остановки этапа обучения при попытке минимальной ошибки проверки. – Jeanne

0

Посмотрите, в основном, вам нужно предварительно запрограммировать cross_val_score на iris.data iris.target напрямую.

Irish = load_iris()  
x = Irish.data 
y = Irish.target 
Knn = KNeighborsClassifier(n_neighbors=20) 
Score = cross_val_score(Knn, x, y, cv=10, scoring="accuracy") 

print(Score) #return a np.array of each test trill 
print(Score.mean()) #return the average of the Score/out-of-sample accuracy 
Смежные вопросы