使用PyCaret中SOD模型调用predict_model时触发KeyError求助
解决PyCaret中SOD模型预测时的KeyError:0问题
问题根源
从报错栈可以明确:PyOD库中SOD模型的_sod方法使用了X[i]的索引逻辑,这种写法仅适用于NumPy数组。但PyCaret在调用预测时传入的是预处理后的DataFrame,此时X[i]会被解析为查找列名等于i的列,而你的测试数据中没有列名为0的字段,因此触发KeyError:0。
你推测的"未转换为数组"是核心问题,但可能修改方式未覆盖PyCaret的预处理流程,导致仍无法正常预测。
可行解决方案
方法1:手动处理测试数据为数组后预测
绕开PyCaret的predict_model方法,手动用预处理管道转换数据为数组,再调用SOD模型的原生预测方法:
from pycaret.anomaly import * import pandas as pd # 原初始化代码不变 anom_exp = setup(train,session_id = 125, categorical_features=['date', 'hours', 'weekNumber', 'DayName', 'isWeekday'], numeric_features=['cpu_avg'], ignore_features = ['Timestamp', 'time']) sod = create_model('sod',fraction = 0.1) # 获取PyCaret的预处理管道 prep_pipe = anom_exp.get_config('prep_pipe') # 预处理测试数据并转为NumPy数组 test_transformed = prep_pipe.transform(test).to_numpy() # 用SOD原生方法预测 pred_labels = sod.predict(test_transformed) pred_scores = sod.decision_function(test_transformed) # 将结果合并回原测试数据 test['Anomaly'] = pred_labels test['Anomaly_Score'] = pred_scores
方法2:修改PyOD的SOD源码(临时修复)
找到PyOD安装路径下的sod.py文件,修改_sod方法,确保先将输入转换为NumPy数组:
# 在_sod方法开头添加数组转换逻辑 def _sod(self, X): # 新增:确保输入为NumPy数组 from sklearn.utils.validation import check_array X = check_array(X) anomaly_scores = np.zeros(shape=(X.shape[0],)) for i in range(X.shape[0]): obs = X[i] ref = X[ref_inds[i,],] means = np.mean(ref, axis=0) # mean of each column # 后续原有代码保持不变
方法3:直接使用预处理后的数组训练与预测
在PyCaret初始化后,直接获取数组格式的训练数据,用原生方式训练和预测:
# 获取预处理后的训练数组 train_array = anom_exp.get_config('X') # 用数组重新训练模型 sod.fit(train_array) # 处理测试数据为数组 test_array = anom_exp.get_config('prep_pipe').transform(test).to_numpy() # 预测 preds = sod.predict(test_array)
内容的提问来源于stack exchange,提问作者joshita
相关产品推荐
相关产品推荐

