Numpy y_检验上的不一致形状错误多标签二值化器,sklearn多标签分类

Numpy y_检验上的不一致形状错误多标签二值化器,sklearn多标签分类,numpy,scikit-learn,text-classification,multilabel-classification,Numpy,Scikit Learn,Text Classification,Multilabel Classification,我似乎无法进行任何测量,因为Y_测试在使用多LabelBinarizer进行fit_变换后给出了不同的矩阵维数 结果和错误: import numpy as np import pandas as pd from sklearn.pipeline import Pipeline from sklearn.feature_extraction.text import CountVectorizer from sklearn.svm import LinearSVC from sklearn.lin

我似乎无法进行任何测量,因为Y_测试在使用多LabelBinarizer进行fit_变换后给出了不同的矩阵维数

结果和错误:

import numpy as np
import pandas as pd
from sklearn.pipeline import Pipeline
from sklearn.feature_extraction.text import CountVectorizer
from sklearn.svm import LinearSVC
from sklearn.linear_model import SGDClassifier
from sklearn.feature_extraction.text import TfidfTransformer
from sklearn.multiclass import OneVsRestClassifier
from sklearn.metrics import accuracy_score, classification_report, confusion_matrix
from sklearn.model_selection import train_test_split
from sklearn import preprocessing
from sklearn.svm import SVC

data = r'C:\Users\...\Downloads\news_v1.xlsx'

df = pd.read_excel(data)
df = pd.DataFrame(df.groupby(["id", "doc"]).label.apply(list)).reset_index()

X = np.array(df.doc)
y = np.array(df.label)

X_train, X_test, y_train, y_test = train_test_split(X, y, test_size=0.33, random_state=42)

mlb = preprocessing.MultiLabelBinarizer()
Y_train = mlb.fit_transform(y_train)

classifier = Pipeline([
('vectorizer', CountVectorizer()),
('tfidf', TfidfTransformer()),
('clf', OneVsRestClassifier(LinearSVC()))])

classifier.fit(X_train, Y_train)
predicted = classifier.predict(X_test)

Y_test = mlb.fit_transform(y_test)

print("Y_train: ", Y_train.shape)
print("Y_test: ", Y_test.shape)
print("Predicted: ", predicted.shape)
print("Accuracy Score: ", accuracy_score(Y_test, predicted))

您应该只对测试数据调用
transform()
。切勿使用
fit()
或其变体,如
fit\u transform()
fit\u predict()
等。它们只能用于训练数据

所以换句话:

Y\u测试=mlb.fit\u变换(Y\u测试)

Y\u测试=mlb.transform(Y\u测试)

说明

当您调用
fit()
fit\u transform()
时,mlb将忘记其先前学习的数据,并学习新提供的数据。当
Y\u train
Y\u test
的标签可能与您的情况不同时,这可能会出现问题


在您的例子中,
Y\u train
有49种不同的标签,而
Y\u test
只有42种不同的标签。但这并不意味着Y_测试比Y_训练少7个标签。可能
Y\u test
可能有完全不同的标签集,二值化后会产生42列,这将影响结果。

您应该只对测试数据调用
transform()
。切勿使用
fit()
或其变体,如
fit\u transform()
fit\u predict()
等。它们只能用于训练数据

所以换句话:

Y\u测试=mlb.fit\u变换(Y\u测试)

Y\u测试=mlb.transform(Y\u测试)

说明

当您调用
fit()
fit\u transform()
时,mlb将忘记其先前学习的数据,并学习新提供的数据。当
Y\u train
Y\u test
的标签可能与您的情况不同时,这可能会出现问题


在您的例子中,
Y\u train
有49种不同的标签,而
Y\u test
只有42种不同的标签。但这并不意味着Y_测试比Y_训练少7个标签。可能
Y_test
可能有完全不同的标签集,二值化后会产生42列,这将影响结果。

非常感谢您的解释!它起作用了!!我有一个新的错误,但会接受它作为答案。谢谢man@otje您可以通过编辑此问题或在新问题中询问新错误。我已使用新错误编辑了该问题。谢谢你的帮助@otje此错误意味着测试中有一些新标签未在列中。这意味着估计员不会学习对它们进行分类。那个么你们想如何处理它们呢?我已经决定使用分层HuffleSplit来平等地共享训练和测试的目标类。我有一个实例,只有一个类不能拆分,任何其他解决方案都将非常感谢。谢谢[sklearn]:非常感谢您的解释!它起作用了!!我有一个新的错误,但会接受它作为答案。谢谢man@otje您可以通过编辑此问题或在新问题中询问新错误。我已使用新错误编辑了该问题。谢谢你的帮助@otje此错误意味着测试中有一些新标签未在列中。这意味着估计员不会学习对它们进行分类。那个么你们想如何处理它们呢?我已经决定使用分层HuffleSplit来平等地共享训练和测试的目标类。我有一个实例,只有一个类不能拆分,任何其他解决方案都将非常感谢。谢谢[sklearn]:
Y_train:  (1278, 49)
Y_test:  (630, 42)
Predicted:  (630, 49)
Traceback (most recent call last):
  File "C:/Users/../PycharmProjects/MultiAutoTag/classifier.py", line 41, in <module>
    print("Accuracy Score: ", accuracy_score(Y_test, predicted))
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\metrics\classification.py", line 174, in accuracy_score
    differing_labels = count_nonzero(y_true - y_pred, axis=1)
  File "C:\ProgramData\Anaconda3\lib\site-packages\scipy\sparse\compressed.py", line 361, in __sub__
    raise ValueError("inconsistent shapes")
ValueError: inconsistent shapes
Traceback (most recent call last):
  File "C:/Users/../PycharmProjects/MultiAutoTag/classifier.py", line 47, in <module>
    Y_test = mlb.transform(y_test)
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 763, in transform
    yt = self._transform(y, class_to_index)
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 787, in _transform
    indices.extend(set(class_mapping[label] for label in labels))
  File "C:\ProgramData\Anaconda3\lib\site-packages\sklearn\preprocessing\label.py", line 787, in <genexpr>
    indices.extend(set(class_mapping[label] for label in labels))
KeyError: 'Sanction'
print(y_test)

[['App'] ['Contract'] ['Pay'] ['App'] 
 ['App'] ['App']
 ['Reports'] ['Reports'] ['Executive', 'Pay']
 ['Change'] ['Reports']
 ['Reports'] ['Issue']]