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
相关产品推荐
相关产品推荐

