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

使用BorutaPy结合KNN时出现'max_depth'键错误的技术求助

解决BorutaPy搭配KNeighborsClassifier时的KeyError问题

问题根源

BorutaPy最初是为**树基模型(如随机森林、决策树)**设计的:

  1. 当设置n_estimators='auto'时,它会尝试读取估计器的max_depth参数来自动计算所需的模型数量,但KNN没有这个参数,直接抛出KeyError。
  2. 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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.30 22:57:20