当前位置:   article > 正文

动手学机器学习机器学习的基本思想+习题

动手学机器学习机器学习的基本思想+习题

正则化

后面这项叫作正则化项,可以对需要求出的参数θ的大小进行抑制

加入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.

  1. import numpy as np
  2. import matplotlib.pyplot as plt
  3. from sklearn.preprocessing import StandardScaler
  4. from sklearn.linear_model import LinearRegression
  5. from sklearn.model_selection import cross_val_score, KFold
  6. # 从源文件加载数据,并输出查看数据的各项特征
  7. lines = np.loadtxt('USA_Housing.csv', delimiter=',', dtype='str')
  8. header = lines[0]
  9. lines = lines[1:].astype(float)
  10. print('数据特征:', ', '.join(header[:-1]))
  11. print('数据标签:', header[-1])
  12. print('数据总条数:', len(lines))
  13. # 划分输入和标签
  14. X, y = lines[:, :-1], lines[:, -1]
  15. # 设置交叉验证
  16. num_folds = 5
  17. kf = KFold(n_splits=num_folds, shuffle=True, random_state=0)
  18. # 初始化线性模型
  19. linreg = LinearRegression()
  20. # 交叉验证选择最佳模型
  21. best_model = None
  22. best_rmse = float('inf')
  23. for train_index, val_index in kf.split(X):
  24. X_train, X_val = X[train_index], X[val_index]
  25. y_train, y_val = y[train_index], y[val_index]
  26. # 数据归一化
  27. scaler = StandardScaler()
  28. X_train_scaled = scaler.fit_transform(X_train)
  29. X_val_scaled = scaler.transform(X_val)
  30. linreg.fit(X_train_scaled, y_train)
  31. y_pred = linreg.predict(X_val_scaled)
  32. rmse = np.sqrt(((y_pred - y_val) ** 2).mean())
  33. # if rmse < best_rmse:
  34. # best_rmse = rmse
  35. # best_model = linreg
  36. print(rmse)

可以看到用了五折交叉验证

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/羊村懒王/article/detail/343852
推荐阅读
相关标签
  

闽ICP备14008679号