评估机器学习模型

2019-03-24  本文已影响0人  庵下桃花仙

机器学习的目的是得到泛化(generalize)的模型,因此,解决过拟合很重要。

训练集、验证集、测试集

将数据分为三个集合:训练集、验证集、测试集。在训练集上训练模型,验证集上评估模型,一旦找到最佳参数,在测试集上最后测试模型。

为什么不划分为两个集合,仅有训练集和测试集?

因为开发模型时需要调节模型配置,通过模型在验证集上的性能来调节超参数(hyperparameter),这样就导致验证集的信息泄露(informationo leak)到模型中,很快导致模型在验证集上过拟合。而我们最需要的是模型在全新数据上的性能。
如果数据较少,有三种经典的评估方法:

简单的留出验证

简单的留出验证数据划分.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]])
上一篇下一篇

猜你喜欢

热点阅读