终于把机器学习中的交叉验证搞懂了!!

交叉验证是一种评估机器学习模型性能的方法,用于衡量机器学习模型的泛化能力(即在未见数据上的表现)。 它通过将数据集分成多个部分,交替使用不同的部分作为训练集和测试集,从而充分利用数据、避免过拟合或欠拟合,并更准确地评估模型的泛化能力。 核心思想数据划分:将数据集划分为训练集和测试集。

交叉验证是一种评估机器学习模型性能的方法,用于衡量机器学习模型的泛化能力(即在未见数据上的表现)。

终于把机器学习中的交叉验证搞懂了!!

它通过将数据集分成多个部分,交替使用不同的部分作为训练集和测试集,从而充分利用数据、避免过拟合或欠拟合,并更准确地评估模型的泛化能力。

终于把机器学习中的交叉验证搞懂了!!

核心思想

  1. 数据划分:将数据集划分为训练集和测试集。
  2. 多次训练与验证:模型在不同的划分上进行训练和测试,以尽可能全面地利用数据。
  3. 综合评估:取所有测试结果的平均值,作为模型性能的评估指标。

交叉验证解决了因单次划分数据集可能导致模型评估结果不稳定的问题,使得模型评估更加稳健和准确。

常见的交叉验证方法

1.K折交叉验证

将数据集分为 k 个相等大小的子集。每次用其中 k-1 个子集作为训练集,剩下的一个子集作为测试集,重复 k 次,每次选择不同的子集作为测试集。

最终的评估指标为 k 次实验结果的平均值。

终于把机器学习中的交叉验证搞懂了!!

优点

  • 能够有效利用数据集,每个样本都有机会作为训练集和测试集。
  • 评估结果稳定且可靠。

缺点

  • 计算开销较大,因为需要进行 K 次训练,时间复杂度较高。
复制
from sklearn.model_selection import KFold
from sklearn.metrics import accuracy_score
from sklearn.datasets import load_iris
from sklearn.ensemble import RandomForestClassifier
import numpy as np

data = load_iris()
X, y = data.data, data.target

kf = KFold(n_splits=5, shuffle=True, random_state=42)
model = RandomForestClassifier(random_state=42)

scores = []
for train_index, test_index in kf.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    scores.append(accuracy_score(y_test, y_pred))

print(f"K-Fold Cross-Validation Scores: {scores}")
print(f"Mean Accuracy: {np.mean(scores)}")

2.留一交叉验证

留一交叉验证是一种特殊的 K折交叉验证方法,其中 K等于数据集的样本数(即每个子集只包含一个数据点)。

这种方法每次选择一个样本作为测试集,其余所有样本作为训练集。

终于把机器学习中的交叉验证搞懂了!!

优点

  • 每个样本都会参与训练和测试,因此可以最大限度地利用数据。
  • 在小数据集上特别有用,能够提供更精确的性能评估。

缺点

  • 计算成本非常高,尤其是当数据集规模较大时,因为需要进行多次训练和测试。
  • 高方差:对单个数据点的敏感度较高,可能导致不稳定的评估结果。
复制
from sklearn.model_selection import LeaveOneOut

loo = LeaveOneOut()
scores = []

for train_index, test_index in loo.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    scores.append(accuracy_score(y_test, y_pred))

print(f"LOOCV Mean Accuracy: {np.mean(scores)}")

3.分层K折交叉验证

与普通的 K 折交叉验证不同,分层 K 折交叉验证会确保每个折叠中的类别比例与整体数据集中的类别比例相似。这对于类别不平衡的数据集尤其重要。

终于把机器学习中的交叉验证搞懂了!!

优点

  • 保证每个折叠中的类别分布和整体数据集相似,从而使得评估结果更加稳定和可靠。
  • 特别适用于类别不平衡的问题。

缺点

  • 和普通的K折交叉验证一样,仍然需要K次训练和测试,因此计算开销较大。
复制
from sklearn.model_selection import StratifiedKFold

skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=42)
scores = []

