web-dev-qa-db-fra.com

Différence entre cross_val_score et cross_val_predict

Je souhaite évaluer un modèle de régression créé avec scikitlearn à l'aide de la validation croisée et de l'inconvénient de ne pas savoir laquelle des deux fonctions cross_val_score et cross_val_predict devrait être utilisée.

cvs = DecisionTreeRegressor(max_depth = depth)
scores = cross_val_score(cvs, predictors, target, cv=cvfolds, scoring='r2')
print("R2-Score: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))

Un autre, utiliser les prédictions cv avec le r2_score standard:

cvp = DecisionTreeRegressor(max_depth = depth)
predictions = cross_val_predict(cvp, predictors, target, cv=cvfolds)
print ("CV R^2-Score: {}".format(r2_score(df[target], predictions_cv)))

Je suppose que les deux méthodes sont valides et donnent des résultats similaires. Mais ce n'est que le cas avec les petits plis k. Bien que r ^ 2 soit à peu près identique pour 10-cv-cv, il devient de plus en plus bas pour des valeurs k plus élevées dans le cas de la première version utilisant "cross_vall_score". La deuxième version n’est généralement pas affectée par le nombre de plis.

Faut-il s'attendre à ce comportement et manque-t-il un peu de compréhension concernant CV dans SKLearn? 

7
Bobipuegi

cross_val_score renvoie le score du pli de test, où cross_val_predict renvoie les valeurs y prévues pour le pli de test.

Pour cross_val_score(), vous utilisez la moyenne de la sortie, qui sera affectée par le nombre de plis, car il se peut que certains plis comportent une erreur élevée (ajustement incorrect).

Alors que cross_val_predict() renvoie, pour chaque élément de l’entrée, la prédiction obtenue pour cet élément lorsqu’il était dans l’ensemble de tests. [Notez que seules les stratégies de validation croisée attribuant tous les éléments à un ensemble de tests peuvent être utilisées] Donc, l'augmentation du nombre de plis n'augmente que les données d'apprentissage pour l'élément de test et, par conséquent, son résultat peut ne pas être beaucoup affecté.

J'espère que cela t'aides. N'hésitez pas à poser des questions.

Edit: Répondre à la question dans le commentaire

Consultez la réponse suivante sur le fonctionnement de cross_val_predict:

Je pense que cross_val_predict sera sur-ajusté car, à mesure que les plis augmentent, plus de données seront utilisées pour le train et moins pour l’essai. L'étiquette résultante dépend donc davantage des données d'apprentissage. En outre, comme déjà indiqué ci-dessus, la prédiction pour un échantillon est effectuée une seule fois, ce qui peut entraîner un fractionnement plus important des données. C'est la raison pour laquelle la plupart des endroits ou des tutoriels recommandent d'utiliser le cross_val_score pour l'analyse.

10
Vivek Kumar

Je pense que la différence peut être clarifiée en inspectant leurs résultats. Considérez cet extrait:

# Last column is the label
print(X.shape)  # (7040, 133)

clf = MLPClassifier()

scores = cross_val_score(clf, X[:,:-1], X[:,-1], cv=5)
print(scores.shape)  # (5,)

y_pred = cross_val_predict(clf, X[:,:-1], X[:,-1], cv=5)
print(y_pred.shape)  # (7040,)

Remarquez les formes: pourquoi sont-elles ainsi? scores.shape a une longueur de 5 car il s'agit d'un score calculé avec une validation croisée sur 5 fois (voir l'argument cv=5). Par conséquent, une seule valeur réelle est calculée pour chaque pli. Cette valeur est le score du classificateur:

Étant donné les étiquettes vraies et les étiquettes prédites, combien de réponses du prédicteur avaient-elles raison dans un repli particulier?

Dans ce cas, les étiquettes y données en entrée sont utilisées deux fois: apprendre des données et évaluer les performances du classifieur.

Par ailleurs, y_pred.shape a la longueur 7040, qui correspond à la forme du jeu de données. C'est la longueur du jeu de données en entrée. Cela signifie que chaque valeur n'est pas un score calculé sur plusieurs valeurs, mais une valeur unique: la prédiction du classificateur:

compte tenu des données d'entrée et de leurs étiquettes, quelle est la prédiction du classificateur sur un exemple spécifique qui était dans un ensemble de tests d'un pli particulier?

Notez que vous ne savez pas quel pli a été utilisé: chaque sortie a été calculée sur les données de test d'un pli donné, mais vous ne pouvez pas dire laquelle (à partir de cette sortie, au moins).

Dans ce cas, les étiquettes ne sont utilisées qu'une seule fois: pour former le classifieur. Il vous incombe de comparer ces sorties aux vraies sorties pour calculer le score. Si vous ne faites que la moyenne, comme vous l'avez fait, la sortie n'est pas un score, c'est simplement la prédiction moyenne.

0