杰瑞科技汇

python crossvalscore

(H1):Python cross_val_score终极指南:从入门到精通,模型评估不再迷路

Meta描述: 深入解析Python中的cross_val_score函数,手把手教你掌握交叉验证,本文详细解释参数、用法、实战案例及常见误区,助你提升模型评估能力,成为机器学习高手。

python crossvalscore-图1
(图片来源网络,侵删)

引言:为什么你的模型评估可能“骗”了你?

作为一名数据科学家或机器学习工程师,你一定经历过这样的场景:在训练集上,你的模型表现得近乎完美,准确率高达99%,当它被部署到真实世界的数据中时,表现却一塌糊涂,这究竟是为什么?

很多时候,问题出在了我们评估模型的方式上——简单的训练集/测试集划分具有偶然性,如果你的测试集恰好是一些“简单”的样本,模型评估结果自然会虚高,为了避免这种“过拟合幻觉”,我们需要一种更稳健、更可靠的评估方法。

这就是交叉验证 的用武之地,而Python中实现交叉验证最便捷、最强大的工具,就是来自scikit-learn库的cross_val_score函数。

本文将是你掌握cross_val_score的终极指南,我们将从零开始,逐步深入,确保你不仅能“会用”,更能“理解”并“精通”。

python crossvalscore-图2
(图片来源网络,侵删)

(H2)什么是交叉验证?它为什么如此重要?

在介绍cross_val_score之前,我们必须先理解它背后的核心思想——交叉验证。

交叉验证是一种将数据集划分为多个“子集”(folds),然后轮流将其中一部分作为验证集,其余部分作为训练集的模型评估方法。

最常见的交叉验证方法是 K折交叉验证 (K-Fold Cross-Validation)

  1. 数据拆分:将整个数据集随机、均匀地分成 K 个大小相近的“折”(folds)。
  2. 迭代训练:进行 K 次迭代,在第 i 次迭代中:
    • 验证集:将第 i 个折作为验证集。
    • 训练集:将剩下的 K-1 个折合并起来作为训练集。
    • 评估:在这个训练集上训练模型,并在第 i 个折(验证集)上进行评估,得到一个性能分数。
  3. 结果汇总:完成 K 次迭代后,你会得到 K 个性能分数,最终的模型性能评估结果通常是这 K 个分数的平均值标准差

为什么交叉验证更优?

python crossvalscore-图3
(图片来源网络,侵删)
  • 数据利用率高:每一份数据都既被用作过训练集,也被用作过验证集,充分利用了有限的样本。
  • 评估结果更稳健:通过多次取平均,可以有效减少因单次数据划分偶然性带来的评估偏差,得到一个更可靠的模型性能估计。
  • 有效防止过拟合:它能让模型在多个不同的数据子集上进行“考试”,从而更好地判断模型是否学到了普适的规律,而不是仅仅记住了训练数据的“答案”。

(H2)Python cross_val_score函数详解

scikit-learn库的model_selection模块提供了cross_val_score函数,它极大地简化了交叉验证的实现过程。

函数签名与核心参数

from sklearn.model_selection import cross_val_score
# 函数签名
cross_val_score(estimator, X, y=None, *, groups=None, scoring=None, cv=None, 
                 n_jobs=None, verbose=0, fit_params=None, pre_dispatch='2*n_jobs')

我们只关注最核心的几个参数:

  • estimator(必需) 你要评估的模型对象,这必须是一个实现了scikit-learn API的模型(如LogisticRegression(), SVC(), RandomForestClassifier()等)。
  • X(必需) 特征数据,通常是 NumPy 数组或 Pandas DataFrame。
  • y(必需) 目标变量(标签),通常是 NumPy 数组或 Pandas Series,对于无监督学习,可以为None
  • scoring(重要) 用于指定评估指标。
    • 可以是字符串,如'accuracy'(准确率)、'f1'(F1分数)、'roc_auc'(AUC值)、'neg_mean_squared_error'(负均方误差)等。
    • 也可以是sklearn.metrics中的评分函数对象,如make_scorer(f1_score)
    • 注意:对于某些指标(如均方误差),scikit-learn会返回其负值,因为在优化过程中,scikit-learn总是尝试最大化分数,而最小化误差等同于最大化其负值。
  • cv(重要) 交叉验证的折数或迭代器。
    • 如果是整数(如cv=5),表示使用 K-Fold 交叉验证,K 为该整数值。
    • 如果是其他对象(如StratifiedKFold),则使用指定的交叉验证策略。
    • 默认为None,对于有监督学习,默认使用 5 折交叉验证。

返回值

cross_val_score返回一个 NumPy 数组,数组中的每一个元素都是一次交叉验证迭代的评估分数。


(H2)实战演练:手把手教你使用cross_val_score

理论讲完了,让我们通过一个完整的代码示例来感受cross_val_score的强大。

场景:鸢尾花分类

我们将使用经典的鸢尾花数据集,目标是训练一个支持向量机分类器,并使用cross_val_score来评估其性能。

第1步:导入必要的库

import numpy as np
import pandas as pd
from sklearn import datasets
from sklearn.model_selection import cross_val_score
from sklearn.svm import SVC

第2步:加载和准备数据

# 加载鸢尾花数据集
iris = datasets.load_iris()
X = iris.data  # 特征
y = iris.target # 标签
print("特征数据形状:", X.shape)
print("标签数据形状:", y.shape)

第3步:创建模型

# 创建一个支持向量分类器模型
# 我们使用默认的径向基函数核
model = SVC(kernel='rbf', random_state=42)

第4步:执行交叉验证并评估

我们将使用5折交叉验证,并评估准确率

# 执行5折交叉验证
# scoring='accuracy' 表示使用准确率作为评估指标
# cv=5 表示使用5折交叉验证
scores = cross_val_score(model, X, y, scoring='accuracy', cv=5)
# 打印每次迭代的分数
print("每次迭代的准确率分数:", scores)
# 计算并打印平均分数和标准差
print("平均准确率: {:.2f}%".format(np.mean(scores) * 100))
print("标准差: +/- {:.2f}%".format(np.std(scores) * 100))

输出结果分析:

每次迭代的准确率分数: [0.96666667 1.         0.96666667 0.96666667 1.        ]
平均准确率: 98.00%
标准差: +/- 1.63%

从结果中我们可以看到:

  • 模型在5个不同的数据子集上,准确率都非常高(96.6%到100%)。
  • 平均准确率为98%,这比单次划分测试集得出的结果更具说服力。
  • 标准差仅为1.63%,说明模型性能非常稳定,没有因为数据子集的不同而产生巨大波动。

(H2)进阶技巧:使用不同的交叉验证策略

cross_val_scorecv参数非常灵活,可以传入不同的交叉验证策略对象,以适应更复杂的场景。

示例:分层K折交叉验证

对于类别不平衡的数据集,标准的K-Fold可能会导致某些折中缺少某些类别,这时,分层K折交叉验证会更有用,它能确保每个折的类别分布与原始数据集的类别分布保持一致。

from sklearn.model_selection import StratifiedKFold
# 创建一个分层5折交叉验证迭代器
stratified_kfold = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
# 使用这个迭代器进行交叉验证
scores_stratified = cross_val_score(model, X, y, cv=stratified_kfold)
print("分层K折交叉验证的准确率分数:", scores_stratified)
print("平均准确率: {:.2f}%".format(np.mean(scores_stratified
分享:
扫描分享到社交APP
上一篇
下一篇