4.1 机器学习的四个分支
4.1.1 监督学习
含义:给定一组样本,它可以学会将输入数据映射到已知目标。
常见监督学习有:分类、回归、序列生成、语法树预测、目标检测、图像分割。
4.1.2 无监督学习
含义:是指在没有i目标的情况下寻找输入数据的有趣变换,其目的在于数据可视化、数据压缩、数据去噪或更好地理解数据中的相关性。
常见无监督学习有:降维、聚类。
4.1.3 自监督学习
含义:是没有人工标注的标签的监督学习,可以看作没有人参与的监督学习。
常见自监督学习有:自编码器、时序监督学习。
4.1.4 强化学习
含义:在强化学习中,智能体接收有关其环境的信息,并学会选择使某种奖励最大化的行动。
主要应用于游戏领域。
4.2 评估机器学习模型
4.2.1 训练集、验证集和测试集
(1)简单的留出验证:留出一定比例的数据作为测试集。在剩余的数据上训练模型,然后再测试机上评估模型。
1 from keras import models 2 from keras import layers 3 import numpy as np 4 5 data = list(range(60000)) #模拟全部样本 6 num_validation_samples = 10000 #验证集个数 7 num_test_samples = 10000 #测试集个数 8 np.random.shuffle(data) #随机打乱data 9 10 validation_data = data[:num_validation_samples]#验证集 10000个样本 11 training_data = data[num_validation_samples:-num_test_samples]#训练集 40000个样本 12 test_data = data[num_test_samples:]#测试集 10000个样本 13 14 #这里是示例,可以用keras建立更复杂的网络结构 15 def get_model(): 16 model = models.Sequential() 17 model.add(layers.Dense(1,activation='relu',input_shape=(1,))) 18 model.compile(optimizer='rmsprop',loss='mse',metrics=['mae']) 19 return model 20 21 model = get_model() 22 23 validation_score = model.evaluate(validation_data) 24 25 #调节模型、重新训练、评估等过程之后 26 27 model = get_model() 28 model.fit(np.concatenate([training_data,validation_data])) 29 30 test_score = model.evaluate(test_data)
(2)K折验证:将数据划分为大小相同的K个分区,对于每个分区i,再剩余的K-1个分区上训练模型,然后在分区i上评估模型。
1 from keras import models 2 from keras import layers 3 import numpy as np 4 5 data = list(range(60000)) #模拟全部样本 6 num_test_samples = 10000 #测试集个数 7 data = data[:-num_test_samples] 8 test_data = data[num_test_samples:]#测试集 10000个样本 9 k = 4 10 num_validation_samples = len(data) // k 11 np.random.shuffle(data) 12 13 validation_scores = [] 14 15 #这里是示例,可以用keras建立更复杂的网络结构 16 def get_model(): 17 model = models.Sequential() 18 model.add(layers.Dense(1,activation='relu',input_shape=(1,))) 19 model.compile(optimizer='rmsprop',loss='mse',metrics=['mae']) 20 return model 21 22 for fold in range(k): 23 validation_data = data[num_validation_samples * fold:num_validation_samples * (fold + 1)] 24 training_data = data[:num_validation_samples * fold] + data[num_validation_samples * (fold + 1):] 25 model = get_model() 26 model.fit(training_data) 27 validation_score = model.evaluate(validation_data) 28 validation_scores.append(validation_score) 29 30 validation_score = np.average(validation_scores) 31 32 model = get_model() 33 model.fit(np.concatenate([training_data,validation_data])) 34 test_score = model.evaluate(test_data)
(3)带有打乱数据的重复K折验证:如果可用的数据相对较少,而你又需要尽可能精确地评估模型,那么可以选择带有打乱数据的重复K折验证。
具体做法是多次使用K折验证,在每次将数据划分为K个分区之前都先将数据打乱。最终分数是每次K折验证分数的平均值。
1 from keras import models 2 from keras import layers 3 import numpy as np 4 5 data = list(range(60000)) #模拟全部样本 6 num_test_samples = 10000 #测试集个数 7 data = data[:-num_test_samples] 8 test_data = data[num_test_samples:]#测试集 10000个样本 9 epoch = 3 10 k = 4 11 num_validation_samples = len(data) // k 12 np.random.shuffle(data) 13 14 validation_scores = [] 15 16 #这里是示例,可以用keras建立更复杂的网络结构 17 def get_model(): 18 model = models.Sequential() 19 model.add(layers.Dense(1,activation='relu',input_shape=(1,))) 20 model.compile(optimizer='rmsprop',loss='mse',metrics=['mae']) 21 return model 22 for e in range(epoch): 23 for fold in range(k): 24 np.random.shuffle(data) 25 validation_data = data[num_validation_samples * fold:num_validation_samples * (fold + 1)] 26 training_data = data[:num_validation_samples * fold] + data[num_validation_samples * (fold + 1):] 27 model = get_model() 28 model.fit(training_data) 29 validation_score = model.evaluate(validation_data) 30 validation_scores.append(validation_score) 31 32 validation_score = np.average(validation_scores) 33 34 model = get_model() 35 model.fit(np.concatenate([training_data,validation_data])) 36 test_score = model.evaluate(test_data)
如代码所示:循环变成了两层循环,在24行每次都要随机打乱训练集data中的数据。
4.2.2 评估模型的注意事项
(1)数据代表性:如果数据本身是按类别连续分布的,需要随机打乱数据。
(2)时间箭头:如果要根据过去预测未来,不应该随机打乱数据,要保证测试集中所有数据都i晚于训练集数据。
(3)数据冗余:保证训练集和验证集之间没有交集。
未完待续……