目录
小批量梯度下降法(Mini-batch Gradient Descent):每次迭代使用一小部分样本来计算梯度,并更新参数。这种方法是BGD和SGD的折中,既减少了计算量,又提高了收敛的稳定性。
线性回归的应用场景
线性回归因其简洁的数学模型和强大的预测能力,在多个领域有着广泛的应用。以下是一些主要的应用场景:
-
经济学:
- GDP与失业率关系分析:经济学家可以通过线性回归模型分析GDP增长与失业率之间的关系,了解经济增长对就业市场的影响,为政府制定经济政策提供参考。
- 物价与消费者支出关系:利用线性回归研究物价水平变化如何影响消费者的支出行为,有助于理解通货膨胀对消费市场的冲击。
-
市场营销:
- 广告投入与销售额关系:市场营销人员可以通过线性回归模型分析广告投入与销售额之间的线性关系,从而确定最佳的广告预算策略,以最大化销售效果。
- 产品价格与销量关系:线性回归还可以用于研究产品价格调整对销量的影响,帮助企业制定合理的定价策略。
-
医学研究:
- 药物剂量与治疗效果关系:医学研究人员可以利用线性回归模型评估不同药物剂量对患者治疗效果的影响,为制定个性化的治疗方案提供依据。
- 生活方式与健康指标关系:通过线性回归,可以分析生活方式因素(如饮食、运动等)与健康指标(如血压、血糖等)之间的关系,为公共卫生政策的制定提供数据支持。
-
教育评估:
- 学习时间与考试成绩关系:教育工作者可以通过线性回归模型研究学习时间与考试成绩之间的线性关系,了解学习投入对学业成绩的影响,从而制定更科学的教学计划。
- 教育投入与学生表现关系:线性回归还可以用于评估学校或政府对教育的投入如何影响学生的综合素质和表现。
-
人力资源管理:
- 员工培训时间与绩效关系:人力资源管理者可以利用线性回归模型分析员工培训时间与工作绩效之间的线性关系,以确定最有效的培训时长和方式。
- 工资与员工满意度关系:通过线性回归,可以研究工资水平对员工满意度的影响,帮助企业制定更具吸引力的薪酬政策。
-
预测与趋势分析:
- 销售预测:基于历史销售数据,利用线性回归模型可以预测未来的销售趋势,为企业制定市场策略提供数据支持。
- 金融市场分析:在金融领域,线性回归被广泛应用于股票价格预测、市场趋势分析等,帮助投资者做出更明智的投资决策。
线性回归定义和公式
- 定义:线性回归是通过最小化误差的平方和来寻找数据的最佳函数匹配。利用这种函数关系,可以根据一个或多个自变量来预测因变量的值。
- 公式:线性回归的通用公式可以表示为
y = w'x + b
,其中y
是因变量,x
是自变量(可以是多个自变量的向量),w
是回归系数(或称为权重),b
是截距项,w'x
表示w
和x
的点积(当x
是向量时)。在多元线性回归中,w
和x
都是向量,公式变为y = w_1x_1 + w_2x_2 + ... + w_nx_n + b
,其中n
是自变量的数量。
线性回归API:
线性回归API的初步使用主要涉及scikit-learn(sklearn)库中的LinearRegression
类。
一、导入库和数据准备
首先,需要导入必要的库,并准备数据。数据通常包括特征(自变量)和目标值(因变量)。
import numpy as np | |
from sklearn.linear_model import LinearRegression |
二、创建线性回归模型
使用LinearRegression
类创建一个线性回归模型实例。
model = LinearRegression() |
三、训练模型
使用fit
方法对模型进行训练,传入特征矩阵X
和目标值向量y
。
model.fit(X, y) |
四、查看模型参数
训练完成后,可以通过模型的属性查看模型的参数,包括回归系数(斜率)和截距。
print('斜率:', model.coef_) # 回归系数 | |
print('截距:', model.intercept_) # 截距 |
五、进行预测
使用训练好的模型对新数据进行预测。传入新的特征矩阵,模型将返回预测的目标值。
new_X = np.array([[3, 5]]) # 新的特征数据 | |
predictions = model.predict(new_X) # 进行预测 | |
print('预测结果:', predictions) |
整体代码演示:
from sklearn.linear_model import LinearRegression #1.获取数据 x =[[80,86], [82,80], [85,78], [90,90], [86,82], [82,90], [78,80], [92,94]] y=[84.2, 80.6, 80.1, 90, 83.2, 87.6, 79.4, 93.4] #2.模型训练 # 2.1 实例化一个估计器 estimator =LinearRegression( ) # 2.2 使用fit方法进行训练 estimator.fit(x,y) #打印对应的系数: print("线性回归的系数是:\n", estimator.coef_) #打印的预测结果是: print("输出预测结果:\n", estimator.predict([[100,80]]))
数学:求导
线性回归的损失和优化
一、线性回归的损失函数
在线性回归中,损失函数通常用于度量模型预测值与实际值之间的差异。最常用的损失函数是最小二乘法(Least Squares)损失函数,也称为均方误差(Mean Squared Error, MSE)。MSE 损失函数的表达式为:
J(θ)=2m1i=1∑m(hθ(x(i))−y(i))2
其中,m 是样本数量,hθ(x(i)) 是模型对第 i 个样本的预测值,y(i) 是第 i 个样本的实际值,θ 是模型的参数向量。
MSE 损失函数通过计算所有样本预测值与实际值之差的平方和,并求其平均值来量化模型的预测误差。这个损失函数是凸函数,具有全局最小值,因此可以通过优化算法找到最优参数。
二、线性回归的优化方法
线性回归的优化目标是最小化损失函数,找到使损失函数最小的模型参数。常用的优化方法包括梯度下降法(Gradient Descent)和最小二乘法(Normal Equation)。
-
梯度下降法
梯度下降法是一种迭代优化算法,通过不断更新参数来最小化损失函数。在每次迭代中,算法会计算损失函数关于当前参数的梯度(即偏导数),然后根据梯度方向更新参数。参数更新的公式为:
θj+1=θj−α∂θj∂J(θ)
其中,α 是学习率,控制每次参数更新的步长;∂θj∂J(θ) 是损失函数关于参数 θj 的偏导数。
梯度下降法分为批量梯度下降、随机梯度下降和小批量梯度下降等多种变体,具体选择哪种变体取决于数据集的大小和计算资源等因素。
单变量--切线 多变量--向量
二、梯度下降法步骤
梯度下降法的一般步骤包括:
- 初始化参数:随机选择一组参数θ作为起始点。
- 计算梯度:在当前参数θ处,计算损失函数J(θ)的梯度∇J(θ)。
- 更新参数:根据梯度下降公式更新参数θ。
- 重复迭代:重复步骤2和步骤3,直到满足终止条件(如梯度足够小、迭代次数达到上限等)。
三、梯度下降法类型
根据每次迭代时使用的数据量不同,梯度下降法可以分为以下几种类型:
然后重复上述步骤,直到满足终止条件。
然后重复上述步骤,直到满足终止条件。
-
批量梯度下降法(Batch Gradient Descent, BGD):每次迭代使用整个训练集来计算梯度,并更新参数。这种方法在数据量较大时计算量很大,但通常能够得到全局最优解(如果损失函数是凸函数)。
迭代形式:
假设训练集包含m个样本,损失函数为J(θ),其中θ为模型参数。批量梯度下降法的迭代公式可以表示为:
[
\theta = \theta - \alpha \frac{1}{m} \sum_{i=1}^{m} \nabla_{\theta} J(\theta; x^{(i)}, y^{(i)})
]其中,α是学习率,x(i)和y(i)分别表示第i个样本的特征和标签,∇θJ(θ;x(i),y(i))表示损失函数关于参数θ的梯度。
-
随机梯度下降法(Stochastic Gradient Descent, SGD):每次迭代只随机选择一个样本来计算梯度,并更新参数。这种方法计算量小,收敛速度快,但可能无法收敛到全局最优解,而是在其附近波动。
迭代形式:
随机梯度下降法的迭代过程可以表示为:
-
随机选择一个样本i。
- 计算该样本对应的损失函数梯度∇θJ(θ;x(i),y(i))。
- 更新参数:θ=θ−α∇θJ(θ;x(i),y(i))。
-
小批量梯度下降法(Mini-batch Gradient Descent):每次迭代使用一小部分样本来计算梯度,并更新参数。这种方法是BGD和SGD的折中,既减少了计算量,又提高了收敛的稳定性。
迭代形式:
假设小批量的大小为b(b<m),小批量梯度下降法的迭代过程可以表示为:
-
从训练集中随机选择b个样本组成一个小批量。
- 计算这个小批量样本对应的损失函数梯度b1∑i=1b∇θJ(θ;x(i),y(i))。
- 更新参数:θ=θ−αb1∑i=1b∇θJ(θ;x(i),y(i))。
最小二乘法(正规方程)
最小二乘法是一种直接求解最优参数的方法,通过对损失函数求导并令其为零,可以解得参数的闭式解。对于线性回归问题,最小二乘法的参数更新公式为:
θ=(XTX)−1XTy
其中,X 是特征矩阵(包含所有样本的特征向量),y 是目标值向量。这个公式可以直接计算出最优参数 θ,无需迭代更新。但是,当特征矩阵 X 的维度很高或者样本数量很大时,计算 (XTX)−1 会非常耗时且可能不稳定。
欠拟合和过拟合
欠拟合(Underfitting)
欠拟合,也称为低拟合,是指模型对数据的学习或拟合程度不足,无法捕捉到数据中的潜在规律或趋势。这通常发生在模型的复杂度太低,无法适应数据的复杂结构时。例如,如果尝试使用线性模型来拟合非线性数据,就可能出现欠拟合的情况。
解决方法
- 增加模型复杂度:可以通过增加模型的参数或层数来提高其复杂度。
- 使用更复杂的算法:例如,从线性回归切换到多项式回归或神经网络。
- 增加更多特征:提供更多有用的输入特征给模型,以帮助其更好地捕捉数据的复杂性。
过拟合(Overfitting)
过拟合是指模型对数据的学习过于精细,以至于它捕捉到了数据中的噪声和异常值,而不是数据的一般规律。这通常发生在模型的复杂度过高,以至于它开始“记住”训练数据中的每一个细节时。
解决方法
- 简化模型:减少模型的参数或层数,以降低其复杂度。
- 增加数据量:提供更多的训练数据可以帮助模型学习到更一般化的规律,而不是仅仅记住训练集中的特定数据点。
- 使用正则化技术:如L1和L2正则化,可以帮助防止模型过拟合。
- 使用交叉验证:通过交叉验证来评估模型的性能,并选择泛化能力最好的模型。
正则化线性模型
L2正则化(岭回归或权重衰减)
L2正则化是最常见的正则化形式,它通过在损失函数中添加一个与权重向量的L2范数的平方成比例的项来工作。L2正则化倾向于分散权重的值,使其更小且更接近0,而不是让它们中的任何一个变得特别大。
一、岭回归的数学表达
岭回归的目标函数可以表示为:
J(θ)=2N1i=1∑N(y(i)−θTx(i))2+2λj=1∑Mθj2
其中,J(θ)是目标函数,N是样本数量,y(i)是第i个样本的真实值,x(i)是第i个样本的特征向量,θ是模型参数向量,M是特征数量,λ是正则化系数。第一项是线性回归的平方损失函数,第二项是L2正则化项。
二、岭回归的参数解释
- 正则化系数λ:λ控制了正则化的强度。λ越大,正则化效果越强,模型参数越小,模型越简单;反之,λ越小,正则化效果越弱,模型参数越接近无正则化时的估计值。
- 模型参数θ:在岭回归中,由于L2正则化的存在,模型参数的估计值会偏小,从而避免某些参数过大导致模型过拟合。
三、岭回归的实现
Ridge
类来实现岭回归:
alpha
:对应于正则化系数λ。fit_intercept
:是否计算截距项,默认为True。solver
:优化算法的选择,默认为'auto',即自动选择。对于大数据集,可以选择'sag'等随机梯度下降算法。normalize
:是否对数据进行标准化处理。如果为False,则可以在调用fit
方法之前使用preprocessing.StandardScaler
对数据进行标准化。
L1正则化(Lasso回归)
L1正则化通过在损失函数中添加一个与权重向量的L1范数(即权重绝对值的和)成比例的项来工作。与L2正则化相比,L1正则化倾向于产生稀疏权重矩阵,即很多权重值为0。这使得L1正则化成为一种有效的特征选择方法,因为它可以将不重要的特征对应的权重减小到0。
模型的加载和保存
因为在较新版本的 scikit-learn
中,sklearn.externals.joblib
已经被弃用
使用joblib保存模型
joblib是scikit-learn提供的一个优化过的序列化库,它特别适用于保存大型的NumPy数组和scikit-learn模型。
from sklearn.linear_model import LinearRegression | |
from sklearn.datasets import make_regression | |
from joblib import dump | |
# 生成回归数据集 | |
X, y = make_regression(n_samples=100, n_features=1, noise=0.1) | |
# 训练线性回归模型 | |
model = LinearRegression() | |
model.fit(X, y) | |
# 保存模型 | |
dump(model, 'linear_regression_model.joblib') |
在上面的代码中,dump
函数用于将训练好的线性回归模型model
保存到文件'linear_regr
ession_model.joblib'
中。
使用joblib加载模型
from joblib import load | |
# 加载模型 | |
loaded_model = load('linear_regression_model.joblib') |
在上面的代码中,load
函数用于从文件'linear_regression_model.joblib'
中加载模型,并将其赋值给loaded_model
变量。