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
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!