在数据科学项目生命周期中,机器学习是一个重要组成部分,尝试使用不同类型的机器学习模型来训练数据集。然而,如果没有适当的模型验证,对训练模型的泛化能力——即在未见过的数据上表现良好的信心——永远不会很高。模型验证可以帮助实现许多目标,包括确保模型泛化,即在未见过的数据上表现良好,以及帮助找到最佳模型、模型参数和准确度指标。
为了解决特定的业务问题,手头有很多模型可供选择,但需要确保最终选择的模型在未见过的数据上表现良好,这是主要目标。因此,不能仅仅依赖评估指标来选择最佳表现模型。需要更进一步的验证方法,以帮助决定最终的机器学习模型,以便可以将其部署到生产环境中。
让首先理解验证的确切含义。验证是验证计算变量之间关系的数学结果是否可接受作为数据描述的过程。在模型构建后,对训练数据集进行误差估计,这被称为残差评估。在评估残差步骤中,通过找到预测输出和原始输出之间的差异来找到训练误差。但这个指标不能真实反映模型在未见过的数据上的表现,因为模型可能存在欠拟合或过拟合。
交叉验证是一种统计方法,用于发现机器学习模型的性能。它用于保护模型免受过拟合的影响,特别是在数据量可能有限的情况下。在交叉验证中,将数据集划分为固定数量的折叠(或分区),在每个折叠上运行分析,然后平均整体误差估计。
在处理实际的机器学习任务时,首要任务是正确识别问题,以便可以选择最适合的算法,以获得最佳性能。但如何比较模型呢?假设已经用可用的数据集训练了模型,现在是时候检查模型的性能了。一种方法是在训练数据集上测试模型,但这可能不是一个好的实践。
如果这样做,假设训练数据涵盖了所有可能的现实世界场景,这在实际问题中肯定永远不会是情况。主要目标是模型应该能够在现实世界的数据上很好地工作,尽管训练数据集也是现实世界的,但它代表了所有可能数据点的一小部分。
因此,要了解模型的真实得分或性能,它应该在它从未见过的数据上进行测试,这组数据通常被称为测试集。
让详细讨论不同类型的交叉验证技术。交叉验证技术可以分为两大类:非穷尽方法和穷尽方法。
这些方法不包括分割原始数据集的所有方式。
使用这种方法,首先将初始数据集分成两部分——训练数据和测试数据。然后,在训练数据上训练模型,然后在未见过的数据上查看性能。要实现这种方法,首先随机打乱数据,然后再进行分割。这种方法可能会导致不稳定性,因为在不同的数据点组合上训练模型,模型在每次训练后都可能给出不同的结果。此外,永远无法确保训练集代表整个数据集。
它试图解决留出方法的问题。它确保模型得分不依赖于选择训练和测试子集的方式。在这种方法中,将数据集分成k个子集,重复留出方法k次。
from sklearn.model_selection import KFold
model = DecisionTreeClassifier()
kfold_validation = KFold(10)
from sklearn.model_selection import cross_val_score
results = cross_val_score(model, X, y, cv=kfold_validation)
print(results)
print(np.mean(results))
它试图解决k折方法的问题。由于在之前的方法是随机打乱数据然后将其分成折叠,在某些情况下,可能会得到高度不平衡的折叠,这可能会导致模型偏向于特定类别。
from sklearn.model_selection import StratifiedKFold
skfold = StratifiedKFold(n_splits=5)
model = DecisionTreeClassifier()
scores = cross_val_score(model, X, y, cv=skfold)
print(scores)
print(np.mean(scores))
这些方法测试模型在所有可能的方式上分割原始数据集为训练和验证集。
from sklearn.model_selection import LeaveOneOut
model = DecisionTreeClassifier()
leave_validation = LeaveOneOut()
results = cross_val_score(model, X, y, cv=leave_validation)
print(np.mean(results))