0

Ich versuche, lineare Regression verwenden, um ein Polynom zu einer Reihe von Punkten aus einem sinusförmigen Signal mit etwas Rauschen hinzugefügt, mit linear_model.LinearRegression von sklearn. Wie erwartet, nehmen die Trainings- und Validierungswerte zu, wenn der Grad des Polynoms ansteigt, aber nach einem gewissen Grad werden 20 Dinge merkwürdig und die Werte beginnen zu sinken, und das Modell gibt Polynome zurück, die überhaupt nicht aussehen wie die Daten, mit denen ich es trainiere.Zug Punktzahl verringert sich nach polynomialen Regressionsgrad erhöht

Im Folgenden sind einige Flächen, auf denen dies zu sehen ist, sowie der Code, der sowohl die Regressionsmodelle und die Plots generiert:

How the thing works well until degree=17. Original data VS predictions

After that it just gets worse

Validation curve, increasing the degree of the polynomium

from sklearn.pipeline import make_pipeline 
import numpy as np 
import matplotlib.pyplot as plt 
from sklearn.linear_model import LinearRegression 
from sklearn.preprocessing import PolynomialFeatures 
from sklearn.learning_curve import validation_curve 

def make_data(N, err=0.1, rseed=1): 
    rng = np.random.RandomState(1) 
    x = 10 * rng.rand(N) 
    X = x[:, None] 
    y = np.sin(x) + 0.1 * rng.randn(N) 
    if err > 0: 
     y += err * rng.randn(N) 
    return X, y 

def PolynomialRegression(degree=4): 
    return make_pipeline(PolynomialFeatures(degree), 
         LinearRegression()) 


X, y = make_data(400) 

X_test = np.linspace(0, 10, 500)[:, None] 
degrees = np.arange(0, 40) 

plt.figure(figsize=(16, 8)) 
plt.scatter(X.flatten(), y) 
for degree in degrees: 
    y_test = PolynomialRegression(degree).fit(X, y).predict(X_test) 
    plt.plot(X_test, y_test, label='degre={0}'.format(degree)) 
plt.title('Original data VS predicted values for different degrees') 
plt.legend(loc='best'); 


degree = np.arange(0, 40) 
train_score, val_score = validation_curve(PolynomialRegression(), X, y, 
               'polynomialfeatures__degree', 
               degree, cv=7) 

plt.figure(figsize=(12, 6)) 
plt.plot(degree, np.median(train_score, 1), marker='o', 
     color='blue', label='training score') 
plt.plot(degree, np.median(val_score, 1), marker='o', 
     color='red', label='validation score') 
plt.legend(loc='best') 
plt.ylim(0, 1) 
plt.title('Learning curve, increasing the degree of the polynomium') 
plt.xlabel('degree') 
plt.ylabel('score'); 

Ich kenne die Erwartungen d) dass der Validierungswert sinkt, wenn die Komplexität des Modells zunimmt, aber warum sinkt der Trainingswert? Was kann ich hier vermissen? Vielen Dank!

Antwort

0

Es wird erwartet, dass der Trainingswert aufgrund der Überanpassung des Modells an Trainingsdaten ebenfalls sinkt. Der Fehler bei der Validierung sinkt aufgrund der Taylor-Reihenentwicklung der Sinusfunktion. Wenn Sie also den Grad des Polynoms erhöhen, verbessert sich Ihr Modell, um besser zur Sinuskurve zu passen. Wenn Sie im Idealfall keine Funktion haben, die unendlich weit expandiert, sehen Sie einen Trainingsfehler (nicht monoton, aber im Allgemeinen) und einen Validierungsfehler, der nach einem gewissen Grad steigt (hoch für niedrigere Werte -> niedrig) für einen höheren Grad -> danach steigend.

Verwandte Themen