赞
踩
后面这项叫作正则化项,可以对需要求出的参数θ的大小进行抑制
加入L2正则化项后,线性规划问题的解析解前面不再是X.T与X的乘积,加上λI后,从半正定变成了正定矩阵,从而确保了矩阵有逆
我们有时希望得到的模型参数更稀疏,即参数中的数量尽可能多。由于L0范数衡量的是向量中非零元素的个数,因此,我们可以选用L0范数来进行正则化,最小化范数就会使向量中的非零元素尽可能少。然而,L0范数中含有示性函数II,并不可导,无论是解析求解还是梯度下降都比较困难。因此,我们常用L1范数代替L0范数作为约束。理论上可以证明,L1范数是对L0范数的非常好的近似
L1正则化的解析求解较为困难,但是可以利用梯度下降法得到数值解。带有约束的线性回归方法又称作最小绝对值收敛和选择算子(least absolute shrinkage and selection operator,LASSO)回归,简称 LASSO 回归
左图绘制了不带有正则化的损失函数J0(θ)的等值线,在每个椭圆上,损失函数的值相等。颜色越偏蓝的地方损失越小,越偏红的地方则越大。椭圆中心θ*的是损失函数J0(θ)的最小值点,也就是最优参数。当不加正则化约束时,对损失函数做梯度下降,最终就会收敛到θ*。
中图和右图分别描绘了带有L2正则化和L1正则化时损失函数等值线的变化。可以明显看出,引入正则化后,由于零向量的范数最小,损失函数较小的区域向原点偏移了,且形状也有变化。作为参考,图中的蓝色椭圆是原始损失函数J0的等值线,而红色的圆形或方形是相应范数的等值线。图中的θ*是带正则化的最优参数。可以证明,整体损失函数的最小值会在某两条等值线相切的地方取到,而具体的位置受正则化强度λ的控制。λ越小,能容忍的范数值就越大,最优参数就离原点就越远
模长为1是因为有正则化
不同模型有不同的利用相似度的方式,比如 KNN 就直接把相似度作为直接依据进行分类,而更复杂的模型可能要对相似度进行更加复杂的变换。
Q:为什么直接内积作为相似度是合理的?
A:对特征先做映射处理其实就得到了核函数,也就是自定义的矩阵内积方式,而核函数并不在意具体的特征变换是什么,而是只关注原始空间中向量的内积
参数是训练过程中机器自动求解出来的,超参数是人为提前设置的
在训练模型时,只观察训练集上损失函数的变化情况是远远不够的。但是在现实场景中,测试数据又是未知的,无法在训练时获得。因此,我们通常采用人为构造“测试集”的方法,将数据集随机划分为训练集和验证集(validation set)两部分,用验证集来代替测试集的作用。
将数据集随机分成k份,记其编号为1....k。接下来进行k次独立的训练,第i次训练时,将第i份作为验证集,其他k-1份合起来作为训练集。最后,将k次训练中得到的验证集上误差的平均值,作为模型最终的误差。
1.A。在训练集上学得的模式可以应用于没见过的数据上
2.C。彼此相互独立
3.否。噪声只是其中一个原因
4.不可以。机器学习模型通常依赖于数据中存在的统计规律来进行预测,而真随机数是没有任何规律可言的,它们是完全随机的,不受任何先验知识或规律的影响
5.划分比例、batch_size、训练次数。N不是
6.如果训练集效果也差就是欠拟合,如果训练集效果很好就是过拟合
7.
- import numpy as np
- import matplotlib.pyplot as plt
- from sklearn.preprocessing import StandardScaler
- from sklearn.linear_model import LinearRegression
- from sklearn.model_selection import cross_val_score, KFold
-
- # 从源文件加载数据,并输出查看数据的各项特征
- lines = np.loadtxt('USA_Housing.csv', delimiter=',', dtype='str')
- header = lines[0]
- lines = lines[1:].astype(float)
- print('数据特征:', ', '.join(header[:-1]))
- print('数据标签:', header[-1])
- print('数据总条数:', len(lines))
-
- # 划分输入和标签
- X, y = lines[:, :-1], lines[:, -1]
-
- # 设置交叉验证
- num_folds = 5
- kf = KFold(n_splits=num_folds, shuffle=True, random_state=0)
-
- # 初始化线性模型
- linreg = LinearRegression()
-
- # 交叉验证选择最佳模型
- best_model = None
- best_rmse = float('inf')
- for train_index, val_index in kf.split(X):
- X_train, X_val = X[train_index], X[val_index]
- y_train, y_val = y[train_index], y[val_index]
-
- # 数据归一化
- scaler = StandardScaler()
- X_train_scaled = scaler.fit_transform(X_train)
- X_val_scaled = scaler.transform(X_val)
-
- linreg.fit(X_train_scaled, y_train)
- y_pred = linreg.predict(X_val_scaled)
- rmse = np.sqrt(((y_pred - y_val) ** 2).mean())
- # if rmse < best_rmse:
- # best_rmse = rmse
- # best_model = linreg
- print(rmse)
可以看到用了五折交叉验证
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。