You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何在quanteda的SML工作流中实现k-fold交叉验证并解决报错?

Quanteda中集成k-fold交叉验证的正确方法及报错解决

问题背景

你正在使用quanteda的文本分类工作流,希望用k-fold交叉验证替代固定的训练/测试集拆分,但尝试实现时遇到错误:Error in group.samples(Y) : argument "Y" is missing, with no default。

报错原因

你错误加载了第三方crossval包,该包的crossval()函数与quanteda.classifiers中内置的crossval()方法冲突。此外,你直接传入了训练好的textmodel_nb模型,而quanteda的交叉验证需要指定模型函数、特征矩阵和响应变量,而非预训练模型。

正确实现步骤

  1. 移除冲突包:不要加载crossval包,使用quanteda.classifiers自带的交叉验证方法。
  2. 准备输入数据:确保你有标准化的dfm特征矩阵和对应的分类标签(如sentiment)。
  3. 调用quanteda的crossval:直接传入模型函数(textmodel_nb)、特征矩阵、响应变量,以及交叉验证的k值等参数。

完整修正代码

require(quanteda)
require(quanteda.textmodels)
require(caret)

# 加载数据
corp_movies <- data_corpus_moviereviews

# 文本预处理
toks_movies <- tokens(corp_movies, remove_punct = TRUE, remove_number = TRUE) %>% 
  tokens_remove(pattern = stopwords("en")) %>% 
  tokens_wordstem()
dfmt_movie <- dfm(toks_movies)

# 提取分类标签
y <- docvars(dfmt_movie, "sentiment")

# 执行5-fold交叉验证(朴素贝叶斯模型)
# 按类别返回评估指标
cv_results_class <- crossval(textmodel_nb, x = dfmt_movie, y = y, k = 5, by_class = TRUE)
print(cv_results_class)

# 返回整体评估指标
cv_results_overall <- crossval(textmodel_nb, x = dfmt_movie, y = y, k = 5, by_class = FALSE)
print(cv_results_overall)

# 显示详细过程
cv_results_verbose <- crossval(textmodel_nb, x = dfmt_movie, y = y, k = 5, by_class = FALSE, verbose = TRUE)

关键说明

  • crossval()函数接受模型函数(如textmodel_nb)作为第一个参数,而非训练好的模型对象。
  • x传入你的dfm特征矩阵,y传入对应的分类变量。
  • by_class = TRUE会返回每个类别的精确率、召回率等指标,FALSE返回整体的混淆矩阵和宏平均指标。
  • 确保你的quanteda和quanteda.textmodels包是最新版本,避免因版本兼容导致的问题。

内容的提问来源于stack exchange,提问作者Max Overbeck

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 05:25:16