目录
1、多项式回归
2、R-Squared
1、多项式回归
如果在实际中数据点显然不适合线性回归(穿过数据点之间的直线),那么多项式回归可能是理想的选择
像线性回归一样,多项式回归使用变量 x 和 y 之间的关系来找到绘制数据点线的最佳方法
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()
结果如下
导入所需模块和创建表示 x 和 y 轴值的数组
import numpy
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]
NumPy 有一种方法可以让我们建立多项式模型
`numpy.polyfit(x, y, n)` 是 NumPy 库中的一个函数,用于根据给定的数据点拟合一个 n 次多项式模型。其中,`x` 和 `y` 分别是输入的数据点的自变量和因变量,`n` 是多项式的阶数(即次数)
`numpy.polyfit(x, y, n)` 函数返回的是一个多项式系数数组,这个数组中存储了拟合的多项式模型的各项系数
`numpy.poly1d()` 是 NumPy 库中的一个函数,用于根据多项式系数创建一个多项式对象。这个多项式对象可以用于计算多项式在某个点的取值,求导、积分等操作
mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
然后指定行的显示方式,我们从位置 1 开始,到位置 22 结束
# 100 表示拟合的程度,通过实际调整来拟合曲线是否平滑
myline = numpy.linspace(1, 22, 100)
绘制原始散点图、画出多项式回归线、显示图表
plt.scatter(x, y)plt.plot(myline, mymodel(myline))plt.show()
上面的代码如下
import numpy
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]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()
2、R-Squared
重要的是要知道 x 轴和 y 轴的值之间的关系有多好,如果没有关系,则多项式回归不能用于预测任何东西
该关系用一个称为 r 平方( r-squared)的值来度量
r 平方值的范围是 0 到 1,其中 0 表示不相关,而 1 表示 100% 相关
Python 和 Sklearn 模块计算该值,我们只需要将 x 和 y 值提供给它
import numpy
from 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 表明存在很好的关系,我们可以在将来的预测中使用多项式回归
使用是上面的数据预测在晚上 17 点左右通过收费站的汽车的速度
`numpy.poly1d()` 是 NumPy 库中的一个函数,用于根据多项式系数创建一个多项式对象。这个多项式对象可以用于计算多项式在某个点的取值,求导、积分等操作
import numpy
from 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)
预测还是符合正常认知的