gpt4 book ai didi

python-3.x - 未安装错误: TfidfVectorizer - Vocabulary wasn't fitted python

转载 作者:行者123 更新时间:2023-11-30 09:18:33 26 4
gpt4 key购买 nike

目标:预测原始数据的标签

背景:我构建了一个 SVM 分类器

我正在使用以下代码:

0) 导入模块

    import numpy as np
from sklearn import cross_validation
from sklearn import datasets
from sklearn import svm
from sklearn.model_selection import StratifiedKFold
from sklearn.metrics import precision_score, recall_score,accuracy_score
from sklearn.feature_extraction.text import TfidfVectorizer
from sklearn.metrics import precision_recall_fscore_support

1) X_listy

type(X_list) #list, strings
len(X_list) #2163
type(y) #numpy.ndarray
len(y) #2163

2) 将X_list从字符串转换为 float ,使用tfidf

tfidf = TfidfVectorizer()
X_vec = tfidf.fit_transform(X_list)
X = X_vec.toarray()

3) X 形状

X.shape  (2163, 8753)

4) 10折验证和SVM

skf = StratifiedKFold(n_splits=10) 
clf = svm.SVC(kernel='linear', C=1)

5) 循环10次

precision_scores = []
recall_scores = []
f_scores = []

for train_index, test_index in skf.split(X, y):
X_train = X[train_index]
X_test = X[test_index]
y_train = y[train_index]
y_test = y[test_index]

clf.fit(X_train, y_train)
y_pred = clf.predict(X_test)

precision_scores.append(scores[0])
recall_scores.append(scores[1])
f_scores.append(scores[2])

6) 根据原始数据集X_original

进行预测
type(X_original) #list, strings
len(X_original) #2163

7) 将X_original从字符串转换为 float

tfidf = TfidfVectorizer()
X_original_transform = tfidf.transform(X_original)

但是当我这样做时,我收到以下错误

`NotFittedError: TfidfVectorizer - Vocabulary wasn't fitted.`

SO有一个类似的问题,但它似乎与我的问题不同NotFittedError: TfidfVectorizer - Vocabulary wasn't fitted

8) 如何修复此错误?

最佳答案

在上面的第(7)点中,您可以看到您正在再次初始化tfidf,这会生成一个没有任何数据或信息的新TfidfVectorizer实例。那你就不适合了。因此出现了错误。您需要以与第 (2) 点相同的方式调用 fit()。

将第 (7) 点更改为:

tfidf = TfidfVectorizer()
# fit_transform should be used here.
X_original_transform = tfidf.fit_transform(X_original)

同样在第 (2) 点中,您首先在整个数据集上拟合 TfidfVectorizer,然后将其拆分为训练和测试。不建议这样做,因为它会在训练时将有关数据的信息泄露给模型。考虑一下这在现实世界中是如何运作的。您是否掌握了要提前预测的数据的所有信息?不会。您可以根据可用数据训练模型,并将其用于未见过的数据。您当前在第 (2) 点中的代码打破了这一点。

始终首先分为训练和测试,然后仅对训练数据进行训练 (fit()),并使用该信息对测试数据应用 (transform()) .

像这样改变它:

1) 首先删除第(2)点中的代码。我们将在折叠迭代中执行此操作。

2)更改点(5),例如:

for train_index, test_index in skf.split(X_list, y): 
X_train = X_list[train_index]
X_test = X_list[test_index]
y_train = y[train_index]
y_test = y[test_index]

tfidf = TfidfVectorizer()

# This is what I'm talking about
X_train = tfidf.fit_transform(X_train)
clf.fit(X_train, y_train)

# Only call transform() here
X_test = tfidf.transform(X_test)
y_pred = clf.predict(X_test)

precision_scores.append(scores[0])
recall_scores.append(scores[1])
f_scores.append(scores[2])

关于python-3.x - 未安装错误: TfidfVectorizer - Vocabulary wasn't fitted python,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49034284/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com