Scikit-learn est de retour coefficient de détermination (R^2) les valeurs inférieures à -1
Je suis en train de faire un modèle linéaire simple. J'ai
fire = load_data()
regr = linear_model.LinearRegression()
scores = cross_validation.cross_val_score(regr, fire.data, fire.target, cv=10, scoring='r2')
print scores
qui donne
[ 0.00000000e+00 0.00000000e+00 -8.27299054e+02 -5.80431382e+00
-1.04444147e-01 -1.19367785e+00 -1.24843536e+00 -3.39950443e-01
1.95018287e-02 -9.73940970e-02]
Comment est-ce possible? Lorsque je fais la même chose avec la construction dans le diabète de données, il fonctionne parfaitement bien, mais pour mes données, il renvoie ces apparemment des résultats absurdes. Ai-je fait quelque chose de mal?
Pour que cela se produise avec un
LinearRegression
, votre modèle doit être si mauvais que prédire une simple moyenne tous les temps serait mieux. Habituellement, cela signifie que votre modèle est en cours de montage. Voir ma réponse ci-dessous pour plus de détails, ou essayez le réglage cv
un nombre plus petit.OriginalL'auteur rhombidodecahedron | 2014-04-12
Vous devez vous connecter pour publier un commentaire.
Il n'y a pas de raison
r^2
ne devrait pas être négatif (malgré le^2
dans son nom). Ceci est également indiqué dans le doc. Vous pouvez voirr^2
que la comparaison de votre ajustement du modèle (dans le contexte de la régression linéaire, l'e.g un modèle d'ordre 1 (affine)) à un modèle d'ordre 0 (juste à côté d'une constante), à la fois par minimisation d'un carré de perte. La constante de minimiser l'erreur quadratique est la moyenne. Puisque vous faites de la croix de validation avec le bouton gauche de données, il peut arriver que la moyenne de votre jeu de test est très différent de la moyenne de votre formation. Cela seul peut induire beaucoup plus engagés erreur quadratique de prédiction rapport à la prévision de la moyenne des données de test, ce qui donne un résultat négatifr^2
score.Dans le pire des cas, si vos données ne permettent pas d'expliquer à votre cible, ces scores peuvent devenir très fortement négatif. Essayez
Ce qui devrait résulter en négatif
r^2
valeurs.La grande question est maintenant de savoir si cela est dû au fait que les modèles linéaires il suffit de ne pas trouver quelque chose dans vos données, ou à autre chose qui peut être fixé dans le pré-traitement de vos données. Avez-vous essayé de mise à l'échelle de vos colonnes pour avoir de moyenne 0 et de variance 1? Vous pouvez faire cela en utilisant
sklearn.preprocessing.StandardScaler
. Comme une question de fait, vous devez créer un nouvel estimateur par la concaténation d'unStandardScaler
et laLinearRegression
dans un pipeline à l'aidesklearn.pipeline.Pipeline
.Ensuite, vous pouvez essayer de régression Ridge.
R^2 est délimitée au-dessus de 1,0, mais il n'est pas délimitée ci-dessous. Corrélation est toujours délimitée entre -1 et 1.
Tout simplement parce que
R^2
peut être négatif, il ne signifie pas que nous devrions attendre d'elle. Veuillez voir ma réponse ci-dessous pour des raisons deR^2
peut être négatif et comment les corriger.OriginalL'auteur eickenberg
R2 = 1 - RSS /TSS, où RSS est la somme résiduelle des carrés ∑(y - f(x))2 et le TSS est la somme totale des carrés ∑(y - mean(y))2. Maintenant, pour R2 ≥ -1, il est nécessaire que le RSS/TSS ≤ 2, mais il est facile de construire un modèle de dataset et pour qui ce n'est pas vrai:
OriginalL'auteur Fred Foo
Juste parce que
R^2
peut être négatif ne signifie pas qu'il devrait être.Possibilité 1: un bug dans votre code.
Une commune bug que vous devriez vérifier est que vous êtes de passage dans les paramètres correctement:
Possibilité 2: les petits jeux de données
Si vous êtes l'obtention d'un négatif de R^2, vous pouvez aussi consulter pour plus de côté. Gardez à l'esprit que
cross_validation.cross_val_score()
ne fait pas de manière aléatoire shuffle vos entrées, donc si votre échantillon sont envoyés par inadvertance (par date, par exemple), alors vous pouvez construire des modèles sur chaque pli qui ne sont pas prédictifs pour les autres plis.Essayez de réduire le nombre de fonctionnalités, l'augmentation du nombre d'échantillons, et en diminuant le nombre de plis (si vous utilisez
cross_validation
). Il n'existe pas de règle officielle ici, votrem x n
dataset (oùm
est le nombre d'échantillons etn
est le nombre de fonctionnalités) devraient être d'une forme oùet quand vous à l'aide de la validation croisée avec
f
que le nombre de plis, vous devriez viser pourvrai, mais je crois que dans la plupart des cas, il sera légèrement négative. la raison en fait, j'ai découvert cette question était parce que j'étais un
R^2
d'environ-0.99
, et il s'est avéré que je n'avais tout simplement renversé y_true et y_pred dansr2_score
. J'imagine que beaucoup d'utilisateurs ont de même idiot de bugs.Oui, observation intéressante! En effet, si les prévisions ont moins de variance que la cible (ce qui est généralement le cas si par exemple bruit additif est impliqué) ce qui va rendre la R^2 arbitrairement bas. Bon pour avoir ce qui est écrit ici, il peut conduire à beaucoup de gens passent moins de temps avec ce type de bug.
OriginalL'auteur mgoldwasser
Si vous obtenez négatif de régression r^2 scores, assurez-vous de retirer tout identifiant unique (par exemple, "id" ou "rownum") à partir de votre jeu de données avant le montage de la notation du modèle. Vérification Simple, mais il va vous faire économiser des maux de tête de temps.
OriginalL'auteur Alexus Wong