使用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'
错误原因
- 未实例化基础分类器:创建元分类器时,直接传入
KNeighborsClassifier类而非实例对象。Scikit-learn元分类器需要接收已实例化的估计器,未实例化的类无法调用get_params()方法(缺少实例化后的self参数)。 - 参数网格存在错误:
- 参数名错误:
leaf_sizeint应为leaf_size; - 参数取值错误:
weights中的'None'是字符串类型,需改为Python空值None;algorithm列表重复'auto',属于冗余取值;'callable'不是weights的有效可选值(该参数仅接受'uniform'、'distance'或自定义可调用对象,字符串'callable'无效)。
- 参数名错误:
- 参数传递路径错误:元分类器包裹基础分类器后,
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
相关产品推荐
相关产品推荐

