Scikit-learn中KNN分类器出现"Multiclass-multioutput is not supported"错误。

4

我有两个变量X和Y。

X的结构(即一个np.array):

[[26777 24918 26821 ...    -1    -1    -1]
[26777 26831 26832 ...    -1    -1    -1]
[26777 24918 26821 ...    -1    -1    -1]
...
[26811 26832 26813 ...    -1    -1    -1]
[26830 26831 26832 ...    -1    -1    -1]
[26830 26831 26832 ...    -1    -1    -1]]

Y的结构:

[[1252, 26777, 26831], [1252, 26777, 26831], [1252, 26777, 26831], [1252, 26777, 26831], [1252, 26777, 26831], [1252, 26777, 26831], [25197, 26777, 26781], [25197, 26777, 26781], [25197, 26777, 26781], [26764, 25803, 26781], [26764, 25803, 26781], [25197, 26777, 26781], [25197, 26777, 26781], [1252, 26777, 16172], [1252, 26777, 16172]]

Y中的数组,例如[1252,26777,26831]是三个独立的特征。

我正在使用scikit learn模块中的Knn分类器。

classifier = KNeighborsClassifier(n_neighbors=3)
classifier.fit(X,Y)
predictions = classifier.predict(X)
print(accuracy_score(Y,predictions))

但我遇到了一个错误:

ValueError: multiclass-multioutput 不支持

我猜 'Y' 的结构是不被支持的,我应该做哪些改变才能让程序运行呢?

输入:

  Deluxe Single room with sea view

预期输出:
c_class = Deluxe
c_occ = single
c_view = sea

你能分享一下输入和输出实际上是什么吗?比如说是图像数据还是其他特征? - Chhitij
已添加了输入和期望输出,全部都是文本。 - radix
2个回答

5

如错误中所述,KNN不支持多输出回归/分类。

针对您的问题,您需要使用MultiOutputClassifier()

from sklearn.multioutput import MultiOutputClassifier

knn = KNeighborsClassifier(n_neighbors=3)
classifier = MultiOutputClassifier(knn, n_jobs=-1)
classifier.fit(X,Y)

工作示例:

>>> from sklearn.feature_extraction.text import TfidfVectorizer
>>> corpus = [
...     'This is the first document.',
...     'This document is the second document.',
...     'And this is the third one.',
...     'Is this the first document?',
... ]
>>> vectorizer = TfidfVectorizer()
>>> X = vectorizer.fit_transform(corpus)

>>> Y = [[124323,1234132,1234],[124323,4132,14],[1,4132,1234],[1,4132,14]]

>>> from sklearn.multioutput import MultiOutputClassifier
>>> from sklearn.neighbors import KNeighborsClassifier
>>> knn = KNeighborsClassifier(n_neighbors=3)
>>> classifier = MultiOutputClassifier(knn, n_jobs=-1)
>>> classifier.fit(X,Y)
>>> predictions = classifier.predict(X)

array([[124323,   4132,     14],
       [124323,   4132,     14],
       [     1,   4132,   1234],
       [124323,   4132,     14]])

>>> classifier.score(X,np.array(Y))
0.5

>>> test_data = ['I want to test this']
>>> classifier.predict(vectorizer.transform(test_data))
array([[124323,   4132,     14]])

1
我遇到了相同的错误:ValueError:不支持多类多输出。 - radix
我添加了这两行代码,但是仍然出现相同的错误:predictions = classifier.predict(X) #print(accuracy_score(Y,predictions)) - radix
2
"predictions" 不会出现任何错误。对于多输出,您不能使用 "accuracy_score",需要为输出的每一列分别应用它。 - Venkatachalam
使用这个 classifier.score(X,np.array(Y)) - Venkatachalam
谢谢,如果我想提供新的输入,以便程序可以根据先前训练的数据给出输出。 - radix
显示剩余4条评论

0
#use dataframe instead of list:
#for example :
dataset = list()
#....
df = pd.DataFrame(dataset)

y, X = df[df.columns[-1]], df.drop(df.columns[-1], axis=1)

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

# euclidean_distance (l2) for p = 2.
knn_model = KNeighborsClassifier(n_neighbors=5,p=2)
knn_model.fit(X_train, y_train)
y_pred = knn_model.predict(X_test)

print(classification_report(y_test, y_pred))
print('Accuracy score: ', round(accuracy_score(y_test, y_pred), 2))
print('F1 Score: ', round(f1_score(y_test, y_pred), 2))
print(confusion_matrix(y_test, y_pred))

1
目前你的回答不够清晰,请编辑并添加更多细节,以帮助其他人理解它如何回答问题。你可以在帮助中心找到有关如何撰写好答案的更多信息。 - Community

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接