为何OneClassSVM性能结果不可复现?
OneClassSVM超参数调优后模型不可复现问题
问题场景
- 使用GridSearchCV对OneClassSVM进行超参数调优,用于异常检测任务
- 采用1折交叉验证:每个超参数配置下,仅用目标类别数据训练模型,用目标类别+其他类别混合数据验证
- 配置
refit=False,避免在全量数据上重新训练
异常现象
调优得到最优参数后,使用GridSearchCV中相同的训练集、相同参数单独调用model.fit()训练OneClassSVM,在同一验证集上的评估结果与GridSearchCV内的结果略有差异;且多次重复fit()+predict()操作,即使超参数和数据集完全一致,每次结果仍存在差异。
排查过程
- 已反复检查折叠划分代码,排除数据划分错误的可能
- 查阅Scikit-learn旧版文档发现,OneClassSVM曾支持
random_state参数,但当前版本已移除,推测该参数缺失结合max_iter=-1(无迭代次数限制)是导致不可复现的原因 - 进一步观察到,即使固定
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
相关产品推荐
相关产品推荐

