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

Bagging kNN交叉验证时调用cross_val_score出现Killed报错如何解决

问题原因

控制台输出Killed是操作系统内存溢出(OOM)守护进程主动终止了程序,说明运行时内存占用超过系统可用上限,该问题完全由参数配置不合理导致,具体触发原因如下:

  • BaggingClassifier配置了bootstrap=False:不符合Bagging集成的设计逻辑,500个kNN基分类器每个都要加载全量训练样本,内存占用直接翻500倍
  • UJIIndoorLoc数据集本身包含近2万条样本、500余列WIFI特征,kNN属于懒惰学习算法,预测阶段需要和所有训练样本做距离计算,500个基模型同时计算会直接耗尽内存
  • 10折交叉验证会同时加载多份数据副本,进一步加重内存负担
  • 原有代码的精度打印行存在运算符优先级bug,print("%0.2f accuracy" % eval_score.mean()*100)会先执行格式化再乘100,导致输出100次重复的精度字符串,额外占用输出资源
修复方案

按照优先级从高到低调整配置即可解决:

  • 开启Bagging采样:将bootstrap参数改为True,这是Bagging的默认配置,每个基分类器仅采样63%左右的训练数据,大幅降低单模型内存占用
  • 减少基分类器数量:将n_estimators从500下调到50~100区间,kNN本身方差较低,不需要过多基分类器即可达到理想的集成效果
  • 优化kNN运行效率:给KNeighborsClassifier添加algorithm='kd_tree'参数开启树结构加速近邻搜索,将距离度量改为manhattan降低计算开销
  • 调整交叉验证配置:如果内存仍然不足,将10折交叉验证改为5折,减少同时加载的数据集副本数量
  • 合理配置进程数:将n_jobs改为-2,使用除1个核心外的所有CPU资源并行计算,加快运行速度减少内存驻留时间
修正后核心代码
def main():
    # 优化kNN基分类器配置
    base_clf = KNeighborsClassifier(
        metric='manhattan', 
        n_neighbors=5,
        algorithm='kd_tree'
    )
    # 修正Bagging集成参数
    clf = BaggingClassifier(
        base_estimator=base_clf,
        n_estimators=100,
        max_samples=0.8,
        max_features=0.9,
        bootstrap=True,
        n_jobs=-2,
        random_state=1
    )
    machine = MachineDataset(
        pd.read_csv('../Datasets/UJIIndoorLoc/UJIIndoorLoc_ID.csv'),
        clf=clf
    )
    # 调整交叉验证折数
    machine.eval_x_fold(x_fold=5)

同时需要修正eval_x_fold方法的打印语句,修复运算符优先级问题:

def eval_x_fold(self, x_fold=10): 
    eval_score = cross_val_score(self.clf, self.X, self.y, cv=x_fold)
    # 加括号保证先计算精度百分比再格式化
    print("%0.2f accuracy" % (eval_score.mean()*100))

内容的提问来源于stack exchange,提问作者as43z

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.29 15:36:03