sklearn中
train_test_split将训练数据的一部分留出来做校验,不参与模型参数训练
– 优点:速度快
– 缺点:训练数据减少,一次校验集的划分会带来随机性
交叉验证(corss-valisation, CV),但训练时间延长
– 适合训练数据规模较大的情况(如上百万条记录)
– 适合训练慢的机器学习模型
k-折交叉验证:将训练数据等分成k份(k通常的取值为3、5或10)
– 重复k次每次留出一份做校验,其余k-1份做训练
– k次校验集上的平均性能视为模型在测试集上性能的估计,该估计比train_test_split得到的估计方差更小
from sklearn.model_selection import KFold
from sklearn.model_selection import cross_val_score #对给定参数的单个模型评估
kfold = KFold(n_splits=10, random_state=7)
results = cross_val_score(model, X, Y, cv=kfold)
print("Accuracy: %.2f%% (%.2f%%)" % (results.mean()*100, results.std()*100))
• 注意:如果每类样本不均衡或类别数较多,采用StratifiedKFold(有些类别少,有些类别多,不会每一份都属于同一个类别), 将数据集中每一类样本的数据等分.
通常 k-折交叉验证是评估机器学习模型的黄金准则(k=3, 5, 10)
• 当类别数目较多,或者每类样本数目不均衡时,采用stratified交
叉验证
• 当训练数据集很大, train/test split带来的模型性能估计偏差很
小,或者模型训练很慢时,采用train/test split
• 对给定问题找到一种技术,速度快且能得到合理的性能估计
• 如果有疑问,对回归问题,采用10-fold cross-validation ; 对分类, 采用stratified 10-fold cross-validation