对多项式回归的基本理解存在问题

数据挖掘 scikit-学习 回归 线性回归 正则化
2021-09-20 01:35:29

我对简单的线性回归有所了解。清除会在此处输入图像描述产生如下拟合线: 在此处输入图像描述

然而,研究多项式回归对于过程有一些疑问是一个挑战。我理解拟合曲线“线”可以更精确地跟踪数据的想法。但是在 scikit-learn 中看到以下 Python 代码:

from sklearn.linear_model import LinearRegression
from sklearn.preprocessing import PolynomialFeatures

x = 2 - 3 * np.random.normal(0, 1, 20)
y = x - 2 * (x ** 2) + 0.5 * (x ** 3) + np.random.normal(-3, 3, 20)

x = x[:, np.newaxis]
y = y[:, np.newaxis]

polynomial_features= PolynomialFeatures(degree=2)
x_poly = polynomial_features.fit_transform(x)

model = LinearRegression()
model.fit(x_poly, y)
y_poly_pred = model.predict(x_poly)

对我来说,这里我们“只是”将原始特征投影到二阶新多项式特征中,同时仍然拟合简单(直线)线。尽管如此,我们还是得到了以下带有神奇曲线的解决方案:

在此处输入图像描述

这里出现了我的问题:

  • 当我们只引入一些新特征但仍然符合原始线性回归模型时,图 1 中的直线怎么会变成图 2 中的曲线?A 看不到为什么相同的估计器在案例 1 中能够找到曲线时却无法在案例 2 中找到曲线?在案例 2 的语法中没有提示估计器“好的,让我们现在应用曲线而不是直线”,对吧?
  • 我读到多项式回归仍然是线性的,这句话的确切解释是什么?“线性”不是直线,而是曲线,这是要表达的意思吗?如果是这样,什么是“非线性”?
  • 此外,在阅读了多项式回归的惩罚项后,我了解到高阶特征的引入具有系数趋于随幅度增长的效果。这在此处进行了说明:

在此处输入图像描述

我无法在这里弄清楚为什么一个特定的相同特征(如 x_1)的系数会增加,只是因为有更多的附加多项式(例如 x_2、x_3 等),而只是独自一人保持低位?相当混乱。

3个回答

“线性回归”(又名“普通最小二乘法”,OLS)是指估计量的类型。这里的线性意味着您最小化给定(线性加性)回归方程的残差平方和。您可以编写一个简单的模型:

是的=β0+β1X1+.

这将适合具有截距的线性函数β0和坡度β1. 所以“拟合”函数将是:

F(X)=β0+β1X.

您可以“提议”基本上任何要由线性模型拟合的函数形式,例如使用平方项(只需添加X2作为特征):

是的=β0+β1X1+β2X12+.

这将为您提供(估计的)二次函数:

F(X)=β0+β1X+β2X2.

本质上,您可以添加任何类型的线性变换X,例如lG(X),eXp(X)等等。

“非线性”模型(没有真正明确的定义),例如逻辑回归、非参数回归、基于树的模型、神经网络等。而每个系数β直接在线性(OLS)回归中为您提供“边际效应”,其他(非线性)模型并非如此。

当您在线性模型中使用正则化时,您只需在损失函数中添加一个惩罚项,因此您可以最小化给定惩罚项的残差平方和。但是,关于您的最后一个问题,我不太确定您的实际问题是什么。

在我看来,你不明白什么是多项式回归。

  1. 一般来说,当您应用多项式回归时,您会为多项式的每个 x 次方添加一个新特征。当你写 :polynomial_features= PolynomialFeatures(degree=2)这意味着你有degree=2,这意味着你在你的训练数据集中添加了一个新的特征,其中填充了 x^2。这意味着如果在您的第​​一个示例中您有 :Y' = theta0 + x * theta1现在您将拥有 : Y' = theta0 + x * theta1 + x^2 * theta2这是由曲线表示的二次函数。

  2. 多项式回归是线性的,因为实际上您有Y' = Theta * X,其中 Theta 和 X 是向量。例如,在非线性算法中sigmoid(Theta * X)(例如用于神经网络)。

  3. 不能说在任何情况下系数都会增加,这取决于您拥有的数据和您的模型。如果您想避免 Theta 中的值之间存在巨大差异,您应该对您的训练和测试数据集应用归一化。

在这里,我使用一个工作示例来主要回答您的前 2 个问题,其中包含一些基于此 scikit-learn 示例的代码。让我们生成如下粗抛物线:

import numpy as np
import matplotlib.pyplot as plt

def f(x):
    """ function to approximate by polynomial interpolation"""
    return np.square(x)

# generate points used to plot
x_plot = np.linspace(-30, 30, 100)

# generate points and keep a subset of them
x = np.linspace(-30, 30, 100)
rng = np.random.RandomState(0)
rng.shuffle(x)
x = np.sort(x[:20])
y_true = f(x)

#let's include some noise so it is not a perfect parabola:
y_true = [y + np.random.randint(-30, 30, 1) for y in y_true]
y_true = np.array(y_true).reshape(len(y_true), )

出于演示的原因,我们还可以绘制在将我们的模型拟合到这条抛物线后我们期望获得的回归线:

在此处输入图像描述

现在的问题确实是,我们如何在这些数据上拟合线性模型?让我们添加一个更高维度的特征(我们期望 2 级就足够了):

# New input values with additional feature
import numpy as np
from sklearn.preprocessing import PolynomialFeatures

poly = PolynomialFeatures(2)
poly_transf_X = poly.fit_transform(X)

如果您使用令人惊叹的 plotly 库绘制它,您可以看到新的 3D 数据集(添加了 degree-2 新功能)如下(抱歉,我将这个动画图中的实际y值命名为 'z'):

在此处输入图像描述

如您所见,f(x) 值(图中的 z 分量)对于 x 值具有抛物线形式,但对于 x^2 值(此动画图上的 y 轴)具有线性形状!这就是重点。

这样,我们期望如果我们在这个新数据集上使用线性回归作为最终模型的算法,x^2 值特征的系数应该接近 1,而 x 值特征的系数(原始的)应该接近 0,因为它不能解释我们的基本真值 y 值的形状。

from sklearn.linear_model import Ridge, LinearRegression

reg = LinearRegression().fit(poly_transf_X, y_true)
reg.predict(poly_transf_X)
score = reg.score(poly_transf_X, y_true)

在此处输入图像描述

我们最终可以在 3D 数据集上绘制真实的 y 值和预测值,通过添加 x^2 值特征检查线性回归是否确实完美(这里我最终将 y 值命名为 y 轴: ) ):

在此处输入图像描述