目录
前言
前段时间在忙项目合同的事情,这个学习耽误了一段时间,趁着年前不忙的时候,抓紧时间学完。
欠拟合和过拟合
- 欠拟合
定义:一个假设在训练集上不能得到更好的拟合,并且在测试集中也不能得到很好的拟合数据。
原因:模型过于简单,学习数据的特征少
解决办法:增加数据的特征数量
- 过拟合
定义:一个假设在训练数据上能够获得比其他假设更好的拟合,但在测试数据集上却不能很好的拟合数据,则认为为过拟合。
原因:模型过于复杂,原始特征过多,存在一些嘈杂特征
解决办法:正则化(主要用于回归),使得高次项的影响减少。
正则化
主要有两种方法: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 Ridge
def 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.62137203166228
ridge 的误差值: 20.656448214354967
其结果的误差值和正规方程LinearRegression求解的误差还是有差别的,我们可以通过调整Ridge里面的alpha、max_iter等的值来提高岭回归的准确度。