2017-08-03 1 views
-1

Ich verwende sklearn.linear_model.LinearRegression und möchte Standardfehler für meine Koeffizienten berechnen. Soweit ich das beurteilen kann, enthält sklearn keine Funktion, die das tut, also muss ich sie manuell berechnen (siehe https://en.wikipedia.org/wiki/Ordinary_least_squares für ein Beispiel für Standardfehler für die Schätzung des linearen Regressionskoeffizienten).Summe der quadrierten Residuen für sklearn.linear_model.LinearRegression

Ich verwende das residents_ Attribut meiner linearen Regression, um die Summe der quadrierten Residuen zu erhalten. Meine Frage ist, über die Dokumentation unter http://scikit-learn.org/stable/modules/generated/sklearn.linear_model.LinearRegression.html, die _residues wie definiert:

residues_: array, Form (n_targets,) oder (1) oder leer ist. Summe von Residuen. Squared Euklidische 2-Norm für jedes Ziel, das während der Passgenauigkeit bestanden. Wenn das lineare Regressionsproblem unterbestimmt ist (die Zahl der linear unabhängigen Zeilen der Trainingsmatrix ist kleiner als die Anzahl der linear unabhängigen Spalten), ist dies ein leeres Array. Wenn der während der Anpassung übergebene Zielvektor 1-dimensional ist, handelt es sich um ein (1,) Shape-Array.

Ist "Summe der Residuen" ein Fehler in der Dokumentation? Ich denke, es sollte "Summe der quadrierten Residuen" sagen. (Die Summe der Residuen in den Trainingsdaten ist für eine lineare Regression immer Null, wenn sie eine Konstante enthält: siehe https://stats.stackexchange.com/questions/194523/why-does-the-sum-of-residuals-equal-0-from-a-graphical-perspective. Der folgende Satz in der Dokumentation sagt auch "quadrierte euklidische 2-Norm", die eine Quadratsumme ist.) Wenn die Dokumentation tatsächlich fehlerhaft ist, wie kann ich das korrigieren?

Edit: Ich kann meinen Verdacht anhand eines einfachen Beispiels bestätigen:

import numpy as np 
from sklearn import linear_model 

n_obs = 5 
X = np.ones((n_obs, 1), dtype=float) 
X[3] = 7.0 
y = np.ones((n_obs,)) 
y[1] = 10.0 
y[3] = 9.0 
model = linear_model.LinearRegression(fit_intercept=True, normalize=False, copy_X=True, n_jobs=1) 

np.isclose(np.sum(np.power(y - model.predict(X=X), 2)), model.residues_) # True 
+1

Wenn Sie glauben, dass dies ein Fehler ist, können Sie ihn auf der [github issues page] (https://github.com/scikit-learn/scikit-learn/issues) veröffentlichen. Wenn Sie Recht haben, werden sie den Fehler korrigieren, wenn Sie nicht sind, erhalten Sie immer noch Informationen darüber, warum dies so geschrieben (oder implementiert) wurde. –

+0

@VivekKumar danke für den Link, ich werde das tun. – Adrian

+0

Veröffentlicht https://github.com/scikit-learn/scikit-learn/issues/9491 – Adrian

Antwort

0

Die Reste direkt aus scipy.linalg.lstsq genommen wurden:

Reste:() oder (1,) oder (K,) ndarray Summe der Reste, quadriert 2-Norm für jede Spalte in b - a x. Wenn der Rang der Matrix a < N oder> M ist oder 'gelsy' verwendet wird, ist dies ein leeres Array. Wenn b 1-D ist, ist dies ein (1,) -Form-Array, ansonsten ist die Form (K,).

Sie scheinen also richtig zu sein.

Das wird gesagt, self.residues_ ist veraltet seit # 5452 (im Oktober 2015 zusammengeführt), und wird in v0.19 entfernt (etwa freigegeben werden). Wie Sie in Ihrem Snippet gezeigt haben, können Sie diese trotzdem einfach berechnen.

Verwandte Themen