我正在尝试使用每个100个预测值对原始数据进行1-3次多项式变换。我首先1)重新塑造原始数据,2)在测试集和预测空间(数据特征)上应用fit_transform,3)在预测空间上获得线性预测,4)使用以下代码将它们导出到数组中:
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

然而,我没有得到我想要的东西,Python没有像我期望的那样返回(3,100)形状的数组,事实上,我收到了一条错误消息
ValueError: shapes (100,10) and (4,1) not aligned: 10 (dim 1) != 4 (dim 0)

似乎是由"重塑"产生的尺寸问题或者来自" fit_transform"步。我感到困惑,因为这应该是简单的测试。有人可以开导我这个吗?非常感谢。
谢谢。
此致
答案 0 :(得分:0)
首先,正如我在评论中建议的那样,您应该始终只在transform()
上调用测试数据(pred_data
)。
但即使你这样做,也会发生不同的错误。错误是由于这一行:
pred_data = poly.fit_transform(pred_data)
在这里,您将使用已转换的版本替换原始pred_data
。因此,对于循环的第一次迭代,它可以工作,但是对于第二次和第三次迭代,它变得无效,因为它需要在for循环上方的这一行中定义的形状({1}}的原始pred_data
:
pred_data = np.linspace(0,10,100).reshape(-1,1)
将循环中变量的名称更改为其他名称,并且一切正常。
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