python机器学习-线性回归
本文是Python 机器学习系列的一部分。您可以在此处找到本系列之前所有帖子的链接
介绍
在上一章中,我们研究了机器学习以及与之相关的一些关键术语。
从本章开始,我们将从学习和实现机器学习算法开始。因此,在该系列中,在本章中,我们将从线性回归开始。
注意:如果您可以将任何事物与您自己或您的生活联系起来,那么理解这个概念的机会就更大。因此,尝试通过将一切与人类联系起来来理解一切。
什么是回归,为什么这么叫?
回归是一种 ML 算法,可以通过训练来预测实数输出;如温度、股票价格等。回归基于一个假设,可以是线性、二次、多项式、非线性等。假设是基于一些隐藏参数和输入值的函数。在训练阶段,隐藏参数根据训练中出现的输入值进行优化。进行优化的过程是梯度下降算法。如果您使用的是神经网络,您还需要一个反向传播算法来计算每一层的梯度。一旦假设参数得到训练(当它们在训练过程中给出的误差最小时),然后将具有训练参数的相同假设与新输入值一起使用,以预测将再次成为真实值的结果。
回归类型
1. 线性回归用于预测分析。线性回归是一种线性方法,用于对标准或标量响应与多个预测变量或解释变量之间的关系进行建模。线性回归侧重于给定预测变量值的响应的条件概率分布。对于线性回归,存在过拟合的危险。线性回归的公式是 Y’ = bX + A。
2.当因变量是二分时,使用逻辑回归。逻辑回归估计逻辑模型的参数,是二项式回归的一种形式。逻辑回归用于处理具有两个可能标准的数据以及标准与预测变量之间的关系。逻辑回归方程是 l = \beta_{0}+\beta_{1}x_{1}+\beta_{2}x_{2}。
3. 多项式回归用于曲线数据。多项式回归采用最小二乘法拟合。回归分析的目标是针对自变量 x 对因变量 y 的期望值进行建模。多项式回归方程为 l = \beta_{0}+\beta_{0}x_{1}+\epsilon
4.逐步回归用于将回归模型与预测模型拟合。它是自动执行的。在每一步中,变量都会从一组解释变量中添加或减去。逐步回归的方法有前向选择、后向淘汰和双向淘汰。逐步回归的公式是 b_{j.std} = b_{j}(s_{x} * s_{y}^{-1})
5.岭回归是一种分析多元回归数据的技术。当发生多重共线性时,最小二乘估计是无偏的。在回归估计中添加了一定程度的偏差,结果,岭回归减少了标准误差。岭回归的公式是 \beta = (X^{T}X + \lambda * I)^{-1}X^{T}y
6. 套索回归是一种同时进行变量选择和正则化的回归分析方法。套索回归使用软阈值。套索回归仅选择提供的协变量的一个子集用于最终模型。套索回归是: N^{-1}\sum^{N}_{i=1}f(x_{i}, y_{I}, \alpha, \beta)。
7. ElasticNet 回归是一种正则化回归方法,它线性地结合了 lasso 和 ridge 方法的惩罚。ElasticNet 回归用于支持向量机、度量学习和投资组合优化。惩罚函数由下式给出: || \beta ||_1=\sum^{p}_{j=1}|\beta_j|
8. 支持向量回归 是一种回归方法,我们识别具有最大边距的超平面,使得最大数量的数据点在该边距内。SVR 几乎类似于 SVM 分类算法。我们不是像在简单的线性回归中那样最小化错误率,而是尝试将错误拟合在某个阈值内。我们在 SVR 中的目标是基本上考虑边界内的点。我们的最佳拟合线是具有最大点数的超平面。
9. 决策树回归是一种回归,其中可以使用 ID3 算法通过减少标准偏差(在分类信息增益中使用)来识别分裂节点。通过将数据划分为包含具有相似值(同质)实例的子集来构建决策树。标准偏差用于计算数值样本的均匀性。如果数值样本是完全同质的,则其标准偏差为零。
10. 随机森林回归 是一种集成方法,我们考虑了几个决策回归树的预测。
- 选择 K 个随机点
- 确定 n,其中 n 是要创建的决策树回归器的数量。重复步骤 1 和 2 以创建多个回归树。
- 每个分支的平均值分配给每个决策树中的叶节点。
- 为了预测变量的输出,考虑了所有决策树的所有预测的平均值。
随机森林通过创建特征的随机子集并使用这些子集构建更小的树来防止过度拟合(这在决策树中很常见)。
关键术语
1. 估算器
在给定相关数据的情况下,用于生成参数估计值的公式或算法。
2. 偏见
如果估计值等于被估计参数的值,则估计值是无偏的;否则,它是有偏见的。
3.效率
如果 A 具有较小的抽样方差——也就是说,如果 A 生成的特定值更紧密地聚集在它们的期望周围,则估计量 A 比估计量 B 更有效。
4. 一致性
如果它产生的估计随着样本量无限增加而收敛于真实参数值,则估计量是一致的。考虑一个估计器,它产生一些参数 θ 的估计值 θ^,并让 ^ 表示一个小数。如果估计量是一致的,我们可以通过抽取足够大的样本,使概率尽可能接近 1.0 或尽可能小。请注意,如果偏差在极限内趋于零,则有偏差的估计量可能仍然是一致的。相反,如果样本方差不能随着样本量的增加而适当缩小,则无偏估计量可能会不一致。
5. 回归的标准误差(SER)
回归模型中误差项标准差的估计。
6. R 平方
回归模型拟合优度的标准化度量。
7. 回归系数的标准误
对相关系数的抽样分布的标准偏差的估计。
8. P 值
假设原假设为真,抽取样本数据的概率与实际抽取的数据一样对原点不利,或者更多。当发现一个小的 p 值时,两种可能性是我们碰巧抽取了一个低概率的不具有代表性的样本,或者原假设实际上是错误的。
9. 显着性水平
对于假设检验,这是我们不会拒绝原假设的最小 p 值。如果我们选择 1% 的显着性水平,我们是说当且仅当检验的 p 值小于 0.01 时,我们将拒绝 null。显着性水平也是犯第 1 类错误(即拒绝真原假设)的概率。
10. T 检验
t 检验(或 z 检验,渐近是同一件事)是对零假设的常见检验,即特定回归参数 βi 具有某个特定值(通常为零,但一般为 βH0)。
11. F 检验
在回归模型上联合测试一组线性限制的常用程序。
12.多重共线性
回归模型中自变量之间存在高度相关性的情况——或者更一般地说,其中一些 X 接近于其他 X 的线性组合。症状包括大的标准误差和无法产生精确的参数估计。如果人们主要对预测感兴趣,这不是一个严重的问题;这是一个问题,是一个试图估计因果影响。
13. 省略变量 偏差
当一个相关的自变量从模型中被忽略并且被忽略的变量与一个或多个包含的变量相关时,就会出现回归参数估计的偏差。
14.日志变量
常见的转换允许使用 OLS 估计非线性模型,以用变量的自然对数代替该变量的水平。这可以针对因变量和/或一个或多个自变量来完成。关于对数要记住的一个关键点是,对于小的变化,变量对数的变化很好地近似于变量本身的比例变化。例如,如果 log(y) 变化 0.04,则 y 变化约 4%。
15. 二次项
另一种常见的转换。当 xi 和 x^2_i 都作为回归量包括在内时,重要的是要记住 xi 对 y 的估计影响是由回归方程相对于 xi 的导数给出的。如果 xi 上的系数为 β,而 x 2 i 上的系数为 γ,则导数为 β + 2γ xi。
16. 交互条款
“原始”自变量的成对乘积。在回归中包含交互项允许 xi 影响 y 的程度取决于某些其他变量 x j 的值的可能性。换句话说,xj 调节 xi 对 y 的影响。例如,经验对工资 (xi) 的影响可能取决于工人的性别 (xj)。
17. 自变量
自变量是在科学实验中改变或控制以测试对因变量的影响的变量。
18. 因变量
因变量是在科学实验中被测试和测量的变量。因变量“依赖”于自变量。当实验者改变自变量时,观察并记录对因变量的影响。
19. 正则化
线性模型的训练有一些扩展,称为正则化方法。这些都试图最小化模型在训练数据上的平方误差总和(使用普通最小二乘法),同时也降低模型的复杂性(例如模型中所有系数总和的数量或绝对大小) .
梯度下降
梯度下降是一种优化算法,用于通过沿梯度负值定义的最速下降方向迭代移动来最小化某些函数。在机器学习中,我们使用梯度下降来更新模型的参数。参数是指线性回归中的系数和神经网络中的权重。
1. 学习率
这些步骤的大小称为学习率。有了高学习率,我们每一步可以覆盖更多的地面,但我们有可能超过最低点,因为山坡的坡度在不断变化。在非常低的学习率下,我们可以自信地朝着负梯度的方向移动,因为我们经常重新计算它。低学习率更精确,但计算梯度很耗时,所以我们需要很长时间才能找到底部。
2. 成本函数
损失函数或成本函数告诉我们模型在对给定参数集进行预测方面“有多好”。成本函数有自己的曲线和梯度。这条曲线的斜率告诉我们如何更新参数以使模型更准确。
Python实现梯度下降算法

