摘要:交叉验证是机器学习中评估模型性能的重要技术,通过将数据划分为多个子集进行训练和测试,防止过拟合并优化超参数。本文以k折交叉验证为例,使用Python的Scikit-learn库演示了在鸢尾花数据集上的实现过程。通过创建决策树分类器,执行5折交叉验证并计算得分均值和标准差(0.95±0.03),展示了如何有效评估模型性能。该方法能确保模型在多样化数据上训练,提高泛化能力。

目录

机器学习 - 交叉验证

什么是交叉验证?

为什么交叉验证很重要?

在 Python 中实现交叉验证

步骤 1:加载数据并划分训练集与测试集

步骤 2:创建模型

步骤 3:执行 k 折交叉验证

步骤 4:计算得分的均值和标准差

完整示例代码

输出结果


机器学习 - 交叉验证

交叉验证是机器学习中一种强大的技术,用于评估模型在未见过的数据上的性能。它是构建稳健机器学习模型的关键步骤,有助于识别过拟合或欠拟合问题,并确定模型的最优超参数。

什么是交叉验证?

交叉验证是一种通过将数据集划分为多个子集来评估模型性能的技术:先在部分数据上训练模型,再在剩余数据上验证模型。其核心思想是利用部分数据训练模型,另一部分数据测试性能,使机器学习模型能够在多样化的数据上进行训练,从而更好地泛化到新数据。

交叉验证有多种类型,其中最常用的是 k 折交叉验证。在 k 折交叉验证中,数据被划分为 k 个大小相等的折。模型先在 k-1 个折上训练,然后在剩余 1 个折上测试。这一过程重复 k 次,每个折都作为验证数据使用一次。最终模型的性能通过 k 次迭代的结果取平均值来评估。

为什么交叉验证很重要?

交叉验证是机器学习中的关键技术,原因如下:

  1. 防止过拟合与欠拟合:过拟合是指模型过于复杂,过度贴合训练数据,导致在新数据上性能不佳;欠拟合则是模型过于简单,未能捕捉数据中的潜在模式,导致在训练数据和测试数据上均表现较差。交叉验证能有效识别这两种问题。
  2. 确定最优超参数:超参数是控制模型行为的设置。例如,在决策树算法中,树的最大深度是决定模型复杂程度的超参数。通过交叉验证评估不同超参数值下的模型性能,可筛选出使模型性能最大化的最优超参数。

在 Python 中实现交叉验证

本节将介绍如何使用 Scikit-learn 库在 Python 中实现 k 折交叉验证。Scikit-learn 是 Python 中流行的机器学习库,提供了数据预处理、模型选择和评估等一系列算法与工具。

我们将使用著名的鸢尾花(Iris)数据集进行演示。该数据集包含三种鸢尾花的萼片长度、萼片宽度、花瓣长度和花瓣宽度测量数据,目标是构建一个基于这些测量值预测鸢尾花品种的模型。

步骤 1:加载数据并划分训练集与测试集

首先,使用 Scikit-learn 的load_iris()函数加载数据集,并通过train_test_split()函数将数据划分为训练集和测试集。训练集用于训练模型,测试集用于评估模型性能。

from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split

# 加载鸢尾花数据集
iris = load_iris()

# 将数据划分为训练集和测试集
X_train, X_test, y_train, y_test = train_test_split(iris.data, iris.target, test_size=0.2, random_state=42)

步骤 2:创建模型

使用 Scikit-learn 的DecisionTreeClassifier()函数创建决策树分类器。

from sklearn.tree import DecisionTreeClassifier

# 创建决策树分类器
clf = DecisionTreeClassifier(random_state=42)

步骤 3:执行 k 折交叉验证

使用 Scikit-learn 的cross_val_score()函数执行 k 折交叉验证。该函数的输入包括模型、训练数据、目标变量和折数,输出为每个折的得分数组。

from sklearn.model_selection import cross_val_score

# 执行k折交叉验证(设置折数为5)
scores = cross_val_score(clf, X_train, y_train, cv=5)

此处设置折数为 5,即数据将被划分为 5 个大小相等的折。cross_val_score()函数会先在 4 个折上训练模型,在剩余 1 个折上测试,这一过程重复 5 次(每个折均作为验证数据一次),最终返回包含 5 个得分的数组。

步骤 4:计算得分的均值和标准差

最后,通过计算得分的均值和标准差来评估模型性能。均值代表模型在所有折上的平均性能,标准差代表得分的波动程度。

import numpy as np

# 计算得分的均值和标准差
mean_score = np.mean(scores)
std_score = np.std(scores)

print("交叉验证平均得分:{:.2f}".format(mean_score))
print("交叉验证得分标准差:{:.2f}".format(std_score))

完整示例代码

from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np

# 加载鸢尾花数据集
iris = load_iris()

# 定义特征变量和目标变量
X = iris.data
y = iris.target

# 创建决策树分类器
clf = DecisionTreeClassifier(random_state=42)

# 执行k折交叉验证
scores = cross_val_score(clf, X, y, cv=5)

# 计算得分的均值和标准差
mean_score = np.mean(scores)
std_score = np.std(scores)

print("交叉验证平均得分:{:.2f}".format(mean_score))
print("交叉验证得分标准差:{:.2f}".format(std_score))

输出结果

运行上述代码后,将得到以下输出:

plaintext

交叉验证平均得分:0.95
交叉验证得分标准差:0.03
Logo

脑启社区是一个专注类脑智能领域的开发者社区。欢迎加入社区,共建类脑智能生态。社区为开发者提供了丰富的开源类脑工具软件、类脑算法模型及数据集、类脑知识库、类脑技术培训课程以及类脑应用案例等资源。

更多推荐