python 由于ValueError,多项式朴素贝叶斯无法使用验证数据集,但可以使用sklearn train_test_split

pbpqsu0x  于 2022-12-21  发布在  Python
关注(0)|答案(1)|浏览(397)

我正在尝试做一个MNB分类器的情感分析。我有一个数据集,其中包括文本和标签在以下结构的标签是从1-5。使用huggingface情感数据集。

feature                                   label
"I feel good"                             1

我可以只使用我的train数据集和sklearn的train_test_split函数来完成它。但是当我尝试使用我的数据集来完成它时,出现了一个问题,即

ValueError: X has 3427 features, but MultinomialNB is expecting 10052 features as input.

在以下代码的最后一行(predict)

cv = CountVectorizer(stop_words='english')
val_ppd_df = cv.fit_transform(val_df["lemmatized"])
val_labels = np.array(val_df['label'])
train_labels = np.array(train_df['label'])
mnb = MultinomialNB()
mnb.fit(train_ppd_df,train_labels)
predictions_NB = mnb.predict(val_ppd_df)

我所做的是对我的验证数据集做每一个操作(标记化,词干化,词形化),但是我没有做test_train split,我只是拆分了train和validation数据集的标签。我检查了train_test_split和val_ppd_df的结果,我注意到它们是不同的。

<16000x10052 sparse matrix of type '<class 'numpy.int64'>'
    with 128627 stored elements in Compressed Sparse Row format>
<2000x3427 sparse matrix of type '<class 'numpy.int64'>'
    with 15853 stored elements in Compressed Sparse Row format>

我该如何处理这种差异呢?互联网上的每个示例都使用train_test_split,我的示例也可以,但我想先在验证上做这个,然后在不同的测试数据集上做,而不仅仅是在train数据集上。

tkqqtvp1

tkqqtvp11#

fit_transform应仅应用于训练数据。对于验证和测试:应用transform方法。

MRE,带有Hugging Face - SetFit/emotion

from datasets import load_dataset
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.naive_bayes import MultinomialNB

# Load emotions dataset
emotions = load_dataset("SetFit/emotion")
train = emotions['train']
validation = emotions['validation']

# Create X_train using `cv.fit_transform`
cv = CountVectorizer(stop_words="english")
X_train = cv.fit_transform(train["text"])

# Fit Multinomial Naive Bayes
nb = MultinomialNB().fit(X_train, train["label"])

# Estimate performance on the validation set
X_valid = cv.transform(validation["text"])
print(nb.score(X_valid, validation["label"]))
# 0.797

相关问题