目录

机器学习 - 多项式回归


多项式回归

如果您的数据点显然不适合线性回归(穿过所有数据点的直线),那么它可能是多项式回归的理想选择。

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


它是如何工作的?

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

在下面的示例中,我们登记了 18 辆汽车,因为它们正在通过某个收费站。

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

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

示例

首先绘制散点图:

import matplotlib.pyplot as plt

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]

plt.scatter(x, y)
plt.show()

结果:

运行示例 »

示例

Importnumpy matplotlib然后画出多项式回归线:

import numpy
import matplotlib.pyplot as plt

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]

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()

结果:

运行示例 »

示例解释

导入您需要的模块。

您可以在我们的中了解 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()



R 平方

了解 x 轴和 y 轴值之间的关系非常重要,如果没有关系,则多项式回归不能用于预测任何内容。

这种关系是用一个称为 r 平方的值来衡量的。

r 平方值的范围为 0 到 1,其中 0 表示没有关系,1 表示 100% 相关。

Python 和 Sklearn 模块将为您计算这个值,您所要做的就是向它提供 x 和 y 数组:

示例

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

import numpy
from sklearn.metrics import r2_score

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]

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

print(r2_score(y, mymodel(x)))
亲自试一试»

笔记:结果0.94表明存在非常好的关系,我们可以在以后的预测中使用多项式回归。


预测未来值

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

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

为此,我们需要同样的mymodel上面示例中的数组:

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

示例

预测 17:00 驶过的汽车的速度:

import numpy
from sklearn.metrics import r2_score

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]

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

speed = mymodel(17)
print(speed)
运行示例 »

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


不合身?

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

示例

x 轴和 y 轴的这些值应该会导致多项式回归的拟合效果非常差:

import numpy
import matplotlib.pyplot as plt

x = [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()

结果:

运行示例 »

r 平方值呢?

示例

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

import numpy
from sklearn.metrics import r2_score

x = [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 表明关系非常糟糕,并告诉我们该数据集不适合多项式回归。