[英]PolynomialFeatures LinearRegression ValueError: shapes not aligned
我試圖編寫一個函數來訓練和測試帶有PolynomialFeatures的LinearRegression。 這是我的代碼:
def get_lr2(pdeg):
from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures
from sklearn.metrics.regression import r2_score
from sklearn.model_selection import train_test_split
import numpy as np
import pandas as pd
np.random.seed(0)
n = 15
x = np.linspace(0,10,n) + np.random.randn(n)/5
y = np.sin(x)+x/6 + np.random.randn(n)/10
X_train, X_test, y_train, y_test = train_test_split(x, y, random_state=0)
test_data = np.linspace(0,10,100).reshape(100,1)
X_trainT = X_train.reshape(-1,1)
y_trainT = y_train.reshape(-1,1)
poly = PolynomialFeatures(degree=pdeg)
X_poly = poly.fit_transform(X_trainT)
X_train1, X_test1, y_train1, y_test1 = train_test_split(X_poly, y_trainT, random_state = 0)
linreg1 = LinearRegression().fit(X_train1, y_train1)
return linreg1.predict(test_data)
當我調用函數(get_lr2(1))時
-------------------------------------------------------------------------
ValueError Traceback (most recent call last)
---> 84 get_lr2(1)
<ipython-input-29-a9966181155e> in get_lr2(pdeg)
23 X_train1, X_test1, y_train1, y_test1 = train_test_split(X_poly, y_trainT, random_state = 0)
24 linreg1 = LinearRegression().fit(X_train1, y_train1)
---> 25 return linreg1.predict(test_data)
ValueError: shapes (100,1) and (2,1) not aligned: 1 (dim 1) != 2 (dim 0)
你能幫我嗎?
您的代碼很奇怪。 讓我們嘗試以幾種方式重新格式化它:
Train_test _split。
您先進行train_test_split
,然后丟棄測試集並創建另一個。 這很奇怪。 如果您希望火車測試拆分大小比例為15/100,請在train_test_split選項中進行設置。 因此測試大小應為100/(100+15) ~= 0.87
。
預處理。
如果要應用某些預處理(此處為多項式特征)轉換器,則可以將它們應用於整個數據集,而不是拆分。 如果轉換器依賴於數據,則情況並非如此(在這種情況下,您必須在訓練集上執行fit_transform
,然后僅在測試集上進行transform
),但在您的情況下,這並不重要。
重塑。
經過改進后,您應該只在一個位置進行重塑-初始化x。 Scikit學習模型期望您的X數據是矩陣或列向量(如果僅提供一項功能)。 因此,這里reshape(-1,1)
會將行向量變為列向量。
因此,代碼將如下所示:
def get_lr2(pdeg):
np.random.seed(0)
n = 115
x = (np.linspace(0,10,n) + np.random.randn(n)/5).reshape(-1,1)
y = np.sin(x)+x/6 + np.random.randn(n)/10
X_poly = PolynomialFeatures(degree=pdeg).fit_transform(x)
X_train, X_test, y_train, y_test = train_test_split(X_poly, y, random_state=0, test_size=0.87)
linreg1 = LinearRegression().fit(X_train, y_train)
return linreg1.predict(X_test)
get_lr2(2)
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.