重要的提示
1. 回归分析不用于解释变量之间的因果关系(一种事件导致另一事件发生的机制,即每个事件相互依赖)。然而,回归分析可以表明变量之间的关系或变量之间的关联程度。
2. 也称为二元回归或回归分析
平方误差总和
这是点与回归线之间差异的总和。它可以作为线与数据拟合程度的衡量标准。
错误的标准估计
平均误差为零。如果 se(sigma_epsilon) 很小,误差往往接近于零(接近平均误差)。然后,模型很好地拟合了数据。因此,我们可以使用 se 作为衡量使用线性模型的适用性的度量。 se 的估计量由 se(sigma_epsilon) 给出
决定系数
为了衡量线性关系的强度,我们使用决定系数。R^2 取零到一之间的任何值。
- R^2 = 1:线与数据点完美匹配。
- R^2 = 0:x 和 y 之间没有线性关系。
简单线性回归示例
让我们以房价预测为例,我使用的数据是 KC 房价。随意使用任何数据集,kaggle 和 Google Colab 上有一些非常好的数据集。
import pandas as pd
df = pd.read_csv("kc_house_data.csv")
df.describe()
输出
从上面的数据可以看出,我们有很多表,但是简单的线性回归只能处理两列,所以我们选择了“price”和“sqrt_living”。在这里,我们将采用前 100 行进行演示。
在拟合数据之前,让我们分析一下数据:
import seaborn as sns
df = pd.read_csv("kc_house_data.csv")
sns.distplot(df['price'][1:100])
输出

