📜  分类交叉验证 - Python (1)

📅  最后修改于: 2023-12-03 15:07:09.661000             🧑  作者: Mango

分类交叉验证 - Python

分类交叉验证是机器学习中常用的评估模型性能的方法。它将数据集划分为若干个互不相交的子集,每个子集轮流作为测试集,其余子集作为训练集进行模型训练和评估。本文将详细介绍 Python 中如何使用分类交叉验证。

1. 准备数据

先准备一个示例数据集,由两个类别的数据组成,每个类别包含 1000 个样本,每个样本含有两个特征:

import numpy as np

np.random.seed(123)
X = np.random.randn(2000, 2)
y = np.concatenate((np.zeros(1000), np.ones(1000)))
2. 使用 sklearn 进行分类交叉验证

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)
3. 使用自定义的交叉验证函数

如果需要更灵活的交叉验证方法,可以使用 KFoldStratifiedKFold 类来实现自定义的交叉验证函数。以下代码将数据集分为 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))

输出结果同上。

4. 使用自定义评估指标

默认情况下,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)
5. 总结

本文介绍了 Python 中如何使用分类交叉验证来评估机器学习模型的性能。分类交叉验证是重要的机器学习技术之一,掌握它可以帮助我们更好地训练和评估模型。