簡體   English   中英

PolynomialFeatures LinearRegression ValueError:形狀未對齊

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM