Dlaczego duży wybór K obniża mój wynik weryfikacji krzyżowej?

11

Zabawy z Boston Housing zestawem danych i RandomForestRegressor(W / domyślne parametry) w scikit-learn, zauważyłem coś dziwnego: średni wynik walidacji krzyżowej spadła jak zwiększona ilość fałd poza 10. Moja strategia cross-walidacja była następująca:

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

... gdzie num_cvsbyło zróżnicowane. Ustawić test_sizena 1/num_cvslustro pociągu / test zachowania rozmiar podzielonego K-krotnie CV. Zasadniczo chciałem coś w rodzaju k-fold CV, ale potrzebowałem także losowości (stąd ShuffleSplit).

Próbę tę powtórzono kilka razy, a następnie wykreślono średnie wyniki i odchylenia standardowe.

Obszar koła ~ K w K-krotnie walidacji krzyżowej

(Zwróć uwagę, że rozmiar kjest wskazywany przez obszar koła; odchylenie standardowe jest na osi Y).

Konsekwentnie, zwiększenie k(z 2 do 44) dałoby krótki wzrost wyniku, a następnie stały spadek w kmiarę dalszego zwiększania (ponad ~ 10-krotnie)! Jeśli już, spodziewam się, że więcej danych treningowych doprowadzi do niewielkiego wzrostu wyników!

Aktualizacja

Zmiana kryteriów punktacji na błąd bezwzględny skutkuje zachowaniem, którego się spodziewałam: punktacja poprawia się wraz ze wzrostem liczby krotności w K-krotnie CV, a nie zbliża się do 0 (jak w przypadku domyślnego „ r2 ”). Pozostaje pytanie, dlaczego domyślna metryka punktacji skutkuje słabą wydajnością zarówno dla średniej, jak i metryki STD dla rosnącej liczby krotności.

Brian Bien
źródło
Jakieś zduplikowane rekordy w twoich zakładkach? Może to być spowodowane nadmiernym dopasowaniem .
Ma ZAKOŃCZENIE - Anony-Mousse
1
@ Anony-Mousse Nie, ponieważ zestaw danych Boston Housing nie ma zduplikowanych rekordów, a próbkowanie ShuffleSplit nie powoduje zduplikowania rekordów.
Brian Bien
4
Popraw także swoje plany. Użyj słupków błędów, aby pokazać średnią, + - stddev i min / max. Umieść k na drugiej osi.
Ma ZAKOŃCZENIE - Anony-Mousse
1
Nie sądzę, aby więcej przykładów treningowych zwiększało szansę na nadmierne dopasowanie. Z tym zestawem danych wykreśliłem krzywą uczenia się, ponownie używając ShuffleSplit (n_splits = 300 przy różnych rozmiarach testów) i zauważyłem konsekwentnie zwiększoną dokładność w miarę udostępniania większej liczby przykładów szkoleń.
Brian Bien
1
przepraszam, masz rację, więcej jest lepszych, a najlepsze jest 1. Ale nie masz tego problemu, jeśli używasz średniego kwadratu lub błędu absolutnego. Musi więc coś zrobić z terminem błędu
rep_ho

Odpowiedzi:

1

Wynik r ^ 2 jest niezdefiniowany, gdy stosuje się go do pojedynczej próbki (np. CV z pominięciem jednego).

r ^ 2 nie jest dobry do oceny małych zestawów testowych: gdy jest używany do oceny wystarczająco małego zestawu testowego, wynik może być daleko w przeczeniach, pomimo dobrych prognoz.

Biorąc pod uwagę pojedynczą próbkę, dobre prognozy dla danej domeny mogą wydawać się okropne:

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

Zwiększ rozmiar zestawu testowego (zachowując tę ​​samą dokładność prognoz) i nagle wynik r ^ 2 wydaje się prawie idealny:

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

Jeśli chodzi o drugą skrajność, jeśli rozmiar testu wynosi 2 próbki, a my przypadkowo oceniamy 2 próbki, które są blisko siebie przez przypadek, będzie to miało znaczący wpływ na wynik r ^ 2, nawet jeśli prognozy są całkiem dobre :

true = [20.2, 20.1] # actual target values from the Boston Housing dataset
predicted = [19, 21]
print(r2_score(true, predicted))
# -449.0
Brian Bien
źródło