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

使用OneVsRestClassifier+KNeighborsClassifier时RandomizedSearchCV报TypeError错误

问题描述

使用OneVsRestClassifier和OneVsOneClassifier包裹KNeighborsClassifier时,沿用其他分类器配合RandomizedSearchCV的代码模式,出现TypeError: get_params() missing 1 required positional argument: 'self'错误,此前其他分类器与OneVsRestClassifier配合运行正常。

原代码

param_grid = {
    'n_neighbors': [1,2,3,4,5,6,8,10,11,12,14,20],
    'weights': ('uniform', 'distance', 'callable', 'None'),
    'algorithm': ('auto', 'ball_tree', 'kd_tree', 'brute', 'auto'),
    'leaf_sizeint': [10,20,30,40,50,60,80,120]
}

over_KNN_model = OneVsRestClassifier(KNeighborsClassifier)
ovo_KNN_model = OneVsOneClassifier(KNeighborsClassifier)

over_KNN_grid_param = RandomizedSearchCV(over_KNN_model, param_grid, cv=5, n_jobs=3, error_score="raise")
ovo_KNN_grid_param = RandomizedSearchCV(ovo_KNN_model, param_grid, cv=5, n_jobs=3, error_score="raise")
over_KNN_model_model_fit = over_KNN_grid_param.fit(X_train_scaled, y_train)

错误信息

TypeError: get_params() missing 1 required positional argument: 'self'

错误原因

  1. 未实例化基础分类器:创建元分类器时,直接传入KNeighborsClassifier类而非实例对象。Scikit-learn元分类器需要接收已实例化的估计器,未实例化的类无法调用get_params()方法(缺少实例化后的self参数)。
  2. 参数网格存在错误:
    • 参数名错误:leaf_sizeint应为leaf_size;
    • 参数取值错误:weights中的'None'是字符串类型,需改为Python空值None;algorithm列表重复'auto',属于冗余取值;'callable'不是weights的有效可选值(该参数仅接受'uniform'、'distance'或自定义可调用对象,字符串'callable'无效)。
  3. 参数传递路径错误:元分类器包裹基础分类器后,RandomizedSearchCV需要通过estimator__前缀指定内部基础分类器的参数,原参数网格未添加该前缀,会导致参数无法正确传递。

解决方法与修正后代码

修正要点

  • 实例化KNeighborsClassifier后传入元分类器;
  • 修正参数网格的参数名、取值,并添加estimator__前缀;
  • 移除无效的参数取值。

修正后代码

param_grid = {
    'estimator__n_neighbors': [1,2,3,4,5,6,8,10,11,12,14,20],
    'estimator__weights': ('uniform', 'distance', None),
    'estimator__algorithm': ('auto', 'ball_tree', 'kd_tree', 'brute'),
    'estimator__leaf_size': [10,20,30,40,50,60,80,120]
}

# 传入KNeighborsClassifier的实例
over_KNN_model = OneVsRestClassifier(KNeighborsClassifier())
ovo_KNN_model = OneVsOneClassifier(KNeighborsClassifier())

over_KNN_grid_param = RandomizedSearchCV(over_KNN_model, param_grid, cv=5, n_jobs=3, error_score="raise")
ovo_KNN_grid_param = RandomizedSearchCV(ovo_KNN_model, param_grid, cv=5, n_jobs=3, error_score="raise")
over_KNN_model_model_fit = over_KNN_grid_param.fit(X_train_scaled, y_train)

内容的提问来源于stack exchange,提问作者Data Science Analytics Manager

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.27 02:22:02