Pourquoi un grand choix de K réduit-il mon score de validation croisée?

11

En jouant avec le Boston Housing Dataset et RandomForestRegressor(avec les paramètres par défaut) dans scikit-learn, j'ai remarqué quelque chose d'étrange: le score moyen de validation croisée a diminué lorsque j'ai augmenté le nombre de plis au-delà de 10. Ma stratégie de validation croisée était la suivante:

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

... où num_cvsétait varié. Je me suis mis test_sizeà 1/num_cvsrefléter le comportement de taille fractionnée train / test du CV k-fold. Fondamentalement, je voulais quelque chose comme CV k-fold, mais j'avais aussi besoin de hasard (d'où ShuffleSplit).

Cet essai a été répété plusieurs fois, et les scores moyens et les écarts-types ont ensuite été tracés.

Aire du cercle ~ K dans la validation croisée du pli en K

(Notez que la taille de kest indiquée par l'aire du cercle; l'écart-type est sur l'axe Y.)

De manière cohérente, une augmentation k(de 2 à 44) entraînerait une brève augmentation du score, suivie d'une diminution régulière au fur et à mesure de l' kaugmentation (au-delà de ~ 10 fois)! Si quoi que ce soit, je m'attendrais à ce que plus de données d'entraînement entraînent une augmentation mineure du score!

Mise à jour

Changer les critères de notation pour signifier une erreur absolue entraîne un comportement que j'attendrais: la notation s'améliore avec un nombre accru de plis dans K-fold CV, plutôt que d'approcher de 0 (comme avec la valeur par défaut, `` r2 ''). La question demeure de savoir pourquoi la métrique de notation par défaut entraîne des performances médiocres dans les métriques moyennes et STD pour un nombre croissant de plis.

Brian Bien
la source
Des enregistrements en double dans vos plis? Cela peut être dû à un sur- ajustement .
A QUIT - Anony-Mousse
1
@ Anony-Mousse Non, car l'ensemble de données de Boston Housing n'a pas d'enregistrements en double et l'échantillonnage de ShuffleSplit ne provoque pas d'enregistrements en double.
Brian Bien
4
Améliorez également votre traçage. Utilisez des barres d'erreur pour afficher la moyenne, + - stddev et min / max. Mettez k sur l'autre axe.
A QUIT - Anony-Mousse
1
Je ne pense pas que plus d'exemples de formation augmentent les chances de surapprentissage. J'ai tracé une courbe d'apprentissage avec cet ensemble de données, en utilisant à nouveau ShuffleSplit (n_splits = 300 avec différentes tailles de test) et j'ai vu une précision constamment accrue à mesure que davantage d'exemples de formation étaient disponibles.
Brian Bien
1
désolé, vous avez raison, plus c'est mieux et mieux c'est 1. Mais vous n'avez pas ce problème si vous utilisez une erreur quadratique ou absolue. Il doit donc faire quelque chose avec le terme d'erreur
rep_ho

Réponses:

1

Le score r ^ 2 n'est pas défini lorsqu'il est appliqué à un échantillon unique (par exemple, CV à sortie unique).

r ^ 2 n'est pas bon pour l'évaluation de petits ensembles de tests: lorsqu'il est utilisé pour évaluer un ensemble de tests suffisamment petit, le score peut être loin dans le négatif malgré de bonnes prédictions.

Pour un échantillon unique, une bonne prédiction pour un domaine donné peut sembler terrible:

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

Augmentez la taille de l'ensemble de test (en conservant la précision des prédictions), et soudain, le score r ^ 2 apparaît presque parfait:

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

Pris à l'autre extrême, si la taille du test est de 2 échantillons, et que nous évaluons par hasard 2 échantillons qui sont proches l'un de l'autre par hasard, cela aura un impact substantiel sur le score r ^ 2, même si les prédictions sont assez bonnes :

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
la source