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

为何OneClassSVM性能结果不可复现?

OneClassSVM超参数调优后模型不可复现问题

问题场景

  • 使用GridSearchCV对OneClassSVM进行超参数调优,用于异常检测任务
  • 采用1折交叉验证:每个超参数配置下,仅用目标类别数据训练模型,用目标类别+其他类别混合数据验证
  • 配置refit=False,避免在全量数据上重新训练

异常现象

调优得到最优参数后,使用GridSearchCV中相同的训练集、相同参数单独调用model.fit()训练OneClassSVM,在同一验证集上的评估结果与GridSearchCV内的结果略有差异;且多次重复fit()+predict()操作,即使超参数和数据集完全一致,每次结果仍存在差异。

排查过程

  1. 已反复检查折叠划分代码,排除数据划分错误的可能
  2. 查阅Scikit-learn旧版文档发现,OneClassSVM曾支持random_state参数,但当前版本已移除,推测该参数缺失结合max_iter=-1(无迭代次数限制)是导致不可复现的原因
  3. 进一步观察到,即使固定max_iter为定值,每次训练后model.n_iter_的数值仍不相同,问题未得到解决

示例代码

# 实例化PCA
pca = PCA()

# 实例化StandardScaler
scaler = StandardScaler()

# 筛选数值型特征
numeric_features = X.select_dtypes([np.number]).columns

# 构建预处理模块
preprocessor = ColumnTransformer(
    transformers=[
        ("scaling", scaler, numeric_features)
    ]
)

# 创建Pipeline
pipeline = Pipeline(steps=[
    ("preprocessor", preprocessor),
    ("pca", pca),
    ("estimator", OneClassSVM())
])

# 定义超参数网格
parameters = [
    {
        "pca__n_components": [3, 5, 7],
        "estimator__kernel": ["linear", "poly", "sigmoid"],
        "estimator__degree": [2, 3, 4, 5],
        "estimator__gamma": ["scale", "auto"],
        "estimator__nu": [0.01, 0.05, 0.1],  
        "estimator__max_iter": [-1]
    }
]   
                       
# 超参数调优
grid_search = GridSearchCV(pipeline, parameters, cv=folds_indices, scoring="f1_weighted", n_jobs=1, refit=False, return_train_score=False, verbose=3)
grid_search.fit(X, y)
print("\nBest score is:")
print(f"{grid_search.best_score_:.4f}")
print("\n")
print("Obtained with hyperparameters:")
print(grid_search.best_params_)
print("\n")

# 使用最优参数实例化OneClassSVM
model = OneClassSVM(
                    degree=grid_search.best_params_["estimator__degree"],
                    gamma=grid_search.best_params_["estimator__gamma"],  
                    kernel=grid_search.best_params_["estimator__kernel"], 
                    nu=grid_search.best_params_["estimator__nu"],
                    max_iter=grid_search.best_params_["estimator__max_iter"]
                    )

注:X为特征集,y为标签集,X包含训练和验证数据,通过cv=folds_indices(元组)指定划分;未设置cv为整数,避免OneClass模型在含混合类别的验证集上训练;设置refit=False是为了避免最终在全部训练+验证数据上训练。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.14 22:25:29