与其他机器学习方法不同,随机森林存在OOB
,相当于自带多套训练集和测试集,内部可以通过OOB
作为评估模型准确性的一种方法。大多数其他机器学习方法都没有这种优势。
通常,当有一套数据时,它需要分为训练集和测试集。数据集一般按比例进行8:2
,7:3
,6:4
分为训练集和测试集。假如数据集很大,测试集不需要按比例完全分配,就够了。
测试集根本不用于训练模型。训练集在训练模型中可能存在过拟合问题(过拟合是指模型可以很好地匹配训练数据,但在预测其他数据时效果不好),因此一般需要将训练集的一部分作为验证集来评估模型的训练效果和调整模型的超参数 (hyperparameter
)。
下图显示了一套数据集的一般分配方法:
- 训练集用于构建模型。
- 验证集用于评估模型的一般错误率,并根据此调整超参数(
hyperparameter
,比如随机森林mtry
),获得当前最佳模型。 - 不需要验证集。如果不需要调整超参数,则无需验证集。
- 验证集获得的评估结果不是模型的最终结果,而是基于当前数据的优化结果。
- 最终模型构建采用所有训练集(包括从中分离出来的验证集)数据和选定的最优超参数。
- 测试集测试评估最终模型指标,如准确性、敏感性等。
一般来说,培训集相当于学习知识,验证集相当于课后测试学习效果,检查和填补空白。测试集是期末考试评估的模型。
可参考的分配规则:
- 对于小规模样本集(数万量级),常用的分配比例是
60%
训练集、20%
验证集、20%
测试集。 - 对于大型样本集(百万级以上),只要验证集和测试集的数量足够,比如有 100 w 然后保留条数据 1 w 验证集,1 w 测试集就够了。10000 w 保留同样的数据 1 w 验证集和 1 w 测试集。
- 超参数越少,或者超参数容易调整,可以降低验证集的比例,分配给训练集。
我们希望将训练集中的数据应用于更多的训练,但也需要验证初步评估模型和校正模型。
简单的交叉验证简单的交叉验证是从训练集中选择部分(如70%)作为新的训练集,其余部分(如30%)作为验证集。根据此选择最合适的模型或最佳模型参数。然后使用所有的训练来训练所选模型。它可以在一定程度上避免拟合事件的发生。但基于此70%
训练集评估的最佳模型是否等同于基于所有训练集的最佳模型。不同尺寸的验证集获得的评估结果差异很大,单纯按比例划分会导致无法选择最佳模型。另外,如果训练集小,分成这样,训练集的数量会更少,不利于获得更好的训练模型。
因此,提出了交叉验证操作,最常用的是K-fold
交叉验证 (k-fold cross validation
) 。
其目的是重复使用原始训练集中的数据,每个样品将作为训练集参与训练模型和测试集参与评估模型。当然,最大限度地利用所有数据也消耗了更多的计算时间。
其操作流程如下:
- 集成训练
K
一份(如果训练集有m
样本是一个样本,每个部分都有一个样本m/K
样本;如果不能排除其中一个集合会样本较少。) - 对于每个模型(如随机森林中的不同)
mtry
值,mtry=2
,mtry=10
不同的模型将分别构建;或不同的算法,如随机森林,支持向量机,logistic 回归等) for j in 1, 2, 3, … K: 第j份数据将集中在训练中为新的训练集,用于训练模型 模型错误率采用第j份数据测试模型 - 第二步就能得到
1
个模型和K
错误率,这个K
错误率的平均值和方差是该模型的一般错误率。 - 重复每个模型
2
和3
第一步,选择一般错误率最低的模型作为当前最佳模型。 - 用所有数据训练当前的最佳模型,以获得最终的训练结果。
- 采用独立的测试集测试模型错误率。
该操作的优点是:
- 所有训练集的样品都参与了每个模型的训练,最大限度地利用了数据。
- 多验证集多次评估,能更好地反映模型的预测性能。
下一步的关键是如何选择K
,通常为5
或10
(10是最常用的经验值,但根据自己的数据集5
,20
也有可能得到更好的结果)。
K
新训练集与总训练集的差异越大,评价偏差越小。
极端情况下K=m
,只有每个子数据集 1
样品,也叫样品LOOCV - leave one out-cross validation
。
假设有一个包含数据集的数据集6
个样品。
# 假设有一个包含数据集的数据集 6 个样品m = 6train__set <- paste0(a', 1:m)train_set## [1] "a1" "a2" "a3" "a4" "a5" "a6"
利用其构建2
-折叠交叉验证数据集。
K = 2set.seed(1)# 下面的代码随机从1行代码随机从1:K 与样品数量一致的索引值中有放回选择# 相同索引值的样本属于foldkfold <- sample(1:K, size=m, replace=T)kfold## [1] 1 2 1 1 2 1
从下面的数据可以看出,每个子集的大小都不一样。这通常不是我们所期望的结果。
table(kfold)## kfold## 1 2 ## 4 2
修改如下,再次获取kfold
:
kfold <- sample(rep(1:K, length.out=m), size=m, replace=F)kfold## [1] 1 2 2 2 1 1
这次每个fold
样品数量一致。
# 如果 m/K 最后一个不能整除的时候 fold 样本数量少table(kfold)## kfold## 1 2 ## 3 3
然后构建每一个fold
训练集和测试集
current_fold = 1train__current_fold = train_set[kfold!=current_fold]validate_current_fold = train_set[kfold==current_fold]print(paste("Current sub train set:", paste(train_current_fold, collapse=",")))## [1] "Current sub train set: a2,a3,a4print(paste("Current sub validate set:", paste(validate_current_fold, collapse=",")))## [1] "Current sub validate set: a1、a5、a6
写一个函数循环构建。通过输出,体验训练集和测试集的样品选择。
K_fold_dataset <- function(current_fold, train_set, kfold){ train_current_fold = train_set[kfold!=current_fold] validate_current_fold = train_set[kfold==current_fold] c(fold=current_fold, sub_train_set=paste(train_current_fold, collapse=","), sub_validate_set=paste(validate_current_fold, collapse=","do.call(rbind, lapply(1:K, K_fold_dataset, train_set=train_set, kfold=kfold))## fold sub_train_set sub_validate_set## [1,] "1" a2,a3,a4 a1,a5,a6 ## [2,] "2" a1,a5,a6 a2,a3,a4
- 机器学习算法 - 随机森林决策树初探(1)
- 机器学习算法-随机森林决策树R 代码从头暴力(2)
- 机器学习算法-随机森林决策树R 代码从头暴力(3)
- 机器学习算法-随机森林理论概述
- 随机森林拖了这么久,终于到了实战。首先,分享许多应用于机器学习的癌症表达数据集 https://file.biolab.si/biolab/supp/bi-cancer/projections/。
- 机器学习算法-随机森林初探(1)
- 机器学习 模型评价指标 - ROC曲线和AUC值