📜  如何使用 GridSearch 在 scikit-learn 中创建自定义记分器功能 (1)

📅  最后修改于: 2023-12-03 15:38:00.758000             🧑  作者: Mango

如何使用 GridSearch 在 scikit-learn 中创建自定义记分器功能

scikit-learn 是一个广泛用于机器学习的 Python 库。其中 GridSearch 是一个用于调整超参数的重要工具。虽然 scikit-learn 同时提供了许多内置的记分器,但有时可能需要创建自己的记分器来对某些任务进行评估。本文将介绍如何使用 GridSearch 在 scikit-learn 中创建自定义记分器功能。

GridSearch 的基本用法

在使用 GridSearch 的过程中,首先需要定义一个参数网格,它是一个由超参数及其可能取值组成的字典,如下所示:

param_grid = {
    'parameter1': [value1, value2, ...],
    'parameter2': [value1, value2, ...],
    ...
    'parameterN': [value1, value2, ...]
}

然后选择一个估计器(estimator),它是一个能够根据输入数据对其进行拟合并做出预测的对象。例如,支持向量机(SVM)是一个常见的估计器。接下来,用 GridSearchCV 类创建一个实例,并将估计器、参数网格以及所需的交叉验证次数传递给它。如下所示:

from sklearn.model_selection import GridSearchCV

gs = GridSearchCV(estimator=svm.SVC(),
                  param_grid=param_grid,
                  cv=5)

最后,使用 GridSearchCV 的 fit 方法来拟合数据并对参数进行优化。优化将尝试所有参数的所有可能组合,并返回最佳超参数。一旦找到最佳超参数,便可将其用于新的数据集。如下所示:

gs.fit(X_train, y_train)
best_params = gs.best_params_

clf = svm.SVC(**best_params)
clf.fit(X_train, y_train)

这是一个基本的 GridSearch 使用方法。但在某些情况下,可能需要创建自己的记分器来对某些任务进行评估。接下来就是介绍如何创建自己的记分器。

自定义记分器

创建自定义记分器分为三个步骤:创建记分函数、将函数转化为记分器对象、将记分器对象传递给 GridSearchCV。

创建记分函数

首先,需要定义一个记分函数,它应该接受以下输入参数:估计器、训练数据、目标变量。并返回一个得分,用于评估估计器的性能。记分函数的实现方式完全取决于所需的性能指标。例如,下面是一个计算多类分类准确率的记分函数。

def accuracy_score(estimator, X, y):
    y_pred = estimator.predict(X)
    return metrics.accuracy_score(y, y_pred)

有关更多性能指标,可以在 metrics 模块中找到。

将函数转化为记分器对象

接下来,将记分函数转化为记分器对象。为此,需要使用 sklearn.metrics.make_scorer 函数,该函数将用于生成记分器对象的记分函数作为输入,以及一些其他参数,例如需要优化的超参数。下面是生成由 accuracy_score 记分函数评估的准确率记分器对象的一个例子。

from sklearn.metrics import make_scorer

scorer = make_scorer(accuracy_score, greater_is_better=True)
将记分器对象传递给 GridSearchCV

最后,将记分器对象传递给 GridSearchCV。该对象的作用是根据记分器对超参数进行评估,以便找到最佳超参数。请注意,如果记分器需要使用其他参数,则应以字典形式传递它们。下面是将记分器对象传递给 GridSearchCV 的一个例子。

gs = GridSearchCV(estimator=svm.SVC(),
                  param_grid=param_grid,
                  scoring=scorer,
                  cv=5)
完整代码
from sklearn.svm import SVC
from sklearn.metrics import accuracy_score, make_scorer
from sklearn.model_selection import GridSearchCV
from sklearn.datasets import load_iris

param_grid = {'C': [0.1, 1, 10], 'kernel': ['linear', 'rbf']}

scorer = make_scorer(accuracy_score, greater_is_better=True)

iris = load_iris()

X, y = iris.data, iris.target

gs = GridSearchCV(estimator=SVC(),
                  param_grid=param_grid,
                  scoring=scorer,
                  cv=5)

gs.fit(X, y)

print(gs.best_params_)
结论

在 scikit-learn 中创建自定义记分器是一项重要的任务,尤其是对于某些特定的任务和性能指标。在本文中,我们介绍了如何使用 GridSearch 在 scikit-learn 中创建自定义记分器功能。通过这种方式,我们可以更准确地评估算法,更好地理解和优化超参数。