3 Stimmen

Berechnung des Bestimmungskoeffizienten in Python

Ich versuche, die Determinationskoeffizient (R^2) in Python, aber ich erhalte in bestimmten Fällen einen negativen Wert. Ist das ein Zeichen für einen Fehler in meiner Berechnung? Ich dachte, R^2 sollte zwischen 0 und 1 begrenzt sein.

Hier ist mein Python-Code für die Berechnung, direkt aus dem WP-Artikel angepasst:

>>> yi_list = [1, 1, 63, 63, 5, 5, 124, 124]
>>> fi_list = [1.7438055421354988, 2.3153069186947639, 1002.7093097555808, 63.097699219524706, 6.2635465467410842, 7.2275532522971364, 17.55393551900103, 40.8570]
>>> y_mean = sum(yi_list)/float(len(yi_list))
>>> ss_tot = sum((yi-y_mean)**2 for yi in yi_list)
>>> ss_err = sum((yi-fi)**2 for yi,fi in zip(yi_list,fi_list))
>>> r2 = 1 - (ss_err/ss_tot)
>>> r2
-43.802085810924964

4voto

Dave Webb Punkte 184809

Ihre Umsetzung der Berechnung, wie sie im Wikipedia-Artikel gezeigt wird, scheint mir in Ordnung zu sein.

Laut dem Wikipedia-Artikel:

Werte von R2 außerhalb des Bereichs von 0 bis 1 können auftreten, wenn es zur Messung der Übereinstimmung zwischen beobachteten und modellierten Werten verwendet wird und wenn die "modellierten" Werte nicht durch lineare Regression erhalten werden, je nachdem, welche Formulierung von R2 verwendet wird.

Betrachtet man Ihre Daten, so ist das erwartete modellierte Paar von 63 und 1002.7093097555808 wahrscheinlich die Hauptquelle für die große Varianz.

3voto

Amjad Punkte 2320

Hier ist eine Funktion zur Berechnung des Bestimmtheitsmaßes in Python:

import numpy as np

def rSquare(estimations, measureds):
    """ Compute the coefficient of determination of random data. 
    This metric gives the level of confidence about the model used to model data"""
    SEE =  ((np.array(measureds) - np.array(estimations))**2).sum()
    mMean = (np.array(measureds)).sum() / float(len(measureds))
    dErr = ((mMean - measureds)**2).sum()

    return 1 - (SEE / dErr)

1voto

neil Punkte 3017

Wenn ich mir den Artikel ansehe, denke ich, dass dieses Verhalten angesichts der Eingabedaten zu erwarten ist. In der Einleitung heißt es:

Wichtige Fälle, in denen die rechnerische Definition von R2 je nach der verwendeten Definition negative Werte ergeben kann, treten auf, wenn die Vorhersagen, die mit dem entsprechenden Ergebnis verglichen werden, nicht aus einem Modellanpassungsverfahren unter Verwendung dieser Daten stammen.

Ich kann in den Formeln nichts erkennen, was bedeuten würde, dass der Wert immer im Bereich von 0-1 liegt.

1voto

mb14 Punkte 21522

Nein, kein Fehler in der Formulierung. Ihre Werte sind in keiner Weise korreliert (siehe y3 und f3: 63 und 1002).

Um Ihnen zu zeigen, dass R2 nicht an 0,1 gebunden ist, stellen Sie sich vor, dass eines der f nahezu unendlich ist. Serr wird ebenfalls nahezu unendlich sein, also ist R2 nahezu -unendlich.

Werden Sie nicht zwischen X- und Y-Wert verwirrt?

(Entschuldigung für den Teil mit dem "fast unendlich", aber ich weiß nicht, wie ich es besser ausdrücken kann)

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X