Python 机器学习多项式回归



  • 多项式回归

    如果您的数据点显然不适合线性回归(所有数据点之间的直线),则可能是多项式回归的理想选择。像线性回归一样,多项式回归使用变量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()
    
    输出如下所示:
    ml
    
    导入numpy和matplotlib再画多项式回归的路线:
    import matplotlib.pyplot as plt
    from scipy import stats
    
    x = [5,7,8,7,2,17,2,9,4,11,12,9,6]
    y = [99,86,87,88,111,86,103,87,94,78,77,85,86]
    
    slope, intercept, r, p, std_err = stats.linregress(x, y)
    
    def myfunc(x):
      return slope * x + intercept
    
    mymodel = list(map(myfunc, x))
    
    plt.scatter(x, y)
    plt.plot(x, mymodel)
    plt.show()
    
    输出如下所示:
    ml
    
    示例说明:::
    导入所需的模块:
    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]
    
    执行一个方法,该方法返回线性回归的一些重要键值:
    slope, intercept, r, p, std_err = stats.linregress(x, y)
    
    NumPy有一种方法可以让我们建立多项式模型:
    mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
    
    然后指定该行的显示方式,我们从位置2开始,在位置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)))
    
    输出如下所示:
    ml
    
    注意: 结果0.94表明存在很好的关系,我们可以在将来的预测中使用多项式回归。
  • 预测未来的值

    现在,我们可以使用收集到的信息来预测未来价值。 示例:让我们尝试预测在下午17点左右通过收费站的汽车的速度: 为此,我们需要与上面的示例相同的数组:
    mymodel = numpy.poly1d(numpy.polyfit(x, y, 3))
    
    预测下午17点过车的速度:
    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)
    
    输出如下所示:
    ml
    
    该示例预测速度为88.87,我们也可以从图中读取:
    ml
    
  • 不合适?

    让我们创建一个示例,其中多项式回归不是预测未来值的最佳方法。
    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()
    
    输出如下::
    ml
    
    和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)))
    
    输出如下所示:
    ml
    
    结果:0.00995表示关系很差,并告诉我们该数据集不适合多项式回归。