sklearn 交叉验证中的自定义评分函数

Custom Scoring Function in sklearn Cross Validate

我想为 cross_validate 使用自定义函数,它使用特定的 y_test 来计算精度,这与实际目标 y_test 不同 y_test .

我已经用 make_scorer 尝试了一些方法,但我不知道如何实际通过我的替代方案 y_test:

scoring = {'prec1': 'precision',
     'custom_prec1': make_scorer(precision_score()}

scores = cross_validate(pipeline, X, y, cv=5,scoring= scoring)

任何人都可以提出一个方法吗?

这样找到的。也许代码不是最优的,抱歉。

好的,让我们开始吧:

import numpy as np
import pandas as pd

from sklearn.linear_model import LogisticRegression

from sklearn.model_selection import GridSearchCV
from sklearn.metrics.scorer import make_scorer

xTrain = np.random.rand(100, 100)
yTrain = np.random.randint(1, 4, (100, 1))

yTrainCV = np.random.randint(1, 4, (100, 1))

model = LogisticRegression()

yTrainCV 将在此处用作自定义得分手。

def customLoss(xArray, yArray):
    indices = xArray.index.values
    tempArray = [1 if value1 != value2 else 0 for value1, value2 in zip(xArray.values, yTrainCV[[indices]])]

    return sum(tempArray)

scorer = {'main': 'accuracy',
          'custom': make_scorer(customLoss, greater_is_better=True)}

这里有一些技巧:

  • 您需要传递给 customLoss 2 个值(模型预测 + 实际值;不过我们不使用第二个参数)
  • 有一些 greater_is_better 的游戏:True/False 将 return 为正数或负数
  • 我们在 GridSearchCV
  • 中从 CV 中获得的指数

还有...

grid = GridSearchCV(model,
                    scoring=scorer,
                    cv=5,
                    param_grid={'C': [1e0, 1e1, 1e2, 1e3],
                                'class_weight': ['balanced', None]},
                    refit='custom')

 grid.fit(xTrain, pd.DataFrame(yTrain))
 print(grid.score(xTrain, pd.DataFrame(yTrain)))
  • 不要忘记GridSearchCV
  • 中的refit参数
  • 我们在这里将目标数组作为 DataFrame 传递——这将帮助我们检测自定义损失函数中的索引