目录
本人为小白,欢迎补充!
1 什么是线性回归?
百度上的解释是“线性回归是利用数理统计中回归分析,来确定两种或两种以上变量间相互依赖的定量关系的一种统计分析方法,其表达形式为y = a*x+b,类似于我们学过的二元一次方程,这里给出一个示例:y=3x+6。
在线性回归分析中,包括一次线性回归和多次线性回归分析。
一元线性回归分析指的是,只有一个自变量和一个因变量,且可以用一条直线近似表示。如下图:
多元线性回归分析指的是,两个或两个以上的自变量,且因变量和自变量之间是线性关系。如下图:
2 机器学习中的线性回归模型
对于机器学习来说,回归算法是相对于分类算法来说的。分类顾名思义,将所给的变量分为不同类别,例如,从一碗豆子里面区分红豆、绿豆、黑豆、黄豆等,根据其不同的特征来进行区分;回归是指根据已有的信息,预测一个连续的值,例如,根据房子信息得到了一个价格和大小之间函数,可以用来预测房价,给定一个房子的大小,可以输出房子的价格。
在机器学习中,必须是自变量和因变量呈现线性关系才可以选择线性回归模型。
在线性回归模型中,我们通过寻找最佳的线性函数来拟合输入特征和输出变量之间的关系。线性回归模型假设输入特征与输出变量之间存在线性关系。线性回归模型的数学表达式如下:
y = β0 + β1x1 + β2x2 + ... + βnxn
其中,y为输出变量,x1, x2, ..., xn为输入特征,β0, β1, β2, ..., βn为模型的系数。
在训练过程中,我们一般通过最小二乘法来寻找合适的线性回归模型,通过最小化均方误差(MSE)来求解最佳的系数,使得模型的预测值与真实值的差异最小化。
线性回归模型在机器学习中应用广泛,特别适用于输入特征与输出变量之间存在线性关系的问题。它可以用来进行预测和回归分析,如房价预测、销售量预测等。
3 一元线性回归模型
一元线性回归模型是一种用于建立两个变量(一个自变量、一个因变量)之间线性关系的模型,用通俗的话来说,就是找一条直线尽量能够拟合图中的所有数据点。
在给定的自变量值下,因变量值服从一个线性关系。这个线性关系可以用直线的方程形式表示:
Y = β0 + β1X + ε
其中Y是因变量,X是自变量,β0和β1是回归系数,ε是误差项,表示模型无法解释的部分。
该模型的原理可以简述为以下几步:
- 假设存在一个自变量 x 和一个因变量 y,它们之间存在线性关系。我们假设这个关系可以用一条直线来表示,其方程形式为 y = β0 + β1x,其中 β0 和 β1 是待估参数。
- 为了求解这两个参数,我们需要拟合这条直线使其尽量准确地通过数据点。常用的拟合准则是最小二乘法,即最小化实际观测值 y 与模型预测值之间的差异。
- 最小二乘法拟合的目标是使误差平方和最小化。也就是说,我们要找到一组参数 β0 和 β1,使得∑(y - (β0 + β1x))^2 尽可能小。这可以通过求解误差方程的导数,并令其为零来完成。
- 假设数据集中有 n 个观测值,我们可以得到最小二乘法(也有博主表示为:β1 = Cov(X,Y) / Var(X),β0 = Y的均值 - β1 * X的均值)来求解参数 β0 和 β1。
- 在得到 β0 和 β1 的估计值之后,我们就可以得到线性回归模型的最终方程 y = β0 + β1x。这个方程可以用来预测因变量 y 的值,给定自变量 x 的值。
总结起来,一元线性回归模型通过最小二乘法来拟合一条直线,使其尽可能准确地描述自变量和因变量之间的线性关系。这个模型可以用来预测因变量的值,通过回归系数可以了解自变量的影响程度和方向,通过残差平方和和确定系数可以评估回归模型的拟合程度和解释力度。
4 多元线性回归模型
多元线性回归模型是使用多个自变量来预测因变量的线性模型。它假设因变量和自变量之间存在线性关系,通过最小化预测值与实际观测值之间的误差来确定回归系数。
多元线性回归模型可以表示为:
Y = β0 + β1X1 + β2X2 + ... + βnXn + ε
其中,Y表示因变量,X1, X2, ..., Xn表示自变量,β0, β1, β2, ..., βn表示回归系数,ε表示误差项,表示模型无法解释的部分。
多元线性回归模型的假设包括:线性关系、独立性、常数方差和正态分布。
- 线性关系假设因变量和自变量之间存在线性关系,也就是回归模型是线性的。
- 独立性假设每个观察值之间是相互独立的,在多元线性回归模型中,观测值之间的误差项应该是独立的。
- 常数方差假设误差项的方差在各个自变量值上是恒定的,即误差项的方差不随自变量的变化而改变。
- 正态分布假设误差项服从正态分布,这样才能保证回归系数的无偏性和最小二乘估计的有效性。
多元线性回归的基本原理如下:
- 线性关系假设:假设因变量Y和自变量X之间存在线性关系,即Y = β0 + β1X1 + β2X2 + ... + βnXn + ε,其中Y是因变量,X是自变量,β是回归系数,ε是误差项。
- 最小二乘法:回归系数β的估计值通过最小化误差平方和来得到,即使得Σ(ε^2)最小化。
- 参数估计:使用最小二乘法估计回归系数β的值。通过求解正规方程组或使用数值优化算法来获得最佳参数估计值。
- 模型拟合:使用估计的回归系数来构建多元线性回归模型。通过将自变量X的值代入模型,预测因变量Y的值。
- 模型评估:通过评估模型的拟合优度和统计显著性来评估模型的质量。常用的评估指标包括R方值、调整R方值和显著性检验。
多元线性回归可以用于预测和解释因变量与多个自变量之间的关系。它可以帮助研究人员理解和预测因果关系,并在实践中应用于估计和预测问题。多元线性回归模型可以通过计算回归系数、进行显著性检验、拟合优度和预测等步骤进行模型的建立和评估。
5 最小二乘法
5.1 基本概念
最小二乘法(Least Squares Method)是一种常用的参数(这里的参数指的是y = a * x + b中的a和b)估计方法,用于拟合数据并找到最佳的线性(直线或曲线)关系。它的原理是通过最小化预测值与实际观测值之间的差异来确定最优的模型参数。
5.2 具体原理
最小二乘法的目标是找到一条直线(或超平面),使得观测值到该直线的垂直距离的平方和最小。这个平方和称为残差的平方和(RSS),残差指的是观测数据点的实际值与预测值之间的差异。最小二乘法的核心思想是通过最小化RSS来找到最佳的拟合线,使观测值与预测值的误差最小。
对于一元线性回归问题(只有一个自变量和一个因变量),残差e可以表示为 yi - (a * xi + b),最小二乘法的目标是找到一个直线方程 y = ax + b,其中 a 是斜率,b 是截距,使所有观测点到这条直线的垂直距离的残差平方和最小。
最小二乘法的求解过程涉及到对残差平方和进行求导,并令导数等于零来求解最佳的参数值。
具体求解的步骤如下:
- 假设有 n 个观测点 {(x1, y1), (x2, y2), ..., (xn, yn)} ,每个观测点的自变量x和因变量y分别为 (x_i, y_i)。
- 建立目标函数,即残差平方和 RSS = Σ(y_i - a*x_i - b)^2。
- 对目标函数中的x和y进行求导,并令导数等于零,得到关于 a 和 b 的方程组。
- 解方程组,得到最佳的参数值 a 和 b。
最小二乘法是一种较为简单且经典的回归分析方法,适用于直线关系较为明显的情况。然而,在某些情况下,最小二乘法可能对异常值比较敏感。在这种情况下,可以采用其他的回归方法,如岭回归或套索回归,来提高模型的稳定性。在实际应用中,也可以使用优化算法(如梯度下降法)来求解最小二乘法问题。
6 损失(代价)函数
6.1 基本概念
损失函数是用来衡量预测值与实际值之间差异的函数,即用来评价哪一条直线是最合适的、最能拟合所有数据点的。在机器学习和统计学中,我们希望通过训练模型来使得预测值尽可能地接近实际值,而损失函数就是用来度量这种差异的指标。
损失函数可以是各种形式,常见的有均方误差(Mean Squared Error, MSE)、平均绝对误差(Mean Absolute Error, MAE)、交叉熵(Cross Entropy)等等。不同的损失函数根据问题的性质和需求来选择。
6.2 均方误差MSE
均方误差(Mean Square Error, MSE)是用来衡量估计值与真实值之间差异的一种方法。它计算了每个估计值与真实值之间差的平方的平均值。
具体计算公式为:
MSE = 1/n * Σ(xi - yi)^2
其中,xi为估计值,yi为真实值,n为样本数量。MSE越小,表示估计值与真实值的差异越小,估计值越准确。MSE是一种常用的评价回归模型性能的指标。
MSE的优点是对异常值不敏感。然而,MSE的缺点是它对大误差给予了更大的权重,因此模型更倾向于拟合到这些大误差的样本上。如果数据中存在较多的异常值,可以考虑使用其他的损失函数,如平均绝对误差(Mean Absolute Error,MAE)。
6.3 平均绝对误差MAE
平均绝对误差(Mean Absolute Error, MAE)是一种常用的损失函数,用于衡量预测值与实际值之间的差异。与均方误差不同,MAE是对预测值与实际值之差的绝对值进行求和并取平均,而不是对差值的平方进行求和。
MAE的计算方法为:
MAE = (1/n) * Σ|y_pred - y|
其中y_pred为预测值,y为实际值,n为样本数量。
使用MAE作为损失函数的优点是它对异常值相对较为鲁棒。由于MAE是对差值的绝对值进行求和,因此异常值对于损失函数的值的影响较小。这在处理一些离群点较多的数据集时特别有用。
然而,与均方误差相比,MAE的梯度相对较大,导致在优化过程中可能需要更多的迭代步骤才能达到最优解。此外,MAE对于不同大小的误差给予相同的权重,可能会忽略了一些具有不同重要性的误差。
6.4 交叉熵Cross Entropy
交叉熵(Cross Entropy)是一种常用的损失函数,主要用于度量两个概率分布之间的差异。在机器学习中,交叉熵常用于分类问题的模型训练中,用来衡量预测类别与真实类别之间的差异。
在二分类问题中,假设有两个类别:正例和反例。对于每个样本,模型会输出一个介于0和1之间的概率值来表示其属于正例的可能性。交叉熵损失函数基于这个概率值来计算模型的预测误差。
交叉熵的计算方法为:
CE = - (y * log(y_pred) + (1-y) * log(1-y_pred)),
其中y_pred为模型预测的概率值,y为真实的标签,log为自然对数。
交叉熵损失函数的优点是它对于错误的预测有较高的敏感性。当模型的预测与实际情况相符时,交叉熵的值较低,而当预测错误时,交叉熵的值较高。这对于模型的训练来说是非常重要的,因为模型需要尽可能地减小交叉熵的值,从而提高分类的准确性。
除了二分类问题,交叉熵还可以用于多分类问题。对于多分类问题,交叉熵损失函数对每个类别的预测概率进行求和,以衡量预测概率与真实概率之间的差异。
需要注意的是,交叉熵损失函数的输入是概率值,因此模型的输出在训练前需要通过某种激活函数(如sigmoid函数或softmax函数)来将其转换为概率值。
6.5 总结
通过最小化损失函数,可以找到最优的模型参数,使得模型的预测值与实际值的差异最小化。在训练过程中,优化算法会根据损失函数的值来调整模型参数,持续优化模型的性能。
需要注意的是,选择合适的损失函数与问题的性质和目标密切相关。有些问题可能更关注预测值的准确性,因此采用均方误差等平方型损失函数更为合适;有些问题可能更关注预测值的相对差异,因此采用绝对误差等绝对型损失函数更为合适。
7 线性回归模型训练
线性回归模型的训练主要包括以下几个步骤:
- 数据准备:收集并整理训练数据集,包括输入特征和对应的输出变量。确保数据集的质量和完整性,处理缺失值和异常值。通常将数据集分为训练集和测试集,用于模型的训练和评估。
- 特征选择和变换:根据问题领域的知识和特征的统计分析,选择最相关的输入特征。对特征进行预处理和变换,使其满足线性模型的假设,例如归一化、标准化等。
- 模型选择:选择适合问题的线性回归模型,可以根据问题的复杂度和特征的数量来选择简单的线性回归模型或者多项式回归模型。
- 模型训练:使用训练集对线性回归模型进行训练。训练过程中,通过最小化均方误差(MSE)或其他适当的损失函数来优化模型的系数。通过最小化均方误差(MSE)或其他适当的损失函数来训练模型。常用的优化算法包括最小二乘法、梯度下降和正规方程法。其中,最小二乘法是一种解析解,而梯度下降法是一种迭代优化方法。
- 模型评估:使用训练集外的测试数据集来评估模型的性能。常见的评估指标包括均方根误差(RMSE)、平均绝对误差(MAE)、决定系数(R^2)等。
- 模型优化:根据评估结果,对模型进行调整和改进,如调整学习率、添加正则化项等,以获得更好的预测性能。
- 模型应用:使用训练好的线性回归模型进行预测。通过输入新的特征数据,模型可以预测对应的输出变量。
线性回归模型的训练过程需要注意选择合适的特征、处理数据的质量、选择合适的优化算法和评估指标等,以获得准确且可靠的模型。
8 代码实现
8.1 一元线性回归代码实现
8.1.1 手动实现
(手动实现)
# 导入必要的库
import numpy as np
import matplotlib.pyplot as plt
# 生成一些示例数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1) # 输入变量,形状为(100, 1)
y = 4 + 3 * X + np.random.randn(100, 1) # 输出变量,带有一些噪声
# 为了简化计算,我们通常会在X矩阵中添加一列全为1的项,以代表截距(偏置项)。
X_b = np.c_[np.ones((100, 1)), X] # 添加一列全为1的项,形状变为(100, 2)
#使用正规方程(Normal Equation)来求解线性回归的参数。
theta_best = np.linalg.inv(X_b.T.dot(X_b)).dot(X_b.T).dot(y)
# theta_best 是一个包含两个元素的数组,第一个元素是截距(偏置项),第二个元素是斜率(权重)。
# 使用计算出的θ进行预测
y_predict = X_b.dot(theta_best)
# 输出预测函数的参数
theta_0, theta_1 = theta_best[0].item(), theta_best[1].item()
print(f"The linear regression model is: y = {theta_0:.2f} + {theta_1:.2f} * x")
# 在训练过程中,我们可以计算模型的均方误差来评估其性能。
# 但在求解正规方程后,我们通常会直接得到最优解,此时计算MSE主要是为了验证结果
# 计算均方误差(MSE)
mse = np.mean((y_predict - y) ** 2)
print(f"Mean Squared Error: {mse}")
# 生成新的X值用于绘图
X_new = np.array([[0], [2]])
X_new_b = np.c_[np.ones((2, 1)), X_new] # 不要忘记添加截距项
# 使用训练好的模型进行预测
y_predict_new = X_new_b.dot(theta_best)
# 绘图
plt.plot(X_new, y_predict_new, "r-", linewidth=2, label="Predictions")
plt.plot(X, y, "b.", label="Training data")
# 设置图表标签和标题
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 2, 0, 15])
plt.legend(loc="upper left", fontsize=14)
plt.title("Linear Regression with One Input Variable")
# 获取回归线的方程并显示在图上
intercept = theta_best[0][0]
slope = theta_best[1][0]
equation = f'y = {slope:.2f}x + {intercept:.2f}'
plt.text(0.5, 10, equation, fontsize=14, color="red")
# 显示图表
plt.show()
运行结果:
8.1.2 sklearn实现
import numpy as np
import matplotlib.pyplot as plt
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error
# 生成一些示例数据
np.random.seed(0)
X = 2 * np.random.rand(100, 1) # 生成100个0到2之间的随机数作为特征X
y = 4 + 3 * X + np.random.randn(100, 1) # 根据线性关系y = 4 + 3x加上一些噪声生成目标变量y
# 创建线性回归模型
lin_reg = LinearRegression()
# 训练模型
lin_reg.fit(X, y)
# 使用训练好的模型进行预测
X_new = np.array([[0], [2]]) # 选择新的x值来绘制回归线
y_predict = lin_reg.predict(X_new) # 对新的x值进行预测
# 计算均方误差(MSE)
y_train_pred = lin_reg.predict(X) # 对训练数据进行预测
mse = mean_squared_error(y, y_train_pred) # 计算MSE
# 绘制回归线和训练数据点
plt.plot(X_new, y_predict, "r-", linewidth=2, label="Predictions (regression line)")
plt.plot(X, y, "b.", label="Training data")
# 设置图表的标签、标题和坐标轴范围
plt.xlabel("$x_1$", fontsize=18)
plt.ylabel("$y$", rotation=0, fontsize=18)
plt.axis([0, 2, 0, 15])
plt.legend(loc="upper left", fontsize=14)
plt.title("Linear Regression with One Input Variable using scikit-learn")
# 准备回归方程的文本
regression_equation = f"y = {lin_reg.intercept_[0]:.2f} + {lin_reg.coef_[0][0]:.2f} * x"
# 在图表上添加回归方程的文本注释
# 这里选择了一个大致的位置,你可以根据需要调整x和y的值来定位文本
plt.text(0.5, 10, regression_equation, fontsize=14, color="red")
# 显示MSE
print(f"Mean Squared Error: {mse:.2f}")
# 打印回归方程,注意这里的intercept_和coef_是从模型中获取的
print(f"Estimated regression equation: y = {lin_reg.intercept_[0]:.2f} + {lin_reg.coef_[0][0]:.2f} * x")
# 展示图表
plt.show()
运行结果:
8.2 多元线性回归代码实现
import numpy as np
from sklearn.model_selection import train_test_split
from sklearn.linear_model import LinearRegression
from sklearn.metrics import mean_squared_error, r2_score
# 示例数据集(这里使用随机生成的数据,你应该替换成你的实际数据)
# 假设我们有3个特征(X1, X2, X3)和一个目标变量(y)
np.random.seed(0)
X = np.random.rand(100, 3) # 100个样本,每个样本有3个特征
y = X @ np.array([1.5, -2.0, 1.0]) + np.random.randn(100) # 真实参数为[1.5, -2.0, 1.0],并添加噪声
# 将数据分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建多元线性回归模型
model = LinearRegression()
# 训练模型
model.fit(X_train, y_train)
# 进行预测
y_pred_train = model.predict(X_train)
y_pred_test = model.predict(X_test)
# 评估模型
train_mse = mean_squared_error(y_train, y_pred_train)
test_mse = mean_squared_error(y_test, y_pred_test)
train_r2 = r2_score(y_train, y_pred_train)
test_r2 = r2_score(y_test, y_pred_test)
print(f"训练集MSE: {train_mse}")
print(f"测试集MSE: {test_mse}")
print(f"训练集R²: {train_r2}")
print(f"测试集R²: {test_r2}")
# 输出模型参数(权重和截距)
coef = model.coef_
intercept = model.intercept_
# 打印回归方程
feature_names = ['X1', 'X2', 'X3'] # 假设你的特征变量名为X1, X2, X3
equation = f"回归方程为:y = {intercept:.2f} + {coef[0]:.2f}*{feature_names[0]} + {coef[1]:.2f}*{feature_names[1]} + {coef[2]:.2f}*{feature_names[2]}"
print(equation)
运行结果: