Python 机器学习线性回归

  • 回归

    当您尝试查找变量之间的关系时,将使用术语回归。在机器学习和统计建模中,该关系用于预测未来事件的结果。
  • 线性回归

    线性回归使用数据点之间的关系在所有数据点之间画一条直线。这条线可以用来预测未来的值。在机器学习中,预测未来非常重要。
    它是如何工作的?
    Python提供了一些方法来查找数据点之间的关系并绘制线性回归线。我们将向您展示如何使用这些方法而不是通过数学公式。在下面的示例中,x轴表示车龄,y轴表示速度。我们已经记录了13辆汽车通过收费站时的年龄和速度。让我们看看我们收集的数据是否可以用于线性回归:
    首先绘制散点图:
    import matplotlib.pyplot as plt
    
    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]
    
    plt.scatter(x, y)
    plt.show()
    输出如下所示:
    ml
    导入scipy并绘制线性回归线:
    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 matplotlib.pyplot as plt
    from scipy import stats
    创建表示x和y轴值的数组:
    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)
    创建一个使用slope 和 intercept值返回新值的函数。这个新值表示相应的x值将在y轴上放置的位置:
    def myfunc(x):
      return slope * x + intercept
    通过函数运行x数组的每个值。这将产生一个新的数组,其中的y轴具有新的值:
    mymodel = list(map(myfunc, x))
    绘制原始散点图:
    plt.scatter(x, y)
    画出线性回归线:
    plt.plot(x, mymodel)
    显示图:
    plt.show()
  • R平方

    重要的是要知道x轴的值与y轴的值之间的关系有多好,如果没有关系,则线性回归不能用于预测任何东西。该关系用一个称为r平方的值来度量。r平方值的范围是0到1,其中0表示不相关,而1表示100%相关。Python和Scipy模块将为您计算该值,您所要做的就是将x和y值提供给它:
    我的数据在线性回归中的拟合度如何?
    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)
    
    print(r)
    输出如下所示:
    ml
    注意:结果-076表明存在某种关系,但不是完美的关系,但它表明我们可以在将来的预测中使用线性回归。
  • 预测未来的值

    现在,我们可以使用收集到的信息来预测未来价值。示例:让我们尝试预测一辆拥有10年历史的汽车的速度。为此,我们需要myfunc()上面示例中的相同函数:
    def myfunc(x):
      return slope * x + intercept
    预测一辆有10年历史的汽车的速度:
    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
    
    speed = myfunc(10)
    
    print(speed)
    输出如下所示:
    ml
    该示例预测速度为85.6,我们也可以从图中读取:
    ml
  • 不合适?

    让我们创建一个示例,其中线性回归并不是预测未来价值的最佳方法。
    x和y轴的这些值将导致线性回归的拟合度非常差:
    import matplotlib.pyplot as plt
    from scipy import stats
    
    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]
    
    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
    和r平方值
    您应该得到一个非常低的r平方值。
    import numpy
    from scipy import stats
    
    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]
    
    slope, intercept, r, p, std_err = stats.linregress(x, y)
    
    print(r)
    输出如下所示:
    ml
    结果:0.013表示非常差的关系,并告诉我们该数据集不适合线性回归。