MLKNN - __int__() 需要 1 个位置参数,但 2 个是通过 fit 方法给出的

问题描述 投票:0回答:2

我有两个 pandas 数据框。一个带有 word2vec 嵌入的 df(或 X),形状为 (50000,200)。和另一个填充了 0 和 1 的数据帧(或稀疏矩阵)。这个 df 是 sklearn.preprocessing.MultiLabelBinarizer 的输出,因此每列中仅填充 1 和 0,并且该 df 的形状为 (50000, 102)。

我尝试在这些数据上拟合skmultilearn.adapt.mlknn,如下所示:

from skmultilearn.adapt import MLkNN
classifier = MLkNN(k=3)
# train
classifier.fit(X=x_train_w2v.to_numpy(), y=y_train.to_numpy())

我得到的错误是:

TypeError Traceback (most recent call last)
<ipython-input-36-5ae90a2db4ec> in <module>
5 # # train
6
----> 7 clf_mlknn.fit(X=x_train_w2v.to_numpy(),y=y_train.to_numpy())
8 # predict
9 # predict_mlknn_wv = classifier_new.predict(x_test_mlknn)


~\Anaconda3\lib\site-packages\skmultilearn\adapt\mlknn.py in fit(self, X, y)
216 self._prior_prob_true, self._prior_prob_false = self._compute_prior(self._label_cache)
217 # Computing the posterior probabilities
--> 218 self._cond_prob_true, self._cond_prob_false = self._compute_cond(X, self._label_cache)
219 return self
220


~\Anaconda3\lib\site-packages\skmultilearn\adapt\mlknn.py in _compute_cond(self, X, y)
163 """
164
--> 165 self.knn_ = NearestNeighbors(self.k).fit(X)
166 c = sparse.lil_matrix((self._num_labels, self.k + 1), dtype='i8')
167 cn = sparse.lil_matrix((self._num_labels, self.k + 1), dtype='i8')


TypeError: __init__() takes 1 positional argument but 2 were given

从源代码中,我可以看到

NearestNeighbors
仅适合X,这也可以在上面以
--> 165
开头的行中的错误中看到。我认为这就是产生错误的原因。

如何修复此错误并正确拟合 MLkNN?

python scikit-learn knn skmultilearn
2个回答
3
投票

该错误与 scikit-learn 已指示的弃用警告有关 最近邻居:

FutureWarning:将 n_neighbors=3 作为关键字参数传递。从版本 1.0(0.25 的重命名)开始,将这些作为位置参数传递将导致错误“将导致错误”,FutureWarning)

此问题已在此处进行调整,并将包含在下一版本中:

https://github.com/scikit-multilearn/scikit-multilearn/issues/230

同时,可以使用 @Naveen-Reddy-Marthala 的解决方案 MLKNN - __int__() 需要 1 个位置参数,但通过 fit 方法给出 2 个位置参数:

!pip uninstall scikit-learn -y
!pip install scikit-learn==0.24.1

1
投票

另一种无需降级即可工作的解决方案

sklearn
是由poojasethi提出的,只需要更新
skmultilearn
包中的一行即可。

我使用的是Anaconda,所以我编辑的文件位于:

C:\Users\dudel\anaconda3\envs\myenv\Lib\site-packages\skmultilearn\adapt\mlknn.py
,第 165 行。

具体来说,旧线路165:

self.knn_ = NearestNeighbors(self.k).fit(X)

应更新为:

self.knn_ = NearestNeighbors(n_neighbors=self.k).fit(X)

PS:重新加载软件包时,您可能需要重新启动内核以避免出现此错误。

© www.soinside.com 2019 - 2024. All rights reserved.