You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

调用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,可以手动修改对应源码文件:

  1. 打开报错路径下的MLkNN源码文件:~\Anaconda3\lib\site-packages\skmultilearn\adapt\mlknn.py
  2. 定位到第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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 20:54:04