当您尝试查找变量之间的关系时,会使用术语回归。
在机器学习和统计建模中,这种关系用于预测未来事件的结果。
线性回归利用数据点之间的关系来绘制一条穿过所有数据点的直线。
这条线可用于预测未来值。
在机器学习中,预测未来非常重要。
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()
Importscipy
并绘制线性回归线:
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()
导入您需要的模块。
您可以在我们的中了解 Matplotlib 模块Matplotlib 教程。
您可以在我们的中了解 SciPy 模块SciPy 教程。
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()
了解 x 轴值和 y 轴值之间的关系非常重要,如果没有关系,则线性回归不能用于预测任何内容。
这种关系——相关系数——被称为r
。
这个r
值范围从 -1 到 1,其中 0 表示没有关系,1(和 -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)
亲自试一试 »
笔记:结果-0.76表明存在某种关系,虽然并不完美,但它表明我们可以在未来的预测中使用线性回归。
现在我们可以使用收集到的信息来预测未来值。
示例:让我们尝试预测一辆 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)
运行示例 »
该示例预测的速度为 85.6,我们也可以从图中看出:
让我们创建一个示例,其中线性回归不是预测未来值的最佳方法。
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()
还有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)
亲自试一试 »
结果:0.013表明关系非常糟糕,并且告诉我们这个数据集不适合线性回归。
截取页面反馈部分,让我们更快修复内容!也可以直接跳过填写反馈内容!