Почему большой выбор K понижает мою оценку перекрестной проверки?

11

Играя с набором данных Boston Housing Dat и RandomForestRegressor(с параметрами по умолчанию) в scikit-learn, я заметил кое-что странное: средний балл перекрестной проверки уменьшился, когда я увеличил число сгибов выше 10. Моя стратегия перекрестной проверки была следующей:

cv_met = ShuffleSplit(n_splits=k, test_size=1/k)
scores = cross_val_score(est, X, y, cv=cv_met)

... где num_cvsбыл изменен. Я настроил test_sizeна 1/num_cvsзеркальное отображение поезда / теста разделенного размера k-кратного резюме. По сути, я хотел что-то вроде k-fold CV, но мне также нужна была случайность (отсюда и ShuffleSplit).

Это испытание было повторено несколько раз, а затем были составлены средние оценки и стандартные отклонения.

Площадь круга ~ K в K-кратной перекрестной проверке

(Обратите внимание, что размер kобозначен областью круга; стандартное отклонение по оси Y.)

Соответственно, увеличение k(от 2 до 44) приведет к краткому увеличению балла, за которым последует неуклонное снижение по мере kувеличения (более чем в 10 раз)! Во всяком случае, я ожидаю, что больше тренировочных данных приведет к незначительному увеличению оценки!

Обновить

Изменение критериев оценки на абсолютную ошибку приводит к ожидаемому поведению: оценка улучшается при увеличении количества сгибов в K-кратном CV, а не при приближении к 0 (как по умолчанию « r2 »). Остается вопрос, почему показатель оценки по умолчанию приводит к низкой производительности как по средним показателям, так и по показателям ЗППП для растущего числа сгибов.

Брайан Бьен
источник
Есть ли дублирующие записи в ваших складках? Это может быть связано с переоснащением .
ВЫЙТИ - Anony-Mousse
1
@ Anony-Mousse Нет, поскольку в наборе данных Boston Housing нет повторяющихся записей, а выборка ShuffleSplit не вызывает дублирование записей.
Брайан Бьен,
4
Кроме того, улучшите свой график. Используйте индикаторы ошибок, чтобы показать среднее значение, + - стандартное отклонение и мин. / Макс. Поместите k на другую ось.
Выйти - Anony-Mousse
1
Я не думаю, что больше тренировочных примеров увеличивают вероятность переобучения. Я построил кривую обучения с этим набором данных, снова используя ShuffleSplit (n_splits = 300 с различными размерами тестов), и увидел последовательно повышенную точность, поскольку стало доступно больше обучающих примеров.
Брайан Бин
1
извините, вы правы, чем больше, тем лучше, а лучше 1. Но у вас нет этой проблемы, если вы используете среднеквадратическую или абсолютную ошибку. Так что это должно что-то делать с ошибкой термин
rep_ho

Ответы:

1

Оценка r ^ 2 не определена применительно к одному образцу (например, резюме с пропуском).

r ^ 2 не подходит для оценки небольших наборов тестов: когда он используется для оценки достаточно небольшого набора тестов, оценка может быть очень отрицательной, несмотря на хорошие прогнозы.

Учитывая один образец, хороший прогноз для данного домена может показаться ужасным:

from sklearn.metrics import r2_score
true = [1]
predicted = [1.01] # prediction of a single value, off by 1%
print(r2_score(true, predicted))
# 0.0

Увеличьте размер тестового набора (сохраняя точность прогнозов на одном уровне), и внезапно оценка r ^ 2 станет почти идеальной:

true = [1, 2, 3]
predicted = [1.01, 2.02, 3.03]
print(r2_score(true, predicted))
# 0.9993

С другой стороны, если размер теста составляет 2 выборки, и мы случайно оцениваем 2 выборки, которые расположены близко друг к другу, это окажет существенное влияние на показатель r ^ 2, даже если прогнозы достаточно хороши :

true = [20.2, 20.1] # actual target values from the Boston Housing dataset
predicted = [19, 21]
print(r2_score(true, predicted))
# -449.0
Брайан Бьен
источник