- c - 在位数组中找到第一个零
- linux - Unix 显示有关匹配两种模式之一的文件的信息
- 正则表达式替换多个文件
- linux - 隐藏来自 xtrace 的命令
我正在基于 TF-IDF
向量空间模型进行文本分类。我只有不超过 3000 个样本。为了公平评估,我正在使用 5 折交叉评估分类器validation.但让我困惑的是,是否需要在每次fold cross-validation中重建TF-IDF
Vector Space Model。也就是说,我是否需要在每次折叠交叉验证中重建词汇表并重新计算词汇表中的 IDF
值?
目前我正在基于 scikit-learn 工具包进行 TF-IDF 转换,并使用 SVM 训练我的分类器。我的方法是:首先,我将手上的样本按照3:1的比例进行划分,其中的75%用于拟合TF-IDF向量空间模型的参数。这里的参数就是尺寸词汇表和其中包含的术语,还有词汇表中每个术语的 IDF
值。然后我正在转换这个 TF-IDF
SVM 中的余数
并使用这些向量进行 5 折交叉验证(值得注意的是,我不使用之前的 75% 样本进行转换)。
我的代码如下:
# train, test split, the train data is just for TfidfVectorizer() fit
x_train, x_test, y_train, y_test = train_test_split(data_x, data_y, train_size=0.75, random_state=0)
tfidf = TfidfVectorizer()
tfidf.fit(x_train)
# vectorizer test data for 5-fold cross-validation
x_test = tfidf.transform(x_test)
scoring = ['accuracy']
clf = SVC(kernel='linear')
scores = cross_validate(clf, x_test, y_test, scoring=scoring, cv=5, return_train_score=False)
print(scores)
我的困惑是,我的TF-IDF
转换和5折交叉验证的方法是否正确,或者是否有必要重建TF-IDF
使用训练数据的向量模型空间,然后将训练数据和测试数据转换为 TF-IDF
向量?如下:
skf = StratifiedKFold(n_splits=5, shuffle=True, random_state=0)
for train_index, test_index in skf.split(data_x, data_y):
x_train, x_test = data_x[train_index], data_x[test_index]
y_train, y_test = data_y[train_index], data_y[test_index]
tfidf = TfidfVectorizer()
x_train = tfidf.fit_transform(x_train)
x_test = tfidf.transform(x_test)
clf = SVC(kernel='linear')
clf.fit(x_train, y_train)
y_pred = clf.predict(x_test)
score = accuracy_score(y_test, y_pred)
print(score)
最佳答案
您在构建 TfidfVectorizer()
时采用的 StratifiedKFold
方法是正确的方法,这样做可以确保仅基于的训练数据集。
如果您考虑在整个数据集上构建 TfidfVectorizer()
,那么即使我们没有明确提供测试数据集,也会将测试数据集泄露给模型。当包含测试文档时,词汇表的大小、词汇表中每个术语的 IDF 值等参数将有很大差异。
更简单的方法可能是使用管道和 cross_validate。
用这个!
from sklearn.pipeline import make_pipeline
clf = make_pipeline(TfidfVectorizer(), svm.SVC(kernel='linear'))
scores = cross_validate(clf, data_x, data_y, scoring=['accuracy'], cv=5, return_train_score=False)
print(scores)
注意:单独对测试数据做cross_validate
是没有用的。我们必须对 [train + validation]
数据集进行操作。
关于python - 我是否在 k-fold cross_validation 中使用相同的 Tfidf 词汇表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46010617/
我有一个简单的问题。我如何使用 Rmarkdown/knitr 创建词汇表。我与 RStudio 合作。 我尝试这个但没有成功 \usepackage{glossaries} 在 header.tex
我正在尝试使用 Pandoc 和 Markdown 来创建词汇表,PDF (/LaTeX) 输出。我遵循了文档 here它使用 glossaries图书馆。一切似乎都在工作,除了 实际上打印出词汇表!
实际上我在Wordlist中使用了一些CITY名称和PUBLISHERS名称。在我的理解中,Wordlist会注释文档中任何列表项的所有出现。但是我发现一个问题,当我改变列表中文本的顺序。 例如: 脚
我目前正在开发一个具有多种自定义内容类型的 Plone 项目。这些内容类型有几个字段,这些字段依次从词汇表中获取它们的值。目前,我只是将我的值硬编码在 vocabularies.py 文件中,如下所示
我想知道是否可以更新 spacys 的默认词汇表。我正在尝试做的是: 使用 gensim 在我自己的语料库上运行 word2vec 使用 nlp.vocab.load_vectors_from_bin
问题 [下面是应用程序在受限条件下的操作说明] 我想要一个数据结构来搜索25万个单词列表中是否存在string,同时仅使用相当数量的ram并保持将数据结构加载到ram中所需的时间很小(比如说0到8秒)
这两个术语有什么区别。到目前为止,我所理解的是,表达式是产生值的任何一段代码。但是在程序中,我应该怎么称呼这个: 5; 值还是表达式?或者我可以互换使用这两个术语吗? 最佳答案 值本质上是分配给变量的
与 INSearchForMessagesIntent在 SiriKit 中,我可以问: list messages in the inbox ,由 INSearchForMessagesIntent
是否有已知的 RDF 词汇表来描述 Uri 组件的元数据? (例如方案、权限、查询字符串等) 更新 我已经找到了 DublinCore term resource for URI ,但在相应的 RDF
如果你创建一个单词表,我正在编写代码。它包含一个“单词”和一个“描述”。单词和描述有自己的 vector 。我也在尝试使用 map 进行同样的尝试。 在我尝试查找单词之前,该程序运行良好。该程序只会从
我正在基于 TF-IDF 向量空间模型进行文本分类。我只有不超过 3000 个样本。为了公平评估,我正在使用 5 折交叉评估分类器validation.但让我困惑的是,是否需要在每次fold cros
我是一名优秀的程序员,十分优秀!