我有两个 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?
该错误与 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
另一种无需降级即可工作的解决方案
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:重新加载软件包时,您可能需要重新启动内核以避免出现此错误。