开发手册 欢迎您!
软件开发者资料库

Python 机器学习 多项式回归(Polynomial Regression)

机器学习使计算机从研究数据和统计数据中学习机器学习是向人工智能(AI)方向迈进的一步。机器学习是一个分析数据并学习预测结果的程序。本文主要介绍Python 机器学习 多项式回归(Polynomial Regression)。

1、多项式回归(Polynomial Regression)

如果数据点显然不适合线性回归(所有数据点之间的直线),则可能是多项式回归的理想选择。

像线性回归一样,多项式回归使用变量x和y之间的关系来找到绘制数据点线的最佳方法。

httpswwwwonherocom

2、多项式回归是如何工作的?

Python提供了一些方法来查找数据点之间的关系并绘制多项式回归线。我们将向您展示如何使用这些方法而不是通过数学公式。

在下面的示例中,我们注册了18辆经过特定收费站的汽车。

我们已经记录了汽车的速度,以及一天中经过的时间(小时)。

x轴表示一天中的小时,y轴表示速度:

例如:

首先绘制散点图:

import matplotlib.pyplot as pltx = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]plt.scatter(x, y)plt.show()

 Result:

httpswwwwonherocom

例如: 

导入numpymatplotlib,然后画出多项式回归线:

import numpyimport matplotlib.pyplot as pltx = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))myline = numpy.linspace(1, 22, 100)plt.scatter(x, y)plt.plot(myline, mymodel(myline))plt.show()

Result:

httpswwwwonherocom

示例说明

导入所需的模块。

您可以在我们的NumPy教程中了解有关NumPy模块的信息。

您可以在我们的SciPy教程中了解SciPy模块。

import numpy
import matplotlib.pyplot as plt

创建表示x和y轴值的数组:

x = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]
y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]

NumPy有一种方法可以让我们建立多项式模型:

mymodel =   numpy.poly1d(numpy.polyfit(x, y, 3))

然后指定行的显示方式,我们从位置1开始,到位置22结束:

myline = numpy.linspace(1, 22, 100)

绘制原始散点图:

plt.scatter(x, y)

画出多项式回归线:

plt.plot(myline, mymodel(myline))

显示图:

plt.show()

3、R-平方

重要的是要知道x轴和y轴的值之间的关系有多好,如果没有关系,则多项式回归不能用于预测任何东西。

该关系用一个称为r平方的值测量。

r平方值的范围是0到1,其中0表示不相关,而1表示100%相关。

Python和Sklearn模块将计算该值,所要做的就是将x和y数组提供给它:

例如:

我的数据在多项式回归中的拟合度如何?

import numpyfrom sklearn.metrics import r2_scorex = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))print(r2_score(y, mymodel(x)))

注意:结果0.94表明存在很好的关系,我们可以在将来的预测中使用多项式回归。

4、预测未来值

现在我们可以使用收集到的信息来预测未来价值。

示例:让我们尝试预测在晚上17点左右通过收费站的汽车的速度:

为此,我们需要与上例相同的mymodel数组:

mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))

例如:

预测下午17点过车的速度:

import numpyfrom sklearn.metrics import r2_scorex = [1,2,3,5,6,7,8,9,10,12,13,14,15,16,18,19,21,22]y = [100,90,80,60,60,55,60,65,70,70,75,76,78,79,90,99,99,100]mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))speed = mymodel(17)print(speed)

该示例预测速度为88.87,我们也可以从图中读取:

httpswwwwonherocom

5、判断是否适合使用

让我们创建一个示例,其中多项式回归不是预测未来值的最佳方法。

例如:

x轴和y轴的这些值将导致多项式回归非常不适合:

import numpyimport matplotlib.pyplot as pltx = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))myline = numpy.linspace(2, 95, 100)plt.scatter(x, y)plt.plot(myline, mymodel(myline))plt.show()

 Result:

httpswwwwonherocom

例如:

应该得到一个非常低的r平方值。

import numpyfrom sklearn.metrics import r2_scorex = [89,43,36,36,95,10,66,34,38,20,26,29,48,64,6,5,36,66,72,40]y = [21,46,3,35,67,95,53,72,58,10,26,34,90,33,38,20,56,2,47,15]mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))print(r2_score(y, mymodel(x)))

结果:0.00995表示关系很差,并告诉我们该数据集不适合多项式回归。