前言
在机器学习中,我们经常需要评估模型的性能。而为了准确评估模型的性能,我们需要使用一种有效的评估方法。五折交叉验证(5-fold cross-validation)就是其中一种常用的模型评估方法,用于评估机器学习模型的性能和泛化能力。
在本文中,我们将介绍五折交叉验证的原理和实现方法,并探讨其在模型评估中的重要性。
sklearn实现交叉验证
数据集使用sklearn中常见的多分类数据,iris数据集。以下是导入库和数据的示例代码:
from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score,cross_validate
# iris数据
X, y = datasets.load_iris(return_X_y=True)
# 设置参数搜索范围
param_grid = [
{'kernel': ['linear', 'poly', 'rbf'], 'C': [0.1, 1.0, 10.0]},
]
# 进行网格搜索
grid_search = GridSearchCV(SVR(), param_grid, cv=5)
grid_search.fit(X, y)
best_params = grid_search.best_params_
print(best_params)
# {'C': 10.0, 'kernel': 'rbf'}
clf = SVR(kernel="rbf",C=10)
在上面代码中,我们使用iris
数据集,对SVR
模型进行网格搜索,找到合适的参数:{'C': 10.0, 'kernel': 'rbf'}
接下来我们在使用五折交叉验证对模型进行进一步评估。
第一种方法
使用cross_validate()
方法进行验证,以下是示例代码:
# 多分类模型的评估指标
# 多分类模型的
scoring = ["f1_macro","precision_macro","recall_macro"]
cross_validate(clf, X, y, cv=5, scoring=scoring)
代码运行结果如下:
{'fit_time': array([0.00298905, 0.00498605, 0.00598025, 0.00199437, 0.0079782 ]),
'score_time': array([0.00499058, 0.00897241, 0.00701547, 0.01296639, 0.01496029]),
'test_f1_macro': array([0.96658312, 0.96658312, 0.96658312, 0.93333333, 1. ]),
'test_precision_macro': array([0.96969697, 0.96969697, 0.96969697, 0.93333333, 1. ]),
'test_recall_macro': array([0.96666667, 0.96666667, 0.96666667, 0.93333333, 1. ])}
fit_time:
模型训练时间score_time:
模型评估指标计算时间test_f1_macro:
-test_precision_macro:
验证指标的test_f1_macro分数结果test_precision_macro:
验证指标的precision_macro分数结果test_recall_macro:
验证指标的recall_macro分数结果
第二种方法
使用KFlod和StratifiedKFold方法对数据进行交叉验证,两者的主要区别是,KFold是随机划分,对类别不均衡的数据,可能出现全是0标签,或者全是1标签的数据集。StratifiedKFold使用的是分层抽样,若数据集有4个类别,比例是2:3:3:2,则划分后的样本比例约是2:3:3:2。避免随机划分数据集出现的偶然性。
以下是用KFlod和StratifiedKFold方法对数据进行交叉验证的示例代码:
result = {
'test_f1_macro':[],
'test_precision_macro':[],
'test_recall_macro':[]
}
for train, test in kfolder.split(X,y):
X_train, X_test = X[train], X[test]
y_train, y_test = y[train], y[test]
# # 训练模型
clf = clf.fit(X_train, y_train)
# 在训练集上进行预测并计算R2和RMSE
y_pred = clf.predict(X_test)
f1 = f1_score( y_test, y_pred, average='macro' )
p = precision_score(y_test, y_pred, average='macro')
r = recall_score(y_test, y_pred, average='macro')
result["test_f1_macro"].append(round(f1,2))
result["test_precision_macro"].append(round(p,2))
result["test_recall_macro"].append(round(r,2))
print(result)
代码运行结果如下:
{'test_f1_macro': [0.96, 0.97, 0.97, 0.97, 0.96],
'test_precision_macro': [0.96, 0.97, 0.97, 0.97, 0.97],
'test_recall_macro': [0.97, 0.97, 0.97, 0.97, 0.96]}
对比发现,使用第一种方法代码更简洁高效,第二种方法更加详细可控,找到你更喜欢的方式编程即可。
什么是五折交叉验证
在机器学习中,我们通常需要将数据集分为训练集和测试集。训练集用于训练模型,而测试集用于评估模型的性能。然而,使用一次性划分的训练集和测试集可能会导致模型在特定的数据集上表现良好,但在其他数据集上表现较差。这是由于模型可能过度拟合了训练集的特定模式,而无法泛化到其他数据集。
为了解决这个问题,五折交叉验证将数据集划分为五个相等大小的子集,其中四个子集用于训练模型,而剩下的一个子集用于测试模型。这个过程被重复五次,每次使用不同的子集作为测试集。最终,将五次测试结果的平均值作为模型的性能指标。
五折交叉验证的优点之一是可以更好地评估模型的泛化能力。通过使用多个不同的测试集,我们可以更准确地估计模型在未见过的数据上的性能。此外,五折交叉验证还可以更充分地利用数据集,因为每个样本都会在训练集和测试集中出现。
为什么要使用五折交叉验证
五折交叉验证有以下几个优点:
1. 减少过拟合:通过使用多个不同的训练集和测试集组合,可以减少模型对特定训练集的过拟合情况。
2. 更准确的评估模型性能:五折交叉验证可以提供更准确的模型性能评估,因为它使用了多个不同的测试集进行评估。
3. 更好的参数调优:通过使用五折交叉验证,我们可以更好地进行参数调优。我们可以在每一次交叉验证中使用不同的参数组合,并选择性能最好的参数组合。
如何使用五折交叉验证
使用五折交叉验证的步骤如下:
-
将数据集划分为五个相等大小的子集。
-
对于每一次交叉验证,选择其中的四个子集作为训练集,剩下的一个子集作为测试集。
-
使用训练集训练模型,并使用测试集评估模型的性能。
-
重复上述步骤五次,每次使用不同的子集作为测试集。
-
将五次评估的结果按照特定的计算方式计算作为最终的评估结果。
总结
五折交叉验证是一种常用的评估方法,它可以减少过拟合,提供更准确的模型性能评估,并帮助进行参数调优。在实际应用中,我们可以使用五折交叉验证来评估和改进我们的机器学习模型。