机器学习的目的是得到泛化(generalize)的模型,因此,解决过拟合很重要。
训练集、验证集、测试集
将数据分为三个集合:训练集、验证集、测试集。在训练集上训练模型,验证集上评估模型,一旦找到最佳参数,在测试集上最后测试模型。
为什么不划分为两个集合,仅有训练集和测试集?
因为开发模型时需要调节模型配置,通过模型在验证集上的性能来调节超参数(hyperparameter),这样就导致验证集的信息泄露(informationo leak)到模型中,很快导致模型在验证集上过拟合。而我们最需要的是模型在全新数据上的性能。
如果数据较少,有三种经典的评估方法:
- 简单的留出验证;
- K折验证;
- 带有打乱数据的重复K折验证。
简单的留出验证
简单的留出验证数据划分.PNG# 留出验证
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) # 在验证数据上评估模型
# 现在你可以调节模型、重新训练、评估,然后再次调节......
model = get_model()
model.train(np.concatenate([training_data,
validation_data])) #一旦调节好超参数,
# 通常在所有非测试数据是哪个从头开始训练最终模型
test_score = model.evaluate(test_data)
缺点:如果数据较少,无法在统计学上代表数据。表现为不同的随机打乱,最终得到的模型性能差别很大。
解决方法:
1、K折验证;
2、重复的 K 折验证。
np.random.shuffle(x)
https://blog.csdn.net/brucewong0516/article/details/79012233
#现场修改序列,改变自身内容。(类似洗牌,打乱顺序)
In [30]: arr = np.arange(10)
In [31]: np.random.shuffle(arr)
In [32]: arr
Out[32]: array([5, 2, 7, 0, 6, 3, 4, 1, 8, 9])
#对多维数组进行打乱排列时,默认是对第一个维度也就是列维度进行随机打乱
In [37]: arr = np.arange(12).reshape(3,4)
In [38]: arr
Out[38]:
array([[ 0, 1, 2, 3],
[ 4, 5, 6, 7],
[ 8, 9, 10, 11]])
#将多维数组打乱
In [39]: np.random.shuffle(arr)
In [40]: arr
Out[40]:
array([[ 4, 5, 6, 7],
[ 0, 1, 2, 3],
[ 8, 9, 10, 11]])
网友评论