无法在 sklearn 中拟合多项式回归曲线
Trouble fitting a polynomial regression curve in sklearn
我是 sklearn 的新手,我有一个相当简单的任务:给定一个 15 个点的散点图,我需要
- 取11个作为我的'training sample',
- 通过这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?),但我无法从中提取解决方案。
错误基本上意味着您的 X_train_poly
和 y_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_poly
匹配 y_train
的形状,回归可能会给你想要的东西:
linreg = LinearRegression().fit(X_train_poly, y_train)
linreg.coef_
# array([ 0. , -0.79802899, 0.2120088 , -0.01285893])
问题是 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)
我是 sklearn 的新手,我有一个相当简单的任务:给定一个 15 个点的散点图,我需要
- 取11个作为我的'training sample',
- 通过这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?),但我无法从中提取解决方案。
错误基本上意味着您的 X_train_poly
和 y_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_poly
匹配 y_train
的形状,回归可能会给你想要的东西:
linreg = LinearRegression().fit(X_train_poly, y_train)
linreg.coef_
# array([ 0. , -0.79802899, 0.2120088 , -0.01285893])
问题是 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)