gpt4 book ai didi

python-3.x - 值错误: The number of class labels must be greater than one in Passive Aggressive Classifier

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

我正在尝试使用 scikit learn 中的“被动攻击分类器”和 20 个新闻组数据集来实现在线分类器。我对此很陌生,因此我不确定我是否正确实现了这一点。话虽这么说,我开发了一个小代码,但当我执行它时,我不断收到错误:

Traceback (most recent call last): File "/home/suleka/Documents/RNN models/passiveagressive.py", line 100, in clf.fit(X, y) File "/home/suleka/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/passive_aggressive.py", line 225, in fit coef_init=coef_init, intercept_init=intercept_init) File "/home/suleka/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py", line 444, in _fit classes, sample_weight, coef_init, intercept_init) File "/home/suleka/anaconda3/lib/python3.6/site-packages/sklearn/linear_model/stochastic_gradient.py", line 407, in _partial_fit raise ValueError("The number of class labels must be " ValueError: The number of class labels must be greater than one.

我检查了 stackoverflow 中的大多数帖子,他们建议必须只有一个唯一的类。所以我做了np.unique(labels),它显示了 20(20 个新闻组):

[ 0  1  2  3  4  5  6  7  8  9 10 11 12 13 14 15 16 17 18 19]

任何人都可以帮我解决这个错误,如果我实现错误,请告诉我。

我的代码如下所示:

from sklearn.linear_model import PassiveAggressiveClassifier
from sklearn.datasets import make_classification
from string import punctuation
import numpy as np
from sklearn.datasets import fetch_20newsgroups
from collections import Counter
from sklearn.preprocessing import MinMaxScaler, LabelBinarizer
from sklearn.utils import shuffle
from nltk.corpus import stopwords
from sklearn.feature_extraction.text import TfidfVectorizer
import nltk
nltk.download('stopwords')



seed = 42
np.random.seed(seed)

def preProcess():

newsgroups_data = fetch_20newsgroups(subset='all', remove=('headers', 'footers', 'quotes'))

vectorizer = TfidfVectorizer(sublinear_tf=True, max_df=0.5,
stop_words='english')

features = vectorizer.fit_transform(newsgroups_data.data)
labels= newsgroups_data.target

return features, labels


if __name__ == '__main__':

features, labels = preProcess()

X_train, y_train = shuffle(features, labels, random_state=seed)

clf = PassiveAggressiveClassifier(random_state=seed)

n, d =X_train.shape

print(np.unique(labels))

error = 0
iteration = 0
for i in range(n):
print(iteration)
X, y = X_train[i:i + 1], y_train[i:i + 1]

clf.fit(X, y)
pred = clf.predict(X)

print(pred)
print(y)

if y - pred != 0:
error += 1
iteration += iteration


print(error)
print(np.divide(error, n, dtype=np.float))

提前谢谢您!

最佳答案

问题出在这一行:

X, y = X_train[i:i + 1], y_train[i:i + 1]

在你的 for 里面循环,即之后您要求 np.unique(labels)并轻松地发现您确实拥有全部 20 个...

仔细观察,您会发现这一行的结果是 Xy每个只有一个元素(分别为 X_train[i]y_train[i] - 事实上,由于错误可能发生在 i=0 的第一次迭代中,所以最终只有 X_train[0]y_train[0] ),拟合模型时当然不应该出现这种情况;因此,错误消息正确地指出您的集合中只有一个标签(因为您只有一个样本)...

要让自己确信情况确实如此,只需插入 print(np.unique(y))在您的clf.fit()之前- 它只会打印一个标签。

目前还不清楚您到底想通过 for 实现什么目标环形;如果您尝试将分类器训练为数据集的连续部分,您可以尝试更改 [i:i+1]索引为[i:i+k]对于一些足够大的k ,但对于 20 个标签的数据集,这并不那么简单,因为您必须确保每次调用 clf.fit() 时都会出现所有 20 个标签,否则你最终会比较苹果和橘子......

我强烈建议从简单开始:删除 for循环,将分类器适合整个训练集 ( clf.fit(X_train, y_train) ),并检查 scikit-learn 的文档以获取可以使用的可用性能指标...

编辑我刚刚注意到细节:

I am trying to implement an online classifier

嗯,您想要做的当然不是在线培训(这本身就是一个很大的话题),就像您的 for 一样。循环只是在每次迭代期间从头开始重新训练(至少尝试)一个新的分类器。

正如我已经说过的,从简单开始;首先尝试牢牢掌握简单批量训练的原则,然后再转向更高级的在线训练主题,这绝对不是初学者的......

关于python-3.x - 值错误: The number of class labels must be greater than one in Passive Aggressive Classifier,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52321534/

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