调用MLkNN拟合多标签数据时报__init__()参数错误如何解决
MLkNN拟合报错TypeError修复方案
报错原因
这个错误是scikit-learn版本和scikit-multilearn版本不兼容导致的:
- 新版scikit-learn的
NearestNeighbors类初始化时,k值必须通过关键字参数n_neighbors传递,不支持位置参数传值 - scikit-multilearn长期未更新,MLkNN内置调用
NearestNeighbors时仍用旧的位置参数写法,触发参数传递错误。
修复方案
方案1:降级scikit-learn版本(操作最简单)
直接安装和scikit-multilearn兼容的scikit-learn版本即可,执行命令:pip install scikit-learn==1.1.3
降级完成后重新运行原代码即可正常拟合。
方案2:修改MLkNN源码
如果不想降级scikit-learn,可以手动修改对应源码文件:
- 打开报错路径下的MLkNN源码文件:
~\Anaconda3\lib\site-packages\skmultilearn\adapt\mlknn.py - 定位到第165行,将原代码:
self.knn_ = NearestNeighbors(self.k).fit(X)
修改为:
self.knn_ = NearestNeighbors(n_neighbors=self.k).fit(X)
保存文件后重新运行原代码即可。
方案3:继承重写方法(无需修改第三方库源码)
如果不想改动安装的第三方库源码,可以自己继承MLkNN类重写对应的方法,代码示例:
from skmultilearn.adapt import MLkNN from sklearn.neighbors import NearestNeighbors import scipy.sparse as sparse import numpy as np class FixedMLkNN(MLkNN): def _compute_cond(self, X, y): # 仅修正NearestNeighbors的传参方式,其余逻辑保持原版本不变 self.knn_ = NearestNeighbors(n_neighbors=self.k).fit(X) c = sparse.lil_matrix((self._num_labels, self.k + 1), dtype='i8') cn = sparse.lil_matrix((self._num_labels, self.k + 1), dtype='i8') label_info = self._get_label_information(y) nix = self.knn_.kneighbors(X, self.k + 1, return_distance=False)[:, 1:] neighbors_labels = label_info[nix.ravel()].reshape(nix.shape[0], self.k, self._num_labels) label_counts = np.sum(neighbors_labels, axis=1).astype(int) for label in range(self._num_labels): current = label_counts[y[:, label].A.ravel() == 1, label] for c_l in set(current): c[label, c_l] += 1 current_cn = label_counts[y[:, label].A.ravel() == 0, label] for c_l_cn in set(current_cn): cn[label, c_l_cn] += 1 cond_prob_true = (self.smooth + c) / (2 * self.smooth + c.sum(axis=1).A.ravel().reshape(-1,1)) cond_prob_false = (self.smooth + cn) / (2 * self.smooth + cn.sum(axis=1).A.ravel().reshape(-1,1)) return cond_prob_true, cond_prob_false # 用修复后的类初始化模型即可正常使用 classifier = FixedMLkNN(k=3) classifier.fit(X=x_train_w2v.to_numpy(), y=y_train.to_numpy())
内容的提问来源于stack exchange,提问作者Naveen Reddy Marthala
相关产品推荐
相关产品推荐

