模型评估方法主要有三种:留出法、交叉验证法、自助法。这三个方法都需要将数据集分为测试集和训练集,用测试集的“测试误差”来近似模型的泛化误差。当然测试集和训练集应该尽可能做到互斥,这样得到的模型才具有较好的泛化性能。
1.留出法
留出法就是将数据集D直接划分为互斥的两个集合,分别作为训练集S和测试集T。用测试集T的测试误差来估计模型的泛化误差。
数据的划分比例一般是:2/3~4/5比例的样本用于训练,剩下的样本用于测试。
样本划分时要尽量保持数据分布的一致性,至少保留类别比例的相似,避免引入偏差。保留类别比例的采样通常称为“分层采样”(stratified sampling)。
给定样本划分比例后,数据集D的划分方式任然可以有多种,为了使得估计结果更加稳定可靠,应进行多次重复试验,取多次评估结果的平均值。
可以用sklearn中的StratifiedShuffleSplit函数进行实现,当然自己也可以简单地写一个。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
from sklearn.model_selection import StratifiedShuffleSplit
import numpy as np
X = np.array([[0, 1], [0, 2], [0, 3], [1, 8], [1,9], [1,10]])
y = np.array([0, 0, 0, 1, 1, 1])
#测试集的比例为0.333,采用分层抽样。且随机进行5次
sss = StratifiedShuffleSplit(n_splits=5, test_size=0.333)
for train_index, test_index in sss.split(X, y):
print("TRAIN:", train_index, "TEST:", test_index)
X_train, X_test = X[train_index], X[test_index]
y_train, y_test = y[train_index], y[test_index]
结果:
2.交叉验证法
交叉验证法是将数据集D划分为k份大小近似的互斥子集,同时尽可能做到数据分布的一致性(分层采样)。
每次用k-1个子