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

如何在RandomizedSearchCV中使用自定义SMAPE指标完成超参数寻优

你可以通过scikit-learn提供的make_scorer工具将自定义评估指标包装为搜索器能识别的评分对象,具体修改方法如下:


第一步:导入依赖并封装自定义评估逻辑

因为你的目标变量是两列数据需要加权计算最终SMAPE,我们直接把完整的加权逻辑封装成符合sklearn规范的评估函数:

import numpy as np
from sklearn.metrics import make_scorer
from sklearn.model_selection import RandomizedSearchCV
from sklearn.ensemble import RandomForestRegressor

# 原有SMAPE计算函数,明确按列求和保证返回两列各自的SMAPE值
def smape(A, F):
    # axis=0指定按列计算,返回长度为2的数组,对应两个目标列的SMAPE
    return 100/len(A) * np.sum(2 * np.abs(F - A) / (np.abs(A) + np.abs(F)), axis=0)

# 封装最终加权SMAPE评估函数,入参顺序固定为「真实值在前、预测值在后」
def smape_final_metric(y_true, y_pred):
    smape_values = smape(y_true, y_pred)
    return round(smape_values[0] * 0.25 + smape_values[1] * 0.75, 4)

# 包装为sklearn可识别的评分器:SMAPE是误差指标,值越小越好,所以greater_is_better设为False
smape_scorer = make_scorer(smape_final_metric, greater_is_better=False)

第二步:给RandomizedSearchCV指定自定义评分指标

初始化搜索器时传入上面定义好的smape_scorer即可,搜索过程会自动用这个指标筛选最优参数:

parameters = {'max_depth':range(1,30,1), 'n_estimators':range(10,51,10)}
rgr_rand_frst = RandomizedSearchCV(
    RandomForestRegressor(random_state = 12345), 
    parameters, 
    cv=5, 
    random_state=12345,
    scoring=smape_scorer # 新增该行指定自定义评分器
)
rgr_rand_frst.fit(features_train, target_train)

# 后续验证代码可以直接复用封装好的函数
predicted_valid = rgr_rand_frst.predict(features_valid)
smape_final = smape_final_metric(target_valid, predicted_valid)
print('Final-smape: ', smape_final)
print('Best params: ', rgr_rand_frst.best_params_)

注意事项

  • greater_is_better参数必须设置为False:SMAPE是误差类指标,数值越低代表模型预测精度越高,默认True是给R2、准确率这类越高越好的指标使用的,不设置会导致搜索器选出效果最差的参数。
  • 自定义评估函数的入参顺序必须是真实值在前、预测值在后,这是sklearn的固定要求。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.01 19:54:02