使用BorutaPy结合KNN时出现'max_depth'键错误的技术求助
解决BorutaPy搭配KNeighborsClassifier时的KeyError问题
问题根源
BorutaPy最初是为**树基模型(如随机森林、决策树)**设计的:
- 当设置
n_estimators='auto'时,它会尝试读取估计器的max_depth参数来自动计算所需的模型数量,但KNN没有这个参数,直接抛出KeyError。 - KNN属于实例基模型,没有内置的
feature_importances_属性,而BorutaPy依赖这个属性来评估特征重要性。
解决方案
需要通过两个步骤适配KNN到BorutaPy:
1. 自定义KNN包装类,添加特征重要性计算
用**排列重要性(Permutation Importance)**为KNN生成特征重要性,实现BorutaPy需要的接口:
from sklearn.neighbors import KNeighborsClassifier from sklearn.inspection import permutation_importance import numpy as np class KNNWithImportance: def __init__(self, n_neighbors=5): self.n_neighbors = n_neighbors self.model = KNeighborsClassifier(n_neighbors=n_neighbors) self.feature_importances_ = None def fit(self, X, y): self.model.fit(X, y) # 计算排列重要性,n_repeats可根据需求调整 perm_result = permutation_importance( self.model, X, y, n_repeats=10, random_state=42 ) self.feature_importances_ = perm_result.importances_mean def predict(self, X): return self.model.predict(X) def get_params(self, deep=True): return {"n_neighbors": self.n_neighbors} def set_params(self, **params): self.n_neighbors = params.get("n_neighbors", 5) self.model = KNeighborsClassifier(n_neighbors=self.n_neighbors) return self
2. 修改BorutaPy初始化参数
将n_estimators从'auto'改为具体数值(比如100),避免触发自动读取max_depth的逻辑:
import pandas as pd from boruta import BorutaPy # 初始化带特征重要性的KNN knn = KNNWithImportance(n_neighbors=1) # 初始化BorutaPy,指定n_estimators为具体值 feat_selector = BorutaPy( estimator=knn, n_estimators=100, # 替换'auto'为具体数值 random_state=42 ) # 拟合数据 feat_selector.fit(X_train, y_train) # 后续预测与特征筛选 y_pred = knn.predict(X_test) selected_features_idx = np.where(feat_selector.support_ == True)[0] data = pd.read_csv(r'E:\Daneshgah \Data_OverSampling\Ghplipour1401-08-24_XX.csv') columns_name = np.array(data.columns)[selected_features_idx]
补充说明
- 排列重要性的原理是通过随机打乱单个特征的值,观察模型性能下降程度来衡量特征的重要性,适合KNN这类无内置重要性的模型。
- 如果不需要KNN,优先选择树基模型(如随机森林)搭配BorutaPy,无需额外封装,效率更高。
内容的提问来源于stack exchange,提问作者MGH
相关产品推荐
相关产品推荐

