y_test 上的形状不一致错误 MultiLabelBinarizer,sklearn 多标签分类
inconsistent shape error MultiLabelBinarizer on y_test, sklearn multi-label classification
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))
我似乎无法进行任何测量,因为 Y_test 在 fit_transform 之后使用 MultiLabelBinarizer 给出了不同的矩阵维数。
结果和错误:
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
看打印出来的Y_test,形状跟其他的不一样。我做错了什么,为什么 MultiLabelBinarizer return 与 Y_test 的大小不同? 提前感谢您的帮助!
编辑 新错误:
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'
这就是 y_test 的样子:
print(y_test)
[['App'] ['Contract'] ['Pay'] ['App']
['App'] ['App']
['Reports'] ['Reports'] ['Executive', 'Pay']
['Change'] ['Reports']
['Reports'] ['Issue']]
您应该只对测试数据调用 transform()
。永远不要 fit()
或其变体,如 fit_transform()
或 fit_predict()
等。它们应该只用于训练数据。
所以改行:
Y_test = mlb.fit_transform(y_test)
到
Y_test = mlb.transform(y_test)
解释:
当您调用 fit()
或 fit_transform()
时,mlb 会忘记其先前学习的数据并学习新提供的数据。当 Y_train
和 Y_test
的标签可能与您的情况不同时,这可能会出现问题。
在您的例子中,Y_train
有 49 种不同的标签,而 Y_test
只有 42 种不同的标签。但这并不意味着 Y_test 比 Y_train
少 7 个标签。 Y_test
可能具有完全不同的标签集,当二值化时产生 42 列,这将影响结果。