Python深度学习笔记06--机器学习基础

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)数据冗余:保证训练集和验证集之间没有交集。

 

未完待续……

 

上一篇:C#Web Api-IValidatableObjectvalidationContext服务提供者为null


下一篇:javax validation