GridSearchCV 的得分值

Posted

技术标签:

【中文标题】GridSearchCV 的得分值【英文标题】:Score values of GridSearchCV 【发布时间】:2020-05-03 10:22:07 【问题描述】:

我是机器学习新手,在我阅读的书籍和文档中,总分值介于 0 和 1 之间,表示准确度介于 0% 和 100% 之间。

在我自己的 scikit-learn 机器学习代码中,我得到的分数值介于 -750.8808105154.771036 之间,这让我很困惑。

>>> pipe = Pipeline([("scaler", MinMaxScaler()), ("svr", SVR())])
>>> param_grid = 'svr__C':[0.1, 1, 5], 
              'svr__epsilon':[0.001, 0.01]
>>> grid = GridSearchCV(estimator=pipe, 
                    param_grid=param_grid,
                    cv=GroupKFold(n_splits=24)
                   )
>>> grid.fit(X, y, groups)
GridSearchCV(cv=GroupKFold(n_splits=24), error_score=nan,
         estimator=Pipeline(memory=None,
                            steps=[('scaler',
                                    MinMaxScaler(copy=True,
                                                 feature_range=(0, 1))),
                                   ('svr',
                                    SVR(C=1.0, cache_size=200, coef0=0.0,
                                        degree=3, epsilon=0.1,
                                        gamma='scale', kernel='rbf',
                                        max_iter=-1, shrinking=True,
                                        tol=0.001, verbose=False))],
                            verbose=False),
         iid='deprecated', n_jobs=None,
         param_grid='svr__C': [0.1, 1, 5], 'svr__epsilon': [0.001, 0.01],
         pre_dispatch='2*n_jobs', refit=True, return_train_score=False,
         scoring=None, verbose=0)

>>> grid.best_score_
-750.880810

谁能给我解释一下?

编辑:

我的输入数据是发动机的测量值。

我有 12 次不同的引擎故障,每个故障都测量两次 => 12x2 = 24 个不同的组(我也会尝试 12 个组)。每个组包括:

X 数据:13 种不同的特征(温度、压力、电压等),每组 1200 个样本 y 数据:1 个特征(压力),每组 1200 个样本

【问题讨论】:

你能创建一些可重现的例子吗?也请用n_splits=24添加GroupKfold的原因。 为什么输入和输出变量都存在压力? 对不起,误解,这是两种不同的压力。为了清楚起见:输入数据中不存在输出变量。 【参考方案1】:

准确率是分类问题的常用评分方法。对于回归问题,它是 R 平方值。

对于GridSearchCV 中的scoring 参数,

如果没有,则使用估计器的评分方法。

对于 SVR,默认评分值来自RegressorMixin,即R^2

文档:

返回预测的决定系数R^2。

系数R^2定义为(1 - u/v),其中u是残差 平方和 ((y_true - y_pred) ** 2).sum() 和 v 是总数 平方和 ((y_true - y_true.mean()) ** 2).sum()。

最好的分数是 1.0,它可以是负数(因为 模型可以任意变差)。

一个始终不变的模型 预测 y 的期望值,忽略输入特征, 将获得 0.0 的 R^2 分数。

因此,当 R^2 的值非常大/小时,这听起来很合理。

一个玩具示例,用于了解评分输出。

from sklearn.preprocessing import MinMaxScaler
from sklearn.model_selection import GridSearchCV, GroupKFold
from sklearn.pipeline import Pipeline
import numpy as np

np.random.seed(0)
X, y = datasets.make_regression()
groups = np.random.randint(0, 10, len(X))

pipe = Pipeline([("scaler", MinMaxScaler()), ("svr", svm.SVR())])

parameters = 'svr__C': [ 0.1, 1, 5, 100], 'svr__epsilon': [0.001, 0.1]
svr = svm.SVR()
clf = GridSearchCV(pipe, parameters, cv=GroupKFold(n_splits=2))
clf.fit(X, y, groups)

print(clf.best_score_)
# 0.1239707770092825

我建议尝试使用不同的 cv 并调查问题。

【讨论】:

谢谢!我添加了有关我的输入数据的更多信息。如果您能给我建议如何处理这种数据(哪个 cv 方法和多少拆分),那就太好了

以上是关于GridSearchCV 的得分值的主要内容,如果未能解决你的问题,请参考以下文章

002-神经网络基础

什么取代了 scikit 中的 GridSearchCV._grid_scores_?

xgboost多分类原理

CS231N课程作业Assignment1--Softmax

机器学习--xgboost从初识到应用

1.10.4看谁运行的得快