本文共 2440 字,大约阅读时间需要 8 分钟。
目录
前言
前段时间在忙项目合同的事情,这个学习耽误了一段时间,趁着年前不忙的时候,抓紧时间学完。
欠拟合和过拟合
- 欠拟合
定义:一个假设在训练集上不能得到更好的拟合,并且在测试集中也不能得到很好的拟合数据。
原因:模型过于简单,学习数据的特征少
解决办法:增加数据的特征数量
- 过拟合
定义:一个假设在训练数据上能够获得比其他假设更好的拟合,但在测试数据集上却不能很好的拟合数据,则认为为过拟合。
原因:模型过于复杂,原始特征过多,存在一些嘈杂特征
解决办法:正则化(主要用于回归),使得高次项的影响减少。
正则化
主要有两种方法:L1正则化和L2正则化。
L1正则化
原理:在原损失函数的基础上增加惩罚项,但惩罚项只是权重w的绝对值之和,其公式如下:
其中m为样本集的数量,n为特征值数,为惩罚系数。w为每个特征值的权重。
作用:可以使得其中一些w的值直接为0,删除了这个特征值的影响。
使用L1正则化的模型又称为Lasso回归。
L2正则化
原理:在原损失函数的基础上增加惩罚项,惩罚项是所有权重w的平方之和,其公式如下:
其中m为样本集的数量,n为特征值数,为惩罚系数。w为每个特征值的权重。
作用:可以使得其中一些w的值很小,接近于0,削弱了某个特征的影响。
使用L2正则化的模型又叫Ridge回归(岭回归)。
线性回归的优化就是使得损失函数减少,那对于加了惩罚项之后,不仅要使得损失函数减少,同样对于惩罚项也要减小。
从上述公式中可以看出,正则化力度越大,对应的权重w就越接近于0,反过来,正则化力度越小,对应的权重w就越大。
岭回归
岭回归就是带有L2正则化的线性回归。也是一种线性回归,只不过是在算法建立回归方程的时候,加上了L2正则化,从而解决过拟合。
对应在sklearn中的API
Ridge(self, alpha=1.0, fit_intercept=True, normalize=False, copy_X=True, max_iter=None, tol=1e-3, solver="auto", random_state=None)
其中参数含义如下:
参数 | 含义 |
alpha | 惩罚系数,正则化力度,就是我们前面公式中提到的 |
fit_intercept | 是否添加偏置,默认为True |
normalize | 是否将数据进行标准化,默认False,如果改为True,则我们不在需要对数据进行特征标准化处理 |
copy_X | 默认为True。如果为True,将复制X; 否则,它可能被覆盖。 |
max_iter | 最大迭代次数 |
solver | 默认为auto。会自动根据数据自动选择优化算法。 如果数据集、特征都比较多的时候,选择SAG。 还有其他值为‘svd’, ‘cholesky’, ‘lsqr’, ‘sparse_cg’, ‘sag |
random_state | 随机状态 |
其实Ridge相当于SGDRegressor( penalty='l2', loss="squared_loss"),只不过在SGDRegressor中使用的是SGD,而Ridge使用的是SAG。
返回值为:
参数 | 含义 |
coef_ | 回归系数,即线性模型中的w |
intercept_ | 偏置,即线性模型中的b |
实例还是分析之前提到的的预测波士顿房价的问题,代码如下:
from sklearn.linear_model import Ridgedef ridge(): # 1)获取数据集 boston = load_boston() # 2)划分数据集 x_train, x_test, y_train, y_test = train_test_split(boston.data, boston.target, random_state=22) # 3)进行标准化 transfer = StandardScaler() x_train = transfer.fit_transform(x_train) x_test = transfer.transform(x_test) # 4)预估器 estimator = Ridge() #estimator = SGDRegressor( penalty='l2', loss="squared_loss") estimator.fit(x_train, y_train) # 5)进行预测 y_predict = estimator.predict(x_test) print("线性模型的参数为 w :", estimator.coef_) print("线性模型的参数为 b:", estimator.intercept_) # )模型评估 error = mean_squared_error(y_test, y_predict) print("ridge 的误差值:", error) return
其运行结果为:
线性模型的参数为 w : [-0.63591916 1.12109181 -0.09319611 0.74628129 -1.91888749 2.71927719 -0.08590464 -3.25882705 2.41315949 -1.76930347 -1.74279405 0.87205004 -3.89758657]线性模型的参数为 b: 22.62137203166228ridge 的误差值: 20.656448214354967
其结果的误差值和正规方程LinearRegression求解的误差还是有差别的,我们可以通过调整Ridge里面的alpha、max_iter等的值来提高岭回归的准确度。
转载地址:https://blog.csdn.net/nihaomabmt/article/details/103911488 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!