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

如何使用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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.26 12:54:03