Scikit-learn 回归的交叉验证评分

35 投票
3 回答
76569 浏览
提问于 2025-04-18 09:14

如何在回归分析中使用 cross_val_score 呢?默认的评分方式似乎是准确率,但这对于回归来说并没有什么意义。如果我想使用均方误差,能不能在 cross_val_score 中指定这个呢?

我尝试了以下两种方法,但都不奏效:

scores = cross_validation.cross_val_score(svr, diabetes.data, diabetes.target, cv=5, scoring='mean_squared_error') 

还有

scores = cross_validation.cross_val_score(svr, diabetes.data, diabetes.target, cv=5, scoring=metrics.mean_squared_error)

第一种方法生成了一堆负数,而均方误差应该总是非负的。第二种方法则报错说:

mean_squared_error() takes exactly 2 arguments (3 given)

3 个回答

0
from sklearn.model_selection import cross_val_score
from sklearn.metrics import make_scorer,mean_squared_error

scoring_metrics = make_scorer(mean_squared_error, 
                              greater_is_better=False
                             )

score = cross_val_score(model,
                        X_test,
                        y_test, 
                        cv=10, 
                        scoring=scoring_metrics)
mse = -score.mean()
mse

当然可以!请把你想要翻译的内容发给我,我会帮你用简单易懂的语言解释清楚。

14

第一个是对的。它输出的是均方误差(MSE)的负值,因为它总是试图让分数最大化。请帮我们建议一下文档的改进。

42

我没有足够的声望来评论,但我想给你和路过的人提供这个链接,里面讨论了在scikit-learn中MSE(均方误差)输出为负值的问题 - https://github.com/scikit-learn/scikit-learn/issues/2439

另外(为了让这个回答更完整),你的第一个选项是正确的,MSE确实是你用来比较模型的指标,而R^2的计算可能会受到你使用的交叉验证类型的影响(我认为是这样)。

如果你选择MSE作为评分标准,它会输出一系列的错误值,你可以把这些错误值求平均,像这样:

# Doing linear regression with leave one out cross val

from sklearn import cross_validation, linear_model
import numpy as np

# Including this to remind you that it is necessary to use numpy arrays rather 
# than lists otherwise you will get an error
X_digits = np.array(x)
Y_digits = np.array(y)

loo = cross_validation.LeaveOneOut(len(Y_digits))

regr = linear_model.LinearRegression()

scores = cross_validation.cross_val_score(regr, X_digits, Y_digits, scoring='mean_squared_error', cv=loo,)

# This will print the mean of the list of errors that were output and 
# provide your metric for evaluation
print scores.mean()

撰写回答