逐段拆解这个 score 源码,讲清楚底层逻辑
一、整体作用
这是 sklearn 所有回归模型(LinearRegression/SGDRegressor 等)内置的 .score() 方法,专门用来计算 R2R^2R2 决定系数,衡量模型拟合效果好坏。
调用格式:模型.score(X测试特征, y真实标签)
二、函数头部定义
def score(self, X, y, sample_weight=None):
- self:指代当前训练好的模型实例(比如你代码里的 linear_model、sgd_model)
- X:测试集特征(就是你代码里的 x_test)
- y:测试集真实标签(你代码里的 y_test,不是预测值 y_pred)
- sample_weight:样本权重,默认不用传
三、文档字符串(“”" “”"里的注释,核心数学原理)
1. R2R^2R2 公式定义
R2=1−uvR^2 = 1 – \\frac{u}{v}R2=1−vu
- uuu:残差平方和 ((y真实−y预测)2).sum()((y_{真实}-y_{预测})^2).sum()((y真实−y预测)2).sum(),模型预测误差总和
- vvv:总平方和 ((y真实−y真实均值)2).sum()((y_{真实}-y_{真实均值})^2).sum()((y真实−y真实均值)2).sum(),只用平均值预测的基准误差
2. 分数解读(重点)
3. 参数说明
- X:测试样本特征集,形状 [样本数, 特征数]
- y:对应X的真实标签,必须和X样本数量一一对应
- sample_weight:给不同样本加权重(业务里少数重要样本加大权重时使用)
四、核心执行代码(最关键3行)
from .metrics import r2_score # 导入官方R²计算函数
y_pred = self.predict(X) # 第一步:用传入的X自动生成预测值
return r2_score(y, y_pred, sample_weight=sample_weight) # 第二步:计算R²并返回
流程拆解
五、结合你之前的代码答疑
1. 为什么 linear_model.score(x_test,y_test) 参数没错?
源码内部自动执行了预测,你只需要给它特征X和真实y,不用手动传y_pred。
如果写成 score(x_test, y_pred1) 会完全算错:
此时函数会把 y_pred1 当成「真实标签y」,把内部 predict(x_test) 的结果当成预测值,对比两组预测值,结果毫无意义。
2. 和 mean_squared_error 的区别对照
- mean_squared_error(y_test, y_pred1):需要你手动算出预测值,传「真实值、预测值」两个参数;
- .score(x_test,y_test):内部自动预测,只需要传「特征、真实值」。
3. 等价手动写法
你下面两段代码输出结果完全一模一样:
# 写法1:调用模型内置score(简洁)
score1 = linear_model.score(x_test, y_test)
# 写法2:手动复现源码逻辑(看懂底层)
from sklearn.metrics import r2_score
y_pred1 = linear_model.predict(x_test)
score1 = r2_score(y_test, y_pred1)

