PolynomialFeatures LinearRegression ValueError:未对齐的形状

时间:2017-09-25 14:43:23

标签: python numpy

我正在尝试编写一个用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)

你能帮忙吗?

1 个答案:

答案 0 :(得分:1)

你的代码很奇怪。让我们尝试以多种方式重新格式化它:

  • 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)