Python——线性回归、梯度下降、正则化(原理)

目录

1 线性回归-最小二乘法(LSM)

2 梯度下降

3 数据归一化/标准化

4 过拟合和欠拟合

4.1 过拟合的处理 

4.2 欠拟合的处理 

5 正则化


一种通过属性的线性组合来进行预测的 线性模型 ,其目的是找到一条直线或者一个平面或者更高维的超平面, 使得预测值与真实值之间的误差最小化。

 

损失函数(Loss Function)

度量单样本预测的错误程度,损失函数值越小,模型就越好。 常用的损失函数包括:0-1损失函数、平方损失函数、绝对损失函数、对数损失函数等 。
代价函数(Cost Function)
度量全部样本集的平均误差。常用的代价函数包括均方误差、 均方根误差、平均绝对误差等。
目标函数(Object Function)
代价函数和正则化函数,最终要优化的函数。

 备注:损失函数的系数1/2是为了便于计算,使对平方项求导后的常数系数为1,这样在形式上稍微简单一些。有些教科书把系数设为1/2,有些设置为1,这些都不影响结果。

线性回归-最小二乘法(LSM)

2 梯度下降

批量梯度下降(Batch Gradient Descent,BGD)
梯度下降的每一步中,都用到了 所有 的训练样本
随机梯度下降(Stochastic Gradient Descent,SGD)
梯度下降的每一步中,用到 一个 样本,在每一次计算之后便更新参数 ,而不需要首先将所有的训练集求和
小批量梯度下降(Mini-Batch Gradient Descent,MBGD)
梯度下降的每一步中,用到了 一定批量 的训练样本

梯度下降与最小二乘法比较 

梯度下降:需要选择学习率𝛼,需要多次迭代,当特征数量𝑛大时也能较好适用,适用于各种类型的模型。

最小二乘法 :不需要选择学习率 𝛼 ,一次计算得出,需要计算 (X^TX)^{-1} ,如果特征数量𝑛 较大则运算代价大,因为矩阵逆的计算时间复杂度为𝑂(𝑛^ 3 ) ,通常来说当 𝑛 小于10000 时还是可以接受的,只适用于线性模型,不适合逻辑回归模型等其他模型。

数据归一化/标准化

需要做数据归一化/标准化

线性模型,如基于距离度量的模型包括KNN(K近邻)、K-means聚类、感知机和SVM。另外,线性回归类的几个模型一般情况下也是 需要 做数据归一化/标准化处理的。
不需要做数据归一化/标准化
决策树、基于决策树的Boosting和Bagging等集成学习模型对于特征取值大小并不敏感,如随机森林、XGBoost、LightGBM等树模型,以及朴素贝叶斯,以上这些模型一般 不需要 做数据归一化/标准化处理。

4 过拟合和欠拟合

4.1 过拟合的处理 

1.获得更多的训练数据
使用更多的训练数据是解决过拟合问题最有效的手段,因为更多的样本能够让模型学习到更多更有效的特征,减小噪声的影响。
2.降维
即丢弃一些不能帮助我们正确预测的特征。可以是手工选择保留哪些特征,或者使用一些模型选择的算法来帮忙(例如PCA )。
3.正则化
正则化 (regularization) 的技术,保留所有的特征,但是减少参数的大小( magnitude ),它可以改善或者减少过拟合问题。
4.集成学习方法
集成学习是把多个模型集成在一起,来降低单一模型的过拟合风险。

4.2 欠拟合的处理 

1.添加新特征
当特征不足或者现有特征与样本标签的相关性不强时,模型容易出现欠拟合。通过挖掘组合特征等新的特征,往往能够取得更好的效果。
2.增加模型复杂度
简单模型的学习能力较差,通过增加模型的复杂度可以使模型拥有更强的拟合能力。例如,在线性模型中添加高次项,在神经网络模型中增加网络层数或神经元
个数等。
3.减小正则化系数
正则化是用来防止过拟合的,但当模型出现欠拟合现象时,则需要有针对性地减小正则化系数。

5 正则化

可以看到在正则化的限制之下,𝑳𝟐正则化给出的最优解w*是使解更加靠近原点也就是说𝑳𝟐正则化能降低参数范数的总和

𝑳 𝟏 正则化给出的最优解 w* 是使解更加靠近某些轴 , 而其它的轴则为 0, 所以 𝑳 𝟏 正则化能使得到的 参数稀疏化 。 

6 简单代码 

from sklearn.metrics import mean_squared_error  #评价指标

#从sklearn算法库中导入线性回归模型算法
from sklearn.linear_model import c
clf = LinearRegression()#线性回归模型
clf.fit(train_data, train_target)#拟合
test_pred = clf.predict(test_data)#预测
score = mean_squared_error(test_target, clf.predict(test_data))#均方误差
print("LinearRegression:   ", score)


LinearRegression:    0.2642337917628173

代码: sklearn.linear_model.LinearRegression — scikit-learn 1.2.2 documentation

《python机器学习从入门到高级》:线性回归和正则化(含源码)_python机器学习正则化代码_JOJO数据科学的博客-CSDN博客

  • 1
    点赞
  • 6
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
下面是基于梯度下降算法的线性模型加正则化Python代码示例: ```python import numpy as np class LinearRegression: def __init__(self, learning_rate=0.01, iterations=1000, l1_penalty=0, l2_penalty=0): self.learning_rate = learning_rate self.iterations = iterations self.l1_penalty = l1_penalty self.l2_penalty = l2_penalty def fit(self, X, y): self.m, self.n = X.shape self.W = np.zeros(self.n) self.b = 0 self.X = X self.y = y for i in range(self.iterations): self.update_weights() return self def update_weights(self): y_pred = self.predict(self.X) dW = np.zeros(self.n) for j in range(self.n): if self.W[j] > 0: dW[j] = (2 * self.l2_penalty * self.W[j]) + self.l1_penalty else: dW[j] = (2 * self.l2_penalty * self.W[j]) - self.l1_penalty dW = dW + (1 / self.m) * np.dot(self.X.T, (self.y - y_pred)) db = (1 / self.m) * np.sum(self.y - y_pred) self.W = self.W - (self.learning_rate * dW) self.b = self.b - (self.learning_rate * db) return self def predict(self, X): return np.dot(X, self.W) + self.b ``` 在上面的代码中,`LinearRegression`类表示线性回归模型。在初始化时,我们指定了学习率、迭代次数、L1正则化参数和L2正则化参数。在`fit`方法中,我们初始化权重向量`W`和置`b`,然后对模型进行训练。在训练过程中,我们使用梯度下降算法更新权重向量和置。在`update_weights`方法中,我们计算了梯度向量`dW`和置的梯度`db`,并使用它们来更新权重向量`W`和置`b`。在计算梯度向量`dW`时,我们使用了L1和L2正则化,以避免过拟合问题。最后,在`predict`方法中,我们使用训练好的模型来进行预测。 使用上述代码示例,我们可以进行基于梯度下降算法线性回归模型加正则化的训练和预测。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值