在 sklearn 中拟合多项式回归曲线时遇到问题

Posted

技术标签:

【中文标题】在 sklearn 中拟合多项式回归曲线时遇到问题【英文标题】:Trouble fitting a polynomial regression curve in sklearn 【发布时间】:2017-11-15 09:25:30 【问题描述】:

我是 sklearn 的新手,我有一个相当简单的任务:给定一个 15 个点的散点图,我需要

    取其中的 11 个作为我的“训练样本”, 通过这 11 个点拟合 3 次多项式曲线; 在 15 个点上绘制生成的多项式曲线。

但我在第二步卡住了。

这是数据图:

%matplotlib notebook

import numpy as np from sklearn.model_selection 
import train_test_split from sklearn.linear_model 
import LinearRegression from sklearn.preprocessing import PolynomialFeatures

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)

plt.figure() plt.scatter(X_train, y_train, label='training data') 
plt.scatter(X_test, y_test, label='test data') 
plt.legend(loc=4);

然后,我将X_train 中的 11 个点用 3 度的多边形特征转换如下:

degrees = 3
poly = PolynomialFeatures(degree=degree)

X_train_poly = poly.fit_transform(X_train)

然后我尝试通过变换点拟合一条线(注意:X_train_poly.size = 364)。

linreg = LinearRegression().fit(X_train_poly, y_train)

我收到以下错误:

ValueError: Found input variables with inconsistent numbers of samples: [1, 11]

我已经阅读了解决类似且通常更复杂的问题的各种问题(例如Multivariate (polynomial) best fit curve in python?),但我无法从中提取解决方案。

【问题讨论】:

可能重复:***.com/questions/32097392/… 【参考方案1】:

问题是 X_train 和 y_train 中的维度。它是一个单维数组,因此它将每条 X 记录视为一个单独的变量。

如下使用 .reshape 命令应该可以解决问题:

# reshape data to have 11 records rather than 11 columns
X_trainT     = X_train.reshape(11,1)
y_trainT     = y_train.reshape(11,1)

# create polynomial features on the single va
poly         = PolynomialFeatures(degree=3)
X_train_poly = poly.fit_transform(X_trainT)

print (X_train_poly.shape)
# 

linreg       = LinearRegression().fit(X_train_poly, y_trainT)

【讨论】:

【参考方案2】:

该错误基本上意味着您的 X_train_polyy_train 不匹配,其中您的 X_train_poly 只有一组 x 而您的 y_train 有 11 个值。我不太确定你想要什么,但我猜多项式特征不是以你想要的方式生成的。您的代码当前所做的是为单个 11 维点生成 3 次多项式特征。

我认为您想为 11 个点中的每个点(实际上是每个 x)生成 3 次多项式特征。您可以使用循环或列表推导来做到这一点:

X_train_poly = poly.fit_transform([[i] for i in X_train])
X_train_poly.shape
# (11, 4)

现在您可以看到您的 X_train_poly 有 11 个点,每个点都是 4 维的,而不是一个 364 维的点。这个新的X_train_polyy_train 的形状相匹配,回归可能会给你你想要的:

linreg = LinearRegression().fit(X_train_poly, y_train)
linreg.coef_
# array([ 0.        , -0.79802899,  0.2120088 , -0.01285893])

【讨论】:

以上是关于在 sklearn 中拟合多项式回归曲线时遇到问题的主要内容,如果未能解决你的问题,请参考以下文章

带有sklearn的numpy多项式线性回归

插值 回归 拟合 逼近的区别

我可以对 sklearn 进行对数回归吗?

回归-多项式回归算法

回归-多项式回归算法

线回与非线回---sklearn--多项式回归