0

Ich experimentiere die Anpassung von 1-3 Grad Polynom Transformation zu den ursprünglichen Daten mit jeweils 100 vorhergesagte Werte. Zuerst habe ich 1) die ursprünglichen Daten umgeformt, 2) fit_transform auf die Testmenge und den Prädiktionsraum (von Datenmerkmalen) angewendet, 3) eine lineare Vorhersage über den Vorhersagebereich erhalten und 4) sie unter Verwendung des folgenden Codes in ein Array exportiert:Python Sklearn Polynom Vorverarbeitung und dimensionale Probleme

from sklearn.linear_model import LinearRegression 
 
from sklearn.preprocessing import PolynomialFeatures 
 
from sklearn.model_selection import train_test_split 
 
np.random.seed(0) 
 
n = 100 
 
x = np.linspace(0,10,n) + np.random.randn(n)/5 
 
y = np.sin(x)+n/6 + np.random.randn(n)/10 
 
x = x.reshape(-1, 1) 
 
y = y.reshape(-1, 1)  
 
pred_data = np.linspace(0,10,100).reshape(-1,1) 
 
results = [] 
 

 
for i in [1, 2, 3] : 
 
    poly = PolynomialFeatures(degree = i) 
 
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0) 
 
    x_poly1 = poly.fit_transform(x_train) 
 
    pred_data = poly.fit_transform(pred_data) 
 
    linreg1 = LinearRegression().fit(x_poly1, y_train) 
 
    pred = linreg1.predict(pred_data) 
 
    results.append(pred) 
 
results 
 

Allerdings habe ich nicht bekommen, was ich wollte, Python nicht eine Reihe von (3, 100) Form zurück, wie ich es erwartet hatte und in der Tat, erhielt ich eine Fehlermeldung

ValueError: shapes (100,10) and (4,1) not aligned: 10 (dim 1) != 4 (dim 0)

Es scheint sich um ein Dimensionsproblem zu handeln, das entweder durch "Umformen" oder durch den Schritt "fit_transform" entsteht. Ich war verwirrt, da dies ein einfacher Test sein sollte. Würde mich jemand darüber aufklären? Es wird sehr geschätzt werden.

Vielen Dank.

Mit freundlichen Grüßen,

+0

Sie sollten immer nur 'transform()' auf Testdaten, die 'pred_data' in Ihrem Fall aufrufen. 'fit_transform()' call vergisst die vorherigen Aufrufe und lernt die Daten erneut und kann zu unterschiedlichen Dimensionen führen. –

+0

Ich habe versucht, mit poly.transform() auf pred_data, Python immer noch eine Fehlermeldung zurückgegeben: X Form entspricht nicht Trainingsform. –

Antwort

0

Erstens, wie ich in Kommentar vorgeschlagen, sollten Sie immer nur transform() auf Testdaten aufrufen (pred_data in Ihrem Fall).

Aber selbst wenn Sie das tun, tritt ein anderer Fehler auf. Der Fehler ist auf diese Linie:

pred_data = poly.fit_transform(pred_data)

Hier können Sie das Original pred_data mit der transformierten Version ersetzen. So für die erste Iteration der Schleife, es funktioniert, aber für die zweite und dritte Iteration wird es ungültig, weil es die ursprüngliche pred_data der Form (100,1) erfordert in dieser Zeile definiert über die for-Schleife:

pred_data = np.linspace(0,10,100).reshape(-1,1)

Ändern Sie den Namen der Variablen in der Schleife in etwas anderes und alles funktioniert gut.

for i in [1, 2, 3] : 
    poly = PolynomialFeatures(degree = i) 
    x_train, x_test, y_train, y_test = train_test_split(x, y, random_state=0) 
    x_poly1 = poly.fit_transform(x_train) 

    # Changed here 
    pred_data_poly1 = poly.transform(pred_data) 

    linreg1 = LinearRegression().fit(x_poly1, y_train) 
    pred = linreg1.predict(pred_data_poly1) 
    results.append(pred) 
results