目录
1、线性回归
2、R-Squared
1、线性回归
在机器学习和统计建模中,这种关系用于预测未来事件的结果
线性回归使用数据点之间的关系在所有数据点之间画一条直线
这条线可以用来预测未来的值
在机器学习中,预测未来非常重要。比如房价、股票等预测
Python 提供了一些方法来查找数据点之间的关系并绘制线性回归线。下面展示如何使用这些方法而不是通过数学公式。
在下面的示例中,x 轴表示车龄,y 轴表示速度。我们已经记录了 13 辆汽车通过收费站时的车龄和速度。让我们看看我们收集的数据是否可以用于线性回归
首先通过python绘制散点图如下
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
并绘制线性回归线
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]
执行一个方法,使用了 `scipy` 库中的 `stats` 模块中的 `linregress()` 函数对 `x` 和 `y` 数组进行了线性回归分析,并将分析结果保存在 5 个变量中,分别是 `slope`、`intercept`、`r`、`p` 和 `std_err`。
`slope`:回归系数,表示自变量 `x` 对因变量 `y` 的影响程度。它的值为回归直线的斜率,可以用来衡量 `x` 和 `y` 之间的线性关系强度。如果 `slope` 的值为正数,则表示 `x` 和 `y` 之间呈正相关关系;如果 `slope` 的值为负数,则表示 `x` 和 `y` 之间呈负相关关系;如果 `slope` 的值为 0,则表示 `x` 和 `y` 之间没有线性关系。
`intercept`:截距,表示回归直线和 y 轴的交点。它的值为回归直线在 y 轴上的截距,用于计算当 `x` 为 0 时,`y` 的预测值
`r`:相关系数(拟合度),表示 `x` 和 `y` 之间的相关性强度,取值范围为 [-1, 1]。它的值越接近 1 或 -1,表示 `x` 和 `y` 之间线性关系越强;如果 `r` 的值为 0,则表示 `x` 和 `y` 之间没有线性关系
`p`:p 值,表示回归系数是否显著。如果 `p` 的值小于预设的显著性水平(通常为 0.05),则表明回归系数具有显著性,即 `x` 对 `y` 的影响不是由于随机因素引起的
`std_err`:标准误差,表示回归系数的估计误差。它的值越小,表示回归系数的估计越准确
slope, intercept, r, p, std_err = stats.linregress(x, y)
创建一个使用 slope
和 intercept
值的函数返回新值。这个新值表示相应的 x 值将在 y 轴上放置的位置(说白了就是使用一次函数求变量y的值)
def myfunc(x):
return slope * x + intercept
通过map(function, iterable, ...)函数迭代x数组,并将x数组中的每一个元素用于function函数。其中`map()` 函数返回的是一个迭代器,其中包含了对输入的可迭代对象中每个元素应用指定函数后得到的结果。具体来说,`map()` 函数会依次对输入的可迭代对象中的每个元素应用指定函数,然后将得到的结果依次存储在生成的迭代器中。
然后使用list函数将map函数中的迭代器转化为列表。这是因为这个迭代器包含了对原始可迭代对象中每个元素应用 `function` 函数后的结果。但是,迭代器只能逐个元素进行访问,而不能像列表一样进行切片、索引等操作。所以要使用list函数将map函数中的迭代器转化为列表(数组)
通过函数运行 x 数组的每个值。这将产生一个新的数组,其中的 y 轴具有新值
mymodel = list(map(myfunc, x))
绘制原始散点图
plt.scatter(x, y)
绘制线性回归线
plt.plot(x, mymodel)
plt.show()
上述总的代码如下和结果如下
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()
2、R-Squared
重要的是要知道 x 轴的值和 y 轴的值之间的关系有多好,如果没有关系,则线性回归不能用于预测任何东西
该关系用一个称为 r 平方(r-squared)的值来度量
r 平方值的范围是 0 到 1,其中 0 表示不相关,而 1 表示 100% 相关
打印上面的数据再线性回归中的拟合度 r,如果在正常范围内,表明存在某一种关系,但它不是完美的关系,但它表明我们可以在将来的预测中使用线性回归
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)
使用上述线性回归线预测具有 50 年寿命的汽车速度如下
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(50)
print(speed)
速度为 15.54 ,基本符合正常认知