第四章 机器学习基础
4.1 机器学习的四个分支、
监督学习
给定一组样本,可以学会奖输入数据映射到已知目标
主要包括分类和回归,还有一些奇特变体:
- 序列生成
- 语法树预测
- 目标检测
- 图像分割
无监督学习
没有目标的情况下寻找输入数据的变换,目的在于数据可视化、数据压缩、数据去噪或更好地理解数据中的相关性
方法:降维 聚类
自监督学习
没有人工标注的标签的监督学习。标签仍然存在,但是从输入数据中生成的,通常是使用启发式算法生成
强化学习
在强化学习中,智能体接收有关其环境的信息,并学会选择使某种奖励最大化的行动
4.2 评估机器学习模型
训练集、验证集、测试集
留出验证集的原因:调节模型会导致信息泄露,越多次根据模型在验证集上的性能来修改模型的参数,验证集的信息泄露越多,最后会得到一个在验证集上性能非常好的模型(人为造成的)。但我们需要关心的是在全新数据上的性能,因此需要一个完全没有被模型读取过的数据集来评估模型,即测试集。
简单的留出验证
num_validation_samples = 10000
np.random.shuffle(data) #通常需要打乱顺序
validation_data = data[:num_validation_samples] #定义验证集
data = data[num_validation_samples:]
training_data = data[:] #定义训练集
#在训练数据上训练模型,并在验证数据上评估模型
model = get_model()
model.train(training_data)
validation_score = model.evaluate(validation_data)
k折验证
如果模型性能的变化很大,那么这种方法很有用
带有打乱顺序的重复k折验证
可用的数据相对较少,又需要尽可能精确地评估模型,可以采用这种方法。
具体做法是多次使用K折验证,在每次将数据划分为K个分区之前都先将数据打乱,最终分数是每次K折验证分数的平均值。
评估模型的注意事项
- 数据代表性:通常需要随机打乱顺序
- 时间箭头:例如根据过去预测未来,那么在划分数据之前不应该随机打乱数据,因为会造成时间泄露。所以这种情况下,应该始终确保测试集中所有数据的时间都晚于训练集数据
- 时间冗余:数据中的某些数据点出现了两次,那么打乱数据并划分成训练集和验证集会导致训练集和验证集之间的数据冗余。一定要确保训练集和验证集之间没有交集
4.3 数据预处理、特征工程和特征学习
数据预处理:
-
向量化:神经网络的所有输入和目标都必须是浮点数张量(特定情况下可以是整数张量)
-
值标准化:一般来说,将取值相对较大的数据(比如多为整数,比网络权重的初始值大很多)或异质数据(比如数据的一个特征在0~1范围内,另一个特征在100~200范围内)输入到神经网络中是不安全的。这么做可能导致较大的梯度更新,进而导致网络无法收敛。所以输入数据应该要有以下特征:
1. 取值较小:大部分值应该在0~1范围之内 2.同质性:所有特征的取值都应该在大致相同的范围内
-
处理缺失值:对于神经网络,将缺失值设置为0是安全的,只要0不是一个有意义的值,网络能够从数据中学到0意味着缺失数据,并且会忽略这个值。
特征工程:
指将数据输入模型之前,利用自己关于数据和机器学习算法(神经网络)的知识对数据进行硬编码的变换(不是模型学到的),以改善模型的效果
4.4 过拟合和欠拟合
优化:调节模型以在训练数据上得到最佳性能(即机器学习中的学习)
泛化:训练好的模型在前所未见的数据上性能好坏
正则化(调节模型允许存储的信息量或对模型允许存储的信息加以约束)
防止过拟合的最简单的方法是减小模型大小
简单模型比复杂模型更不容易过拟合