机器学习 - 交叉验证
交叉验证是一种强大的技术,用于在机器学习中估计模型在未见过数据上的性能。它是构建稳健机器学习模型的重要步骤,因为它有助于识别过拟合或欠拟合,并帮助确定最优的模型超参数。
什么是交叉验证?
交叉验证是一种通过将数据集分区为子集、在部分数据上训练模型,然后在剩余数据上验证模型来评估模型性能的技术。交叉验证背后的基本思想是使用数据的一个子集来训练模型,并使用另一个子集来测试其性能。这使得机器学习模型能够在各种数据上进行训练,并更好地泛化到新数据。
有多种类型的交叉验证技术可用,但最常用的技术是 k-fold cross-validation。在 k-fold cross-validation 中,数据被分区为 k 个大小相等的 fold。然后,模型在 k-1 个 fold 上训练,并在剩余的一个 fold 上测试。这个过程重复 k 次,每个 k 个 fold 中的一个 fold 依次用作验证数据。然后,模型的最终性能在 k 次迭代上取平均值,以获得模型性能的估计。
为什么交叉验证很重要?
交叉验证是机器学习中的一种基本技术,因为它有助于防止模型过拟合或欠拟合。过拟合发生在模型过于复杂并过于贴合训练数据时,导致在新数据上的性能差。另一方面,欠拟合发生在模型过于简单而无法捕捉数据中的潜在模式时,导致在训练数据和测试数据上的性能均差。
交叉验证还有助于确定最优的模型超参数。超参数是控制模型行为的设置。例如,在决策树算法中,树的 maximum depth 是一个超参数,它决定了模型的复杂程度。通过使用交叉验证在不同超参数值下评估模型性能,我们可以选择最大化模型性能的最优超参数。
在 Python 中实现交叉验证
在本节中,我们将讨论如何使用 Scikit-learn 库在 Python 中实现 k-fold 交叉验证。Scikit-learn 是一个流行的 Python 机器学习库,它提供了数据预处理、模型选择和评估的一系列算法和工具。
为了演示如何在 Python 中实现交叉验证,我们将使用著名的 Iris 数据集。Iris 数据集包含三种不同鸢尾花种的花萼长度、花萼宽度、花瓣长度和花瓣宽度的测量数据。目标是构建一个模型,根据这些测量数据预测鸢尾花的种类。
首先,我们需要使用 Scikit-learn 的 load_iris() 函数加载数据集,并使用 train_test_split() 函数将其分割成训练集和测试集。训练集将用于训练模型,测试集将用于评估模型的性能。
from sklearn.datasets import load_iris from sklearn.model_selection import train_test_split # 加载 Iris 数据集 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)
接下来,我们将使用 Scikit-learn 的 DecisionTreeClassifier() 函数创建一个决策树分类器。
from sklearn.tree import DecisionTree
创建一个决策树分类器。
clf = DecisionTreeClassifier(random_state=42)
现在,我们可以使用 k-fold 交叉验证来评估模型的性能。我们将使用 Scikit-learn 中的 cross_val_score() 函数来执行 k-fold 交叉验证。该函数接受模型、训练数据、目标变量和折数作为输入。它返回一个分数数组,每个折对应一个分数。
from sklearn.model_selection import cross_val_score # 执行 k-fold 交叉验证 scores = cross_val_score(clf, X_train, y_train, cv=5)
在这里,我们指定了折数为 5,这意味着数据将被分割成 5 个大小相等的折。cross_val_score() 函数将在 4 个折上训练模型,并在剩余的一个折上测试它。这个过程将重复 5 次,每个折将被用作验证数据一次。该函数返回一个分数数组,每个折对应一个分数。
最后,我们可以计算分数的均值和标准差,以获得模型性能的估计。
import numpy as np
# 计算分数的均值和标准差
mean_score = np.mean(scores)
std_score = np.std(scores)
print("Mean cross-validation score: {:.2f}".format(mean_score))
print("Standard deviation of cross-validation score: {:.2f}".format(std_score))
这段代码的输出将是分数的均值和标准差。均值分数表示模型在所有折上的平均性能,而标准差表示分数的变异性。
示例 - 交叉验证
以下是在 Python 中交叉验证的完整实现 −
from sklearn.datasets import load_iris
from sklearn.tree import DecisionTreeClassifier
from sklearn.model_selection import cross_val_score
import numpy as np
# 加载 iris 数据集
iris = load_iris()
# 定义特征和目标变量
X = iris.data
y = iris.target
# 创建决策树分类器
clf = DecisionTreeClassifier(random_state=42)
# 执行 k-fold 交叉验证
scores = cross_val_score(clf, X, y, cv=5)
# 计算分数的均值和标准差
mean_score = np.mean(scores)
std_score = np.std(scores)
print("Mean cross-validation score: {:.2f}".format(mean_score))
print("Standard deviation of cross-validation score: {:.2f}".format(std_score))
输出
执行这段代码时,将产生以下输出 −
Mean cross-validation score: 0.95 Standard deviation of cross-validation score: 0.03