本文共 2565 字,大约阅读时间需要 8 分钟。
模型评估方法
在机器学习中,我们通常面临着一个关键问题:如何评估模型的性能?评估模型的好坏,关键在于看它在新数据集上的表现,也就是泛化能力。然而,由于实际应用中没有标签的数据集,我们无法直接获取泛化误差。因此,我们需要在已知数据集中进行划分,使用一部分数据测试模型性能。
在划分数据集时,有三种主要方法:留出法、交叉验证和自助法。
留出法 留出法的思路非常简单。我们将数据集划分为两部分,一部分用于训练模型,另一部分用于测试。留出法在sklearn中可以通过train_test_split实现。例如,对于鸿爫花数据集,可以使用如下代码:
import numpy as npfrom sklearn.model_selection import train_test_splitfrom sklearn import svmiris = datasets.load_iris()print(iris.data.shape, iris.target.shape)X_train, X_test, y_train, y_test = train_test_split( iris.data, iris.target, test_size=0.4, random_state=0)print(X_train.shape, y_train.shape)print(X_test.shape, y_test.shape)clf = svm.SVC(kernel='linear', C=1).fit(X_train, y_train)print(clf.score(X_test, y_test))
输出结果显示,test_size可以接受浮点数表示测试集比例。留出法简单易用,但存在一些问题。例如,有些模型需要超参数评估时,还需要划分出验证集。这种划分方法使得数据集分为训练集、验证集和测试集,训练集用于模型训练,验证集用于参数调整,测试集用于模型评估。
然而,这种划分方式仍存在问题:验证集和测试集的划分会影响训练集的规模。此外,模型的性能会随着不同训练集和验证集的选择而变化。因此,我们引入了交叉验证(cross-validation)。
交叉验证 交叉验证的基本思想是将数据集划分为k等份。对于每一份数据集,其中k-1份作为训练集,单独的一份作为测试集。sklearn中提供了KFold实现,例如:
from sklearn.model_selection import KFoldimport numpy as npX = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])y = np.array([1, 2, 3, 4])kf = KFold(n_splits=2)for train_index, test_index in kf.split(X): print('train_index', train_index, 'test_index', test_index) train_X, train_y = X[train_index], y[train_index] test_X, test_y = X[test_index], y[test_index] 输出结果表明,KFold函数可以方便地获得所需的训练集和测试集。
在实际应用中,仅进行一次交叉验证可能不够。因此,我们常常使用RepeatedKFold方法进行多次交叉验证。例如:
from sklearn.model_selection import RepeatedKFoldX = np.array([[1, 2], [3, 4], [1, 2], [3, 4]])y = np.array([1, 2, 3, 4])kf = RepeatedKFold(n_splits=2, n_repeats=2, random_state=0)for train_index, test_index in kf.split(X): print('train_index', train_index, 'test_index', test_index) 输出结果表明,RepeatedKFold方法可以实现多次交叉验证。
留一法 留一法是留出法的特例,n等于数据集大小。当n较大时,留一法的计算量会很大,因为需要进行n次模型训练。因此,常常建议使用k折交叉验证,k的值通常为5或10。
自助法 自助法是一种有放回采样方法。通过对数据集多次采样,生成多个训练集,然后用未被采样的样本作为测试集。这种方法在数据集较小时有效,但在大数据集应用时,通常不推荐。
总结来说,交叉验证是评估模型性能的标准方法。通过划分训练集和测试集,可以更准确地评估模型的泛化能力。sklearn提供了多种交叉验证方法,如KFold、RepeatedKFold、LeaveOneOut等。选择合适的方法时,需要考虑数据集大小、任务需求以及计算资源。
在实际应用中,可以使用cross_val_score或cross_validate方法来评估模型性能。例如:
from sklearn.model_selection import cross_val_scorefrom sklearn.svm import SVCfrom sklearn.datasets import load_irisiris = load_iris()clf = SVC(kernel='linear', C=1, random_state=0)scores = cross_val_score(clf, iris.data, iris.target, cv=5)print(scores)
cross_val_score方法使用交叉验证计算模型评分,可以指定评分方法,如cv=5表示使用5折交叉验证。cross_validate方法则允许传入多个评估指标,并返回详细结果。
通过合理选择交叉验证方法,可以实现模型性能评估。这些方法在sklearn中实现,支持灵活配置,适合不同的应用场景。
转载地址:http://scof.baihongyu.com/