import seaborn as sns
df = pd.read_csv("kc_house_data.csv")
sns.distplot(df['sqrt_living'][1:100])
输出

1. 使用Numpy演示
在下面的代码中,我们将只使用 numpy 来执行线性回归。
import pandas as pd
import numpy as np
import matplotlib.pyplot as plt
%matplotlib inline
def estimate_coef(x, y):
# number of observations/points
n = np.size(x)
# mean of x and y vector
m_x, m_y = np.mean(x), np.mean(y)
# calculating cross-deviation and deviation about x
SS_xy = np.sum(y*x) - n*m_y*m_x
SS_xx = np.sum(x*x) - n*m_x*m_x
# calculating regression coefficients
b_1 = SS_xy / SS_xx
b_0 = m_y - b_1*m_x
return(b_0, b_1)
def plot_regression_line(x, y, b):
# plotting the actual points as scatter plot
plt.scatter(x, y, color = "m",
marker = "o", s = 30)
# predicted response vector
y_pred = b[0] + b[1]*x
# plotting the regression line
plt.plot(x, y_pred, color = "g")
# putting labels
plt.xlabel('x')
plt.ylabel('y')
# function to show plot
plt.show()
def main():
# observations
df = pd.read_csv("kc_house_data.csv")
y= df['price'][1:100]
x= df['sqft_living'][1:100]
plt.scatter(x, y)
# putting labels
plt.xlabel('x')
plt.ylabel('y')
# function to show plot
plt.show()
# estimating coefficients
b = estimate_coef(x, y)
print("Estimated coefficients:\nb_0 = {} \nb_1 = {}".format(b[0], b[1]))
# plotting regression line
plot_regression_line(x, y, b)
if __name__ == "__main__":
main()
输出
输入数据可以可视化为:

之后,执行代码我们得到以下输出
估计系数:b_0 = 41517.979725295736 b_1 = 229.10249314945074
所以线性回归方程变为:
[价格] = 41517.979725795736+ 229.10249374945074*[sqrt_living]
即 y = b[0] + b[1]*x
让我们用回归线看最终图
为了预测值,我们运行以下命令:
常见问题FAQ
- 程序仅供学习研究,请勿用于非法用途,不得违反国家法律,否则后果自负,一切法律责任与本站无关。
- 请仔细阅读以上条款再购买,拍下即代表同意条款并遵守约定,谢谢大家支持理解!