如何使用sklearn.metrics.make_scorer创建Adjusted R-squared调整R方评分器
调整R方评分函数适配SequentialFeatureSelector实现方案
现有代码无法正常运行的核心原因是:make_scorer生成的评分对象默认仅会传入y_true、y_pred两个参数,无法动态获取每一轮特征选择时的特征矩阵,也就拿不到当前用到的特征数量计算调整R方。
mlxtend的SequentialFeatureSelector的scoring参数原生支持传入自定义可调用对象,仅要求函数接收estimator(当前训练好的模型)、X(当前轮用到的特征矩阵)、y(真实标签)三个参数,完全满足调整R方的计算需求,不需要通过make_scorer封装,实现代码如下:
import numpy as np def adj_r2_score(estimator, X, y): # 生成预测结果 y_pred = estimator.predict(X) # 计算R² ss_res = np.sum((y - y_pred) ** 2) ss_tot = np.sum((y - np.mean(y)) ** 2) r2 = 1 - (ss_res / ss_tot) # 提取样本数n、特征数k n = X.shape[0] k = X.shape[1] # 计算调整R² return 1 - (1 - r2) * (n - 1) / (n - k - 1)
使用示例
from mlxtend.feature_selection import SequentialFeatureSelector from sklearn.linear_model import LinearRegression # 初始化基础模型 model = LinearRegression() # 初始化序列特征选择器 sfs = SequentialFeatureSelector( estimator=model, k_features=3, # 目标选择的特征数 forward=True, # 前向选择模式,后向搜索可改为False scoring=adj_r2_score, # 直接传入自定义调整R²评分函数 cv=5 # 交叉验证折数,无需交叉验证设为0即可 ) # 拟合全量特征和标签即可运行特征选择 sfs.fit(your_full_feature_matrix, your_label_array)
注:原代码中通过皮尔逊相关系数平方计算R²的写法仅在带截距项的简单线性回归场景下等价于标准R²,上述实现采用残差平方和/总平方和的计算方式通用性更强,适配所有回归模型。
内容的提问来源于stack exchange,提问作者Muhammad Arhab
相关产品推荐
相关产品推荐

