Regularization 正规化
学习资料:
- 相关代码
- 机器学习-简介系列 过拟合
- 什么是 L1/L2 正则化 短片
要点¶
什么是 overfitting ?
我们在用机器学习模型时,会把数据集分为训练集和测试集,训练集用来学习模型,测试集相当于新数据,用来检验模型的效果。
对于训练集,学习的效果非常好,甚至接近完美地穿过每个点,或者非常准确地进行了分类,但是把这个模型应用于新的数据集上,表现就特别差。这种现象叫做过拟合。
例如上图,对于训练集,左边的分类器误差比右边的大,但是处理新数据时,左边的误差就会比右边的小,因为右边太适合当前训练集的个性化了,而对普遍的规律不能进行更好地概括。
所以在实际运用时要尽量减小 overfitting。常用的方法有 L1,L2 正则化。
导入模块并创建数据¶
引入需要使用的Python包:
数据用的是 load_boston
房价数据,有 500 多个样本,13 个 feature,每个样本对应一个房价。 其中 y 通过增加维度 [:, np.newaxis]
由列表结构变成了矩阵的形式。
x 因为各个 feature 的取值范围区别较大,所以用 minmax_normalization
对数据进行归一化,这样可以把每个 feature 都压缩到 0-1 的范围。
把数据集分为训练集和测试集,交叉验证,来检验模型是否真正地学习好了。 交叉验证还可以用来筛选合适的参数。
建立模型¶
建立两个神经层,l1
有 13 个属性,50 个神经元,激活函数是 T.tanh
。 l2
的输入值为前一层的输出,有 50 个,输出值为房价,只有 1 个。
接下来计算 cost
,第一种表达式是没有正则化的时候,会发现 overfitting 的现象。 第二种是加入 L2
正则化的表达,即把所有神经层的所有 weights 做平方和。 第三种是加入 L1
正则化的表达,即把所有神经层的所有 weights 做绝对值的和。 接着定义梯度下降。
激活模型¶
定义学习率,训练函数等。
训练模型¶
用 train_err_list
等来记录训练过程中产生的误差,方便后面可视化。 训练 1000 次,每 10 步记录一次训练集和测试集的误差。
可视化结果¶
最后可视化两种误差,红色是训练集的,蓝色是测试集。
没有正则化时,训练集的误差会逐渐变小,但是测试集的误差越来越大,这就是有 overfitting 。
用 L2
正则化时,比上一个好很多,测试集的误差也在不断减小。