如何在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
相关产品推荐
相关产品推荐

