我正在尝试编写一个用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)
你能帮忙吗?
答案 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)