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

使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.03 06:05:23