1.经验误差与过度拟合
错误率(E):错误样本数(a)占样本总数(m)的比例 E = a / m
精度:1 - E = 1 - a/m (通常为百分比形式)
误差:学习器的实际输出与样本的真实输出之间的差异
学习器在训练集上的误差称为“训练误差”或“经验误差”,在新样本上的误差称为“泛化误差”
过拟合(过配):学习把训练样本学得“太好”时,可能把训练样本自身的一些特点当作潜在样本都具 有的一般性质,导致泛化性能下降 与过拟合相对的即欠拟合(欠配)
2.评估方法
划分训练集S和测试集T
(1)留出法 hold-out
将数据集划分为两个互斥的集合,一个集合作为训练集S,另一个集合作为测试集T,在S上训练出模型,用T评估其测试误差作为对泛化误差的估计。
注意:从采样角度,通常保留类别比例的采样方式(分层采样)
采用若干次随即划分、重复进行实验后取平均值作为留出法的评估结果
通常将样本的2/3~4/5用于训练,剩余样本用于测试
from sklearn.model_selection import train_test_split
# 用train_test_split划分训练集和测试集
train_X , test_X, train_Y ,test_Y = train_test_split(X, Y, test_size=0.2,random_state=0)
# X为原始数据的自变量,Y为原始数据因变量;
# train_X,test_X是将X按照8:2划分所得;
# train_Y,test_Y是将X按照8:2划分所得;
# test_size是划分比例;
# random_state设置是否使用随机数
#例如:
#in
X = np.arange(10).reshape((5, 2))
y = np.arange(5)
# print(X)
# print(list(y))
X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33,random_state=42)
print(X_train,y_train,X_test,y_test)
#out
#[[4 5] [0 1] [6 7]]
#[2 0 3]
#[[2 3] [8 9]]
#[1 4]
(2)交叉验证法 cross validation
将数据集划分为k个大小相似的互斥子集,每个子集都尽可能保持数据分布的一致性(分层采样得到)每次用k-1个子集的并集作为训练集,余下的1个子集作为测试集,从而可以进行k次训练和测试,最终返回的是这k个测试结果的均值
此方法评估结果的稳定性和保真性很大程度上取决于k的取值,因此通常成为 “k折交叉验证”
为减小因样本划分不同引入的差别,k折交叉验证通常要随即使用不同的划分重复p次,最终评估结果为p次k折交叉验证结果的均值(10次10折交叉验证与100次留出法都进行了100次训练/测试)
若数据集有m个样本,当k = m,得到了交叉验证法的特例------留一法(LOO)
绝大数情况下,留一法被实际评估的模型与期望估计的训练出的模型很相似,评估结果比较准确 缺陷:数据集比较大时训练m个模型的计算开销可能是难以忍受的,而且其估计结果未必永远准确
from sklearn.model_selection import KFold
KFold(n_splits=5, *, shuffle=False, random_state=None)
# n_splits:int, 默认为5(表示拆分成5折)
# shuffle: bool, 默认为False 切分数据集之前是否对数据进行洗牌 True洗牌 False不洗牌
# random_state:int, 默认为None 可按自己喜好设定成整数,设定好后,就不能再更改
# shuffle为True,random_state为None,则每次运行代码,获得的数据切分都不一样,
# random_state指定时,则每次运行代码,都能获得同样的切分数据,保证实验可重复
方法
1.get_n_splits(X=None, y=None, groups=None) 返回交叉验证器中的分裂迭代次数
2.split(X, y=None, groups=None