for train_index, test_index in skf.split(X, y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    scores.append(accuracy_score(y_test, y_pred))

print(f"Stratified K-Fold Scores: {scores}")
print(f"Mean Accuracy: {np.mean(scores)}")

4.重复 K 折交叉验证

重复 K 折交叉验证是一种通过多次执行 K 折交叉验证来进一步提高模型评估稳定性的方法。

例如,重复 3 次的 5 折交叉验证意味着将数据集随机划分 5 次,进行 3 轮交叉验证,总共进行 15 次训练和测试。

优点:

  • 提供了更稳定的评估结果,减少了由于单次 K 折交叉验证的随机性带来的结果波动。

缺点:

  • 计算开销较大,因为需要进行多次 K 折交叉验证。
  • 适用于需要非常稳定评估结果的情况。

终于把机器学习中的交叉验证搞懂了!!

复制
from sklearn.model_selection import RepeatedKFold
from sklearn.ensemble import RandomForestClassifier
from sklearn.datasets import load_iris
import numpy as np

# 加载数据
data = load_iris()
X, y = data.data, data.target
model = RandomForestClassifier(n_estimators=100)

rkf = RepeatedKFold(n_splits=5, n_repeats=3, random_state=42)

scores = []

for train_index, test_index in rkf.split(X, y):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    model.fit(X_train, y_train)
    score = model.score(X_test, y_test)
    scores.append(score)

print(f"每次折叠的得分: {scores}")
print(f"平均得分: {np.mean(scores)}")

5.时间序列交叉验证

时间序列数据的特点是数据点之间有序,且过去的数据对未来的预测有重要意义。

因此,普通的K折交叉验证可能不适用于时间序列问题。

时间序列交叉验证在划分训练集和测试集时考虑了时间顺序,即每次选择一个时间段作为测试集,前面的数据作为训练集。

终于把机器学习中的交叉验证搞懂了!!

优点:

  • 保持时间序列的因果关系。
  • 避免数据泄漏。

缺点:

  • 训练集大小逐渐增大,计算成本可能较高。
复制
from sklearn.model_selection import TimeSeriesSplit

tscv = TimeSeriesSplit(n_splits=5)
scores = []

for train_index, test_index in tscv.split(X):
    X_train, X_test = X[train_index], X[test_index]
    y_train, y_test = y[train_index], y[test_index]
    
    model.fit(X_train, y_train)
    y_pred = model.predict(X_test)
    scores.append(accuracy_score(y_test, y_pred))

print(f"Time Series Cross-Validation Scores: {scores}")
print(f"Mean Accuracy: {np.mean(scores)}")

6.嵌套交叉验证

嵌套交叉验证主要用于模型选择和性能评估。外层交叉验证用于评估模型性能,内层交叉验证用于选择最佳的超参数。

优点:

  • 避免数据泄漏问题。
  • 提供更可靠的模型性能评估。

缺点:

  • 计算成本非常高。
复制
from sklearn.model_selection import cross_val_score, GridSearchCV, StratifiedKFold
from sklearn.svm import SVC
from sklearn.datasets import load_iris
import numpy as np

# 加载数据
data = load_iris()
X, y = data.data, data.target

# 设置外层交叉验证
outer_cv = StratifiedKFold(n_splits=5)

# 设置内层交叉验证和超参数搜索
param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}
inner_cv = StratifiedKFold(n_splits=3)
grid_search = GridSearchCV(SVC(), param_grid, cv=inner_cv)

# 使用外层交叉验证进行评估,内层交叉验证用于超参数调优
nested_score = cross_val_score(grid_search, X, y, cv=outer_cv)

# 输出结果
print(f"每次折叠的得分: {nested_score}")
print(f"平均得分: {nested_score.mean()}")

相关资讯

麻省理工研究人员提高机器学习模型准确性

机器学习(ML)有可能通过利用大量数据进行预测洞察来改变医疗决策。 然而,当这些模型在不能充分代表所有人口群体的数据集上进行训练时,就会出现一个严重挑战。 预测疾病患者治疗计划的模型可以在主要包含男性患者的数据集上进行训练。

豆包大模型团队发布全新Detail Image Caption评估基准,提升VLM Caption评测可靠性

AIxiv专栏是AI在线发布学术、技术内容的栏目。过去数年,AI在线AIxiv专栏接收报道了2000多篇内容,覆盖全球各大高校与企业的顶级实验室,有效促进了学术交流与传播。如果您有优秀的工作想要分享,欢迎投稿或者联系报道。投稿邮箱:[email protected][email protected]当前的视觉语言模型(VLM)主要通过 QA 问答形式进行性能评测,而缺乏对模型基础理解能力的评测,例如 detail image caption 性能的可靠评测手段。针对这一问题,中科院、

为大模型提供全新科学复杂问答基准与测评体系,UNSW、阿贡、芝加哥大学等多家机构联合推出SciQAG框架

编辑 | ScienceAI问答(QA)数据集在推动自然语言处理(NLP)研究发挥着至关重要的作用。高质量QA数据集不仅可以用于微调模型,也可以有效评估大语言模型(LLM)的能力,尤其是针对科学知识的理解和推理能力。尽管当前已有许多科学QA数据集,涵盖了医学、化学、生物等领域,但这些数据集仍存在一些不足。其一,数据形式较为单一,大多数为多项选择题(multiple-choice questions),它们易于进行评估,但限制了模型的答案选择范围,无法充分测试模型的科学问题解答能力。相比之下,开放式问答(openQA