sklearn交叉验证中的自定义评分功能

时间:2019-01-07 01:49:45

标签: python scikit-learn cross-validation

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

我已经尝试过使用make_scorer的几种方法,但是我不知道如何通过我的替代方法y_test

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

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

有什么建议的办法吗?

1 个答案:

答案 0 :(得分:1)

以这种方式发现。也许代码不是最佳的,对此感到抱歉。

好的,让我们开始:

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_betterTrue / False将返回正数或负数
  • 我们从GridSearchCV的简历中获得的索引

然后...

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)))
  • 不要忘记refit中的GridSearchCV参数
  • 我们在此处以DataFrame的形式传递目标数组-这将有助于我们检测自定义损失函数中的索引