ValueError: The number of class labels must be greater than one in Passive Aggressive Classifier
ValueError: The number of class labels must be greater than one in Passive Aggressive Classifier
我正在尝试使用 scikit 学习中的 'passive agressive classifer' 和 20 个新闻组数据集来实现在线 classifier。我对此很陌生,因此我不确定我是否已正确实施。话虽如此,我开发了一个小代码,但是当我执行它时,我不断收到错误消息:
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.
我检查了 Whosebug 中的大多数帖子,他们建议必须只有一个唯一 class。所以我做了 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 个......
仔细观察,您会发现这条线导致 X
和 y
每个 只有一个元素 (X_train[i]
和y_train[i]
,分别 - 事实上,由于错误可能发生在 i=0
的第一次迭代中,你最终只得到 X_train[0]
和 y_train[0]
),这当然应该拟合模型时并非如此;因此,错误消息正确地指出您的集合中只有一个标签(因为您只有一个样本,也就是说)...
要让自己确信确实如此,只需在 clf.fit()
前插入一个 print(np.unique(y))
- 它只会打印一个标签。
目前还不清楚您究竟想通过 for
循环实现什么;如果您尝试将分类器训练到数据集的连续部分,您可以尝试将 [i:i+1]
索引更改为 [i:i+k]
以获得足够大的 k
,但对于 20 标签数据集并不是那么简单,因为你必须确保每次调用 clf.fit()
时都会出现 all 20 个标签,否则你最终会比较苹果和橘子...
我强烈建议从简单的开始:删除 for
循环,使你的分类器适合你的整个训练集 (clf.fit(X_train, y_train)
),并检查 scikit-learn 的文档以获得可用的您可以使用的性能指标...
编辑 我刚注意到细节:
I am trying to implement an online classifier
好吧,你要做的肯定是 而不是 在线训练(这本身就是一个很大的话题),因为你的 for
循环只是重新训练(它尝试,至少)在每次迭代中从头开始一个新的分类器。
正如我已经说过的,从简单开始;尝试先牢牢掌握简单批量训练的原则,然后再转向更高级的在线训练主题,这绝对不是初学者...
我正在尝试使用 scikit 学习中的 'passive agressive classifer' 和 20 个新闻组数据集来实现在线 classifier。我对此很陌生,因此我不确定我是否已正确实施。话虽如此,我开发了一个小代码,但是当我执行它时,我不断收到错误消息:
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.
我检查了 Whosebug 中的大多数帖子,他们建议必须只有一个唯一 class。所以我做了 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 个......
仔细观察,您会发现这条线导致 X
和 y
每个 只有一个元素 (X_train[i]
和y_train[i]
,分别 - 事实上,由于错误可能发生在 i=0
的第一次迭代中,你最终只得到 X_train[0]
和 y_train[0]
),这当然应该拟合模型时并非如此;因此,错误消息正确地指出您的集合中只有一个标签(因为您只有一个样本,也就是说)...
要让自己确信确实如此,只需在 clf.fit()
前插入一个 print(np.unique(y))
- 它只会打印一个标签。
目前还不清楚您究竟想通过 for
循环实现什么;如果您尝试将分类器训练到数据集的连续部分,您可以尝试将 [i:i+1]
索引更改为 [i:i+k]
以获得足够大的 k
,但对于 20 标签数据集并不是那么简单,因为你必须确保每次调用 clf.fit()
时都会出现 all 20 个标签,否则你最终会比较苹果和橘子...
我强烈建议从简单的开始:删除 for
循环,使你的分类器适合你的整个训练集 (clf.fit(X_train, y_train)
),并检查 scikit-learn 的文档以获得可用的您可以使用的性能指标...
编辑 我刚注意到细节:
I am trying to implement an online classifier
好吧,你要做的肯定是 而不是 在线训练(这本身就是一个很大的话题),因为你的 for
循环只是重新训练(它尝试,至少)在每次迭代中从头开始一个新的分类器。
正如我已经说过的,从简单开始;尝试先牢牢掌握简单批量训练的原则,然后再转向更高级的在线训练主题,这绝对不是初学者...