机器学习 - 线性回归
回归
当您尝试查找变量之间的关系时,就会使用回归这个术语。
在机器学习和统计建模中,这种关系用于预测未来事件的结果。
线性回归
线性回归利用数据点之间的关系,在所有数据点之间绘制一条直线。
这条线可以用于预测未来的值。
在机器学习中,预测未来非常重要。
它是如何工作的?
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()
结果
运行示例 »示例
导入 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()
结果
运行示例 »示例说明
导入您需要的模块。
您可以在我们的 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()
R 代表关系
了解 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 表明关系非常差,并告诉我们这个数据集不适合线性回归。