📜  机器学习-多项式回归

📅  最后修改于: 2020-09-27 02:10:51             🧑  作者: Mango

ML多项式回归

  • 多项式回归是一种回归算法,可将因变量(y)与自变量(x)之间的关系建模为n次多项式。多项式回归方程如下:
  • 它也被称为ML中的多元线性回归的特例。因为我们在多元线性回归方程中添加了多项式项,以将其转换为多项式回归。
  • 这是一个线性模型,为了提高精度而进行了一些修改。
  • 多项式回归中用于训练的数据集具有非线性性质。
  • 它利用线性回归模型来拟合复杂的非线性函数和数据集。
  • 因此, “在多项式回归中,原始特征将转换为所需度数(2,3,..,n)的多项式特征,然后使用线性模型进行建模。”

多项式回归的需要:

可以从以下几点理解ML中多项式回归的需求:

  • 如果我们在线性数据集上应用线性模型,则可以像在简单线性回归中看到的那样为我们提供良好的结果,但是如果我们在不对非线性数据集进行任何修改的情况下应用相同的模型,则将产生巨大的输出。由于损失函数会增加,因此错误率会很高,并且准确性会降低。
  • 因此,在这种情况下, 数据点以非线性方式排列,我们需要多项式回归模型 。使用下面的线性数据集和非线性数据集的比较图,我们可以更好地理解它。

  • 在上图中,我们获取了一个非线性排列的数据集。因此,如果我们尝试用线性模型覆盖它,那么我们可以清楚地看到它几乎不能覆盖任何数据点。另一方面,曲线适合于覆盖多项式模型的大多数数据点。
  • 因此, 如果数据集以非线性方式排列,则应使用多项式回归模型代替简单线性回归。

注意:多项式回归算法也称为多项式线性回归,因为它不取决于变量,而是取决于以线性方式排列的系数。

多项式回归模型的方程式:

简单线性回归方程:y = b0 + b1x ………(a)

多元线性回归方程:y = b0 + b1x + b2x2 + b3x3 + …. + bnxn ………(b)

多项式回归方程:y = b0 + b1x + b2x2 + b3x3 + …. + bnxn ……….(c)

当我们比较上述三个方程时,我们可以清楚地看到所有三个方程都是多项式方程,但是变量的程度不同。简单线性方程和多重线性方程也是单次多项式方程,多项式回归方程是第n次线性方程。因此,如果我们在线性方程式中增加一个度数,那么它将被转换为多项式线性方程式。

注意:为了更好地理解多项式回归,您必须具有简单线性回归的知识。

使用Python实现多项式回归:

在这里,我们将使用Python实现多项式回归。通过将多项式回归模型与简单线性回归模型进行比较,我们将了解它。因此,首先,让我们了解要构建模型的问题。

问题描述:有一家人力资源公司,它将雇用新的候选人。候选人已经告诉了他以前的年薪16万,而人力资源部必须检查他是在说实话还是虚张声势。因此,为了确定这一点,他们只拥有他以前公司的数据集,其中提到了前10名职位的薪水及其级别。通过检查可用的数据集,我们发现职位级别和薪水之间存在非线性关系。我们的目标是建立Bluffing检测器回归模型,以便HR可以聘请诚实的候选人。以下是构建此类模型的步骤。

多项式回归的步骤:

多项式回归的主要步骤如下:

  • 数据预处理
  • 建立线性回归模型并将其拟合到数据集
  • 建立多项式回归模型并将其拟合到数据集
  • 可视化线性回归和多项式回归模型的结果。
  • 预测输出。

注意:在这里,我们将建立线性回归模型以及多项式回归,以查看预测之间的结果。线性回归模型可供参考。

数据预处理步骤:

数据预处理步骤将与以前的回归模型相同,只是有所不同。在多项式回归模型中,我们将不使用特征缩放,也不会将数据集拆分为训练和测试集。它有两个原因:

  • 数据集包含的信息很少,不适合将其分为测试和训练集,否则我们的模型将无法找到薪水和水平之间的相关性。
  • 在此模型中,我们需要非常准确的工资预测,因此该模型应具有足够的信息。

预处理步骤的代码如下:

# importing libraries
import numpy as nm
import matplotlib.pyplot as mtp
import pandas as pd

#importing datasets
data_set= pd.read_csv('Position_Salaries.csv')

#Extracting Independent and dependent Variable
x= data_set.iloc[:, 1:2].values
y= data_set.iloc[:, 2].values

说明:

  • 在上面的代码行中,我们导入了重要的Python库以导入数据集并对其进行操作。
  • 接下来,我们导入了数据集“ Position_Salaries.csv “,其中包含三列(位置,级别和薪水),但是我们将仅考虑两列(薪水和级别)。
  • 之后,我们从数据集中提取了因变量(Y)和自变量(X)。对于x变量,我们将参数设为[:,1:2],因为我们想要1个索引(级别),并包括:2使其成为矩阵。

输出:

通过执行以上代码,我们可以将数据集读取为:

从上面的输出中可以看到,存在三列(位置,级别和薪水)。但是,我们仅考虑两列,因为“位置”等同于级别,或者可能被视为“位置”的编码形式。

在这里,我们将预测6.5级的输出,因为该候选人具有4年以上区域经理的经验,因此他必须在7至6级之间。

建立线性回归模型:

现在,我们将建立线性回归模型并将其拟合到数据集。在建立多项式回归时,我们将以线性回归模型为参考,并比较两个结果。代码如下:

#Fitting the Linear Regression to the dataset
from sklearn.linear_model import LinearRegression
lin_regs= LinearRegression()
lin_regs.fit(x,y)

在上面的代码中,我们使用LinearRegression类的lin_regs对象创建了简单线性模型,并将其拟合到数据集变量(x和y)。

输出:

Out[5]: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

建立多项式回归模型:

现在我们将建立多项式回归模型,但是它与简单线性模型有些不同。因为在这里我们将使用预处理库的PolynomialFeatures类。我们正在使用此类为数据集添加一些额外的功能。

 #Fitting the Polynomial regression to the dataset
from sklearn.preprocessing import PolynomialFeatures
poly_regs= PolynomialFeatures(degree= 2)
x_poly= poly_regs.fit_transform(x)
lin_reg_2 =LinearRegression()
lin_reg_2.fit(x_poly, y)

在上面的代码行中,我们使用了poly_regs.fit_transform(x),因为首先我们将特征矩阵转换为多项式特征矩阵,然后将其拟合到多项式回归模型。参数值(度= 2)取决于我们的选择。我们可以根据我们的多项式特征进行选择。

执行代码之后,我们将获得另一个矩阵x_poly,可以在变量资源管理器选项下看到它:

接下来,我们使用了另一个LinearRegression对象lin_reg_2,以将x_poly向量拟合到线性模型。

输出:

Out[11]: LinearRegression(copy_X=True, fit_intercept=True, n_jobs=None, normalize=False)

可视化线性回归的结果:

现在,我们将像在简单线性回归中一样直观地显示线性回归模型的结果。下面是它的代码:

#Visulaizing the result for Linear Regression model
mtp.scatter(x,y,color="blue")
mtp.plot(x,lin_regs.predict(x), color="red")
mtp.title("Bluff detection model(Linear Regression)")
mtp.xlabel("Position Levels")
mtp.ylabel("Salary")
mtp.show()

输出:

在上面的输出图像中,我们可以清楚地看到回归线离数据集很远。预测是红色的直线,而蓝点是实际值。如果我们认为这一产出可预测CEO的价值,则其薪水将约为10美元。 600000 $,这与实际价值相去甚远。

因此,我们需要一个曲线模型来拟合数据集,而不是直线。

可视化多项式回归的结果

在这里,我们将可视化多项式回归模型的结果,该模型的代码与上述模型几乎没有什么不同。

代码如下:

#Visulaizing the result for Polynomial Regression
mtp.scatter(x,y,color="blue")
mtp.plot(x, lin_reg_2.predict(poly_regs.fit_transform(x)), color="red")
mtp.title("Bluff detection model(Polynomial Regression)")
mtp.xlabel("Position Levels")
mtp.ylabel("Salary")
mtp.show()

在上面的代码中,我们采用lin_reg_2.predict(poly_regs.fit_transform(x)而不是x_poly,因为我们希望使用线性回归对象来预测多项式特征矩阵。

输出:

正如我们在上面的输出图像中看到的那样,预测值接近真实值。上面的图会随着我们改变程度而变化。

对于学位= 3:

如果将度数更改为3,则将给出更准确的图,如下图所示。

因此,如我们在上面的输出图像中看到的那样,级别6.5的预测薪水接近170K $ -190k $,这似乎是未来员工在说关于薪水的真相。

度= 4:让我们再次将度更改为4,现在将获得最准确的绘图。因此,我们可以通过增加多项式的次数来获得更准确的结果。

使用线性回归模型预测最终结果:

现在,我们将使用线性回归模型预测最终输出,以查看员工是在说真话还是虚张声势。因此,为此,我们将使用predict()方法并传递值6.5。下面是它的代码:

lin_pred = lin_regs.predict([[6.5]])
print(lin_pred)

输出:

[330378.78787879]

使用多项式回归模型预测最终结果:

现在,我们将使用多项式回归模型预测最终输出,以与线性模型进行比较。下面是它的代码:

poly_pred = lin_reg_2.predict(poly_regs.fit_transform([[6.5]]))
print(poly_pred)

输出:

[158862.45265153]

正如我们所看到的,多项式回归的预测输出为[158862.45265153],它非常接近实际价值,因此,我们可以说未来的员工说的是真的。