线性回归 Linear Regression
前言
线性回归是机器学习中有监督学习的解决回归任务的一种算法。
什么是线性回归
回归,是通过学习历史数据,对未来进行预测。
线性,是学习历史数据的过程中,发现的变量之间的一种关系。一个变量,随着另一个变量的变化而呈现线性的变化,如:电脑的耗电量 = 电脑的功率 * 时长,使用时间越长,耗电量就越大。
当然,线性关系不仅仅存在于2个变量之间,还可以存在于3个以上的变量之间。
通常,被预测的变量(如:电脑的耗电量)称为被解释变量,或因变量,其他的变量(如:时长)称为解释变量,或自变量。一个自变量的回归称为简单线性回归,或一元线性回归,两个自变量以上的回归称为多元线性回归。运用这种关系,构建模型,就可以实现对未来的预测。
线性回归的优点和缺点
1.优点
- 简单易懂:线性回归模型简单,易于理解和实现。
- 可解释性强:线性回归模型的系数具有明确的物理或经济意义,可以解释自变量对因变量的影响。
- 易于使用:线性回归模型可以用于预测连续的数值型变量,适用于许多实际问题。
- 计算速度快:线性回归模型的计算速度较快,适用于大规模数据集。
- 稳定性:线性回归模型的稳定性较好,即在样本量较大时,模型的预测结果相对稳定。
- 预测精度:线性回归模型的预测精度通常较高,但在自变量和因变量之间存在非线性关系时,预测精度可能会降低。
2.缺点
- 假设限制:线性回归模型假设自变量和因变量之间存在线性关系,且误差项服从正态分布,这些假设可能在实际问题中不成立。
- 容易受异常值影响:线性回归模型对异常值敏感,可能会导致模型的不稳定性和预测结果的不准确性。
- 多重共线性问题:当自变量之间存在高度相关性时,线性回归模型可能会出现多重共线性问题,导致系数估计不准确。
- 只能处理线性关系:线性回归模型只能处理自变量和因变量之间的线性关系,无法处理非线性关系。
需要注意的是,在实际应用中,线性回归模型通常会和其他模型结合使用,以提高预测准确率。同时,为了解决模型假设限制和异常值等问题,可以使用正则化方法和异常值检测方法等技术进行优化。
线性回归的应用场景
线性回归模型可以用于预测一个连续的数值型变量,因此适合于以下应用场景:
- 金融领域:例如预测股票价格、货币汇率等。
- 经济学:例如预测国内生产总值、通货膨胀率等。
- 市场营销:例如预测销售额、市场份额等。
- 工程学:例如预测机器零件的寿命、电力消耗等。
- 医学研究:例如预测病人的生存率、药物的剂量等。
- 教育研究:例如预测学生的成绩、教育投入对教育成果的影响等。
- 社会科学:例如预测人口增长率、失业率等。
- 环境科学:例如预测气温、降雨量等
- 计算机科学:例如预测程序的运行时间、网络延迟等。
- 物流管理:例如预测货物的运输时间、成本等。
- 生产制造:例如预测生产线的产量、质量等。
- 农业领域:例如预测作物的产量、生长速度等。
需要注意的是,线性回归模型的前提是自变量和因变量之间存在线性关系,且误差项服从正态分布,因此在应用时需要进行检验。
线性回归模型的评价指标
线性回归的模型评价指标包括:
-
均方误差(Mean Squared Error,MSE)是预测值与真实值之间差值的平方的平均值,用来衡量模型的预测精度,MSE 越小,说明模型的预测结果越准确。
-
均方根误差(Root Mean Squared Error,RMSE)是均方误差的平方根,用来衡量模型的预测精度,RMSE 越小,说明模型的预测结果越准确。
-
平均绝对误差(Mean Absolute Error,MAE)是预测值与真实值之间差值的绝对值的平均值,用来衡量模型的预测精度,MAE 越小,说明模型的预测结果越准确。
-
决定系数(Coefficient of Determination,R-squared)用来衡量模型对数据的拟合程度,取值范围为0-1,R-squared越接近1,说明模型对数据的拟合程度越好。它的计算公式如下:
决定系数 = 1 - (残差平方和 / 总平方和)
其中,残差平方和是模型预测值与实际观测值之间的差异的平方和,总平方和是观测值与观测值均值之间的差异的平方和。
线性回归建模时的注意事项
- 标准的线性回归模型,对数据有严格的假设限制:
- 因变量和自变量之间存在线性关系
- 各自变量之间不完全相关
- 误差项服从正态分布
- 特殊处理
- 在实际的应用中,对于非线性关系,也可以通过对特征变量进行取对数等变换,以实现线性回归建模
- 对自变量之间的多重共线性问题,可以运用正则化等方法进行应对
python中实现线性回归建模的方法
Python中有多个库可以实现线性回归,以下是其中比较常用的几个库:
- NumPy:NumPy是Python科学计算的基础包,其中包含了线性代数、随机数生成等功能,可以用于实现线性回归。
- scikit-learn:scikit-learn是Python中常用的机器学习库,其中包含了多个回归模型,包括线性回归、岭回归、Lasso回归等。
- statsmodels:statsmodels是Python中的统计分析库,其中包含了多个回归模型,包括线性回归、广义线性回归等。
- TensorFlow:TensorFlow是Google开发的深度学习框架,其中也包含了线性回归模型。
- PyTorch:PyTorch是另一个常用的深度学习框架,其中也包含了线性回归模型。
- Keras:Keras是一个高级神经网络API,可以在多个深度学习框架上运行,其中也包含了线性回归模型。
- Theano:Theano是另一个深度学习框架,其中也包含了线性回归模型。
- pandas:pandas是Python中常用的数据处理库,其中也包含了线性回归模型。
以上这些库都提供了丰富的接口和功能,可以满足不同场景下的需求。需要注意的是,在使用这些库时,需要根据具体情况选择合适的模型、参数和评估指标,以获得更好的预测效果。
python实现线性回归建模的示例
Python进行线性回归建模时,可以使用Scikit-learn库提供的SGD、LASSO和Ridge三种线性回归模型。
- SGD(随机梯度下降法)线性回归模型:
from sklearn.linear_model import SGDRegressor
from sklearn.metrics import mean_squared_error, r2_score
from sklearn.model_selection import train_test_split
from sklearn.preprocessing import StandardScaler
# 假设我们有特征矩阵X和目标变量y
# 数据预处理,标准化特征矩阵
scaler = StandardScaler()
X_scaled = scaler.fit_transform(X)
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X_scaled, y, test_size=0.2, random_state=42)
# 创建SGDRegressor模型
model = SGDRegressor(max_iter=1000, random_state=42)
# 拟合模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 模型评价
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("均方误差(MSE):", mse)
print("决定系数(R^2):", r2)
- LASSO(Least Absolute Shrinkage and Selection Operator)线性回归模型:
from sklearn.linear_model import Lasso
# 假设我们有特征矩阵X和目标变量y
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建Lasso模型
model = Lasso(alpha=0.1, random_state=42)
# 拟合模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 模型评价
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("均方误差(MSE):", mse)
print("决定系数(R^2):", r2)
- Ridge(岭回归)线性回归模型:
from sklearn.linear_model import Ridge
# 假设我们有特征矩阵X和目标变量y
# 划分训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.2, random_state=42)
# 创建Ridge模型
model = Ridge(alpha=0.5, random_state=42)
# 拟合模型
model.fit(X_train, y_train)
# 预测
y_pred = model.predict(X_test)
# 模型评价
mse = mean_squared_error(y_test, y_pred)
r2 = r2_score(y_test, y_pred)
print("均方误差(MSE):", mse)
print("决定系数(R^2):", r2)
以上是SGD、LASSO和Ridge三种线性回归模型的建模过程和代码,模型评价使用了均方误差(MSE)和决定系数(R^2)。你可以根据具体的数据和需求选择适合的模型,并根据评价指标来判断模型的性能。
线性模型的参数
- SGDRegressor()的常用参数:
- loss:用于指定损失函数,可选值包括"‘squared_loss"(默认)、“huber”、“epsilon_insensitive"和”‘squared_epsilon_insensitive"。
- penalty:用于指定正则化项,可选值包括"l2"(默认)和"l1"。
- alpha:正则化项的系数,默认为0.0001。
- learning_rate:学习率的调整方式,可选值包括"constant"(常数学习率)、“optimal”(自适应学习率)和"inverse_scaling"(逆比例学习率)。
- eta0:常数学习率的初始值,默认为0.0。
- power_t:逆比例学习率的指数,默认为0.5。
- max_iter:最大迭代次数,默认为1000。
- tol:迭代停止的容忍度,默认为1e-3。
- epsilon:epsilon-insensitive损失函数中的epsilon值,默认为0.1。
- random_state:随机数生成器的种子值,用于控制随机性。
- Ridge()的常用参数:
- alpha:正则化项的系数,默认为1.0。当alpha越大时,模型的复杂度越低,对训练数据的拟合程度越低,但泛化能力可能会更好。
- fit_intercept:用于指定是否需要计算截距,即是否需要在回归方程中加上常数项,默认为True。
- normalize:用于指定是否对数据进行标准化处理,默认为False。如果设置为True,则会对每个特征进行标准化处理,即将每个特征减去均值并除以标准差。
- solver:用于指定求解方法,可选值包括"auto"(自动选择)、“svd”(奇异值分解)和"cholesky"(使用逆矩阵计算)。默认为"auto",在样本数量小于特征数量或使用L1正则化时会自动选择"svd"求解方法,否则选择"cholesky"方法。
- max_iter:最大迭代次数,默认为None。如果设置为None,则会根据求解方法自动选择最大迭代次数。
- random_state:随机数生成器的种子值,用于控制随机性。
- Lasso()的常用参数:
- alpha:正则化项的系数,默认为1.0。当alpha越大时,模型的复杂度越低,对训练数据的拟合程度越低,但泛化能力可能会更好。
- fit_intercept:用于指定是否需要计算截距,即是否需要在回归方程中加上常数项,默认为True。
- normalize:用于指定是否对数据进行标准化处理,默认为False。如果设置为True,则会对每个特征进行标准化处理,即将每个特征减去均值并除以标准差。
- precompute:用于指定是否预先计算Gram矩阵(即特征间内积矩阵)以加速求解,默认为False。当样本数量很大时不建议开启该选项。
- max_iter:最大迭代次数,默认为1000。
- tol:迭代停止的容忍度,默认为1e-4。
- warm_start:用于指定是否使用前一次训练结果作为初始值继续训练。默认为False。
- positive:用于指定系数是否应该限制为正值,默认为False。如果设置为True,则会强制所有系数都为正值。
- selection:用于指定路径的求解方法,可选值包括"cyclic"(默认)和"random"。如果选择"cyclic",则会按照顺序依次更新每个系数;如果选择"random",则会随机选择一个系数进行更新。
SGD,LASSO,RIDGE三种模型的比较
模型名称 | 描述 | 优势 | 局限性 | 常用参数 |
---|---|---|---|---|
SGD | SGD (Stochastic Gradient Descent)是一种基于随机梯度下降的线性回归模型。它通过随机选择样本来进行参数更新,从而加快模型训练速度。 | - 训练速度快,特别适用于大规模数据集。 - 可以在线学习,适用于动态数据。 - 可以处理高维数据。 | - 对于稀疏数据和噪声较大的数据,可能会收敛到局部最优解。 - 对于非凸损失函数,可能会陷入局部最优解。 - 对于参数调整敏感,需要进行调参。 | - learning_rate: 学习率。 - max_iter: 最大迭代次数。 - penalty: 正则化项,可选参数包括’l1’和’l2’。 - alpha: 正则化强度。 |
LASSO | LASSO (Least Absolute Shrinkage and Selection Operator)是一种线性回归模型,通过加入L1正则化项来进行特征选择。LASSO模型可以将某些特征的系数压缩为0,从而实现特征选择的效果。 | - 可以进行特征选择,剔除对目标变量影响较小的特征。 - 可以处理高维数据,减少过拟合的风险。 - 可以通过调整正则化强度来控制模型的稀疏性。 | - 对于高度相关的特征,可能会随机选择其中一个特征而忽略其他特征。 - 对于参数调整敏感,需要进行调参。 | - alpha: 正则化强度。 - max_iter: 最大迭代次数。 |
RIDGE | RIDGE (Ridge Regression)是一种线性回归模型,通过加入L2正则化项来控制模型的复杂度。RIDGE模型可以减小特征系数的大小,从而降低过拟合的风险。 | - 可以减小特征系数的大小,降低过拟合的风险。 - 可以处理高维数据。 - 对于高度相关的特征,可以分配较小的系数,减少特征间的共线性。 | - 对于特征选择方面的效果不如LASSO模型。 - 对于参数调整敏感,需要进行调参。 | - alpha: 正则化强度。 - max_iter: 最大迭代次数。 |
总结
本文主要简单介绍了线性回归的基本概念,优缺点,应用场景,建模过程中的注意事项,实现方法,以及SGD回归,LASSO回归,RIDGE回归的建模过程和常用参数的解读等。