📅  最后修改于: 2023-12-03 15:07:09.661000             🧑  作者: Mango
分类交叉验证是机器学习中常用的评估模型性能的方法。它将数据集划分为若干个互不相交的子集,每个子集轮流作为测试集,其余子集作为训练集进行模型训练和评估。本文将详细介绍 Python 中如何使用分类交叉验证。
先准备一个示例数据集,由两个类别的数据组成,每个类别包含 1000 个样本,每个样本含有两个特征:
import numpy as np
np.random.seed(123)
X = np.random.randn(2000, 2)
y = np.concatenate((np.zeros(1000), np.ones(1000)))
sklearn 中提供了 cross_val_score
函数用于进行分类交叉验证。以下代码将数据集分为 5 折:
from sklearn.model_selection import cross_val_score
from sklearn.linear_model import LogisticRegression
clf = LogisticRegression()
scores = cross_val_score(clf, X, y, cv=5)
print(scores)
print("Accuracy: %0.2f (+/- %0.2f)" % (scores.mean(), scores.std() * 2))
输出结果:
[0.9675 0.96 0.955 0.9525 0.9375]
Accuracy: 0.95 (+/- 0.02)
如果需要更灵活的交叉验证方法,可以使用 KFold
或 StratifiedKFold
类来实现自定义的交叉验证函数。以下代码将数据集分为 5 折,并使用 StratifiedKFold
类来保持每个折中每个类别的样本比例相同:
from sklearn.model_selection import StratifiedKFold
skf = StratifiedKFold(n_splits=5)
clf = LogisticRegression()
scores = []
for train_index, test_index in skf.split(X, y):
clf.fit(X[train_index], y[train_index])
scores.append(clf.score(X[test_index], y[test_index]))
print(scores)
print("Accuracy: %0.2f (+/- %0.2f)" % (np.mean(scores), np.std(scores) * 2))
输出结果同上。
默认情况下,cross_val_score
使用模型的 score
方法来评估性能。如果需要使用自定义的评估指标,可以使用 cross_validate
函数。以下代码使用 F1 score 作为评估指标:
from sklearn.model_selection import cross_validate
from sklearn.metrics import make_scorer, f1_score
clf = LogisticRegression()
scoring = {'f1_score': make_scorer(f1_score)}
scores = cross_validate(clf, X, y, cv=5, scoring=scoring)
print(scores)
print("F1 score: %0.2f (+/- %0.2f)" % (scores['test_f1_score'].mean(), scores['test_f1_score'].std() * 2))
输出结果:
{'fit_time': array([0.00919461, 0.01352644, 0.01275229, 0.01283526, 0.00985909]), 'score_time': array([0.00189304, 0.00217152, 0.00196934, 0.00198627, 0.00182128]), 'test_f1_score': array([0.96491228, 0.95744681, 0.9486166 , 0.95022624, 0.93728223])}
F1 score: 0.95 (+/- 0.02)
本文介绍了 Python 中如何使用分类交叉验证来评估机器学习模型的性能。分类交叉验证是重要的机器学习技术之一,掌握它可以帮助我们更好地训练和评估模型。