模型评估

要对模型的预测准确度进行评估,需要利用estimator中的.score()方法、交叉验证函数中的scoring参数指定的评估算法和metrics包中提供的计量方法。一般estimator中的.score()方法都是内置定义好的,一般都紧密贴合模型不需要进行修改,所以对模型的评估主要是选择交叉验证函数的scoring参数和计量算法。

像前一节提到的GridSearchCV和交叉验证评估函数model_selection.cross_val_score()都可以接受一个名为scoring的参数用来指定模型的评估和计量方法。scoring参数可以接受一个字符串值,scikit-learn中的评估函数都有对应的字符串表示。常用的评估计量方法有以下这些。

标识字符串对应函数
用于分类算法
accuracymetrics.accuracy_score
balanced_accuracymetrics.balanced_accuracy_score
average_precisionmetrics.average_precision_score
brier_score_lossmetrics.brier_score_loss
f1metrics.f1_score
neg_log_lossmetrics.log_loss
precisionmetrics.precision_score
recallmetrics.recall_score
jaccardmetrics.jaccard_score
roc_aucmetrics.roc_auc_score
用于聚类算法
adjusted_mutual_info_scoremetrics.adjusted_mutual_info_score
adjusted_rand_scoremetrics.adjusted_rand_score
completeness_scoremetrics.completeness_score
fowlkes_mallow_scoremetrics.fowlkes_mallow_score
homogeneity_scoremetrics.homogeneity_score
mutual_info_scoremetrics.mutual_info_score
normalized_mutual_info_scoremetrics.normalized_mutual_info_score
v_measure_scoremetrics.v_measure_score
用于回归算法
explained_variancemetrics.explained_variance_score
max_errormetrics.max_error
neg_mean_absolute_errormetrics.mean_absolute_error
neg_mean_squared_errormetrics.mean_squared_error
neg_mean_squared_log_errormetrics.mean_squared_log_error
neg_median_absolute_errormetrics.median_absolute_error
r2metrics.r2_score
neg_mean_poisson_deviancemetrics.mean_poisson_deviance
neg_mean_gamma_deviancemetrics.mean_gamma_deviance

需要注意的是f1precisionrecalljaccard四个标识支持添加后缀,可用的后缀及意义如下:

  • 无后缀,应用于二分类。
  • _micro,应用于微平均,多用于多标签,会逐项计算平均。
  • _macro,应用于宏平均,直接计算各项平均,各项权重相同。
  • _weighted,应用于带权重平均。
  • _samples,应用于多标签样本。

以下给出一个简单的模型评估示例。

from sklearn import svm, datasets
from sklearn.model_selection import cross_val_score

iris = datasets.load_iris()
x, y = iris.data, iris.target
clf = svm.SVC(random_state=0)
cross_val_score(clf, x, y, cv=5, scoring='recall_macro')

scoring参数可以接受一个列表或者字典作为参数,其中可以同时指定多种评估方法。

sklearn.metrics包中提供的评估计量方法除了可以用在scoring参数上,还可以手动调用,一般评估计量方法会接受至少两个参数,一个是对比组y_true,一个是从模型获得的结果组y_pred。例如可以像以下示例中一样使用。

import numpy as np
from sklearn.metrics import accuracy_score

y_pred = [0, 2, 1, 3]
y_true = [0, 1, 2, 3]
accuracy_score(y_true, y_pred)

如果将scikit-learn与其他深度学习框架结合使用,就必须寻找并使用能够将模型包装成scikit-learn中estimator的工具。

如果要使用Keras建立模型并使用scikit-learn进行评估,就必须使用Keras中提供的keras.wrappers.scikit_learn.KerasClassifier类来包裹分类模型,使用keras.wrappers.scikit_learn.KerasRegressor类来包裹回归模型。这两个类在构建的时候使用build_fn参数接受一个能够返回模型的函数或者类。

如果需要使用PyTorch建立模型并使用scikit-learn进行评估,需要借助skorch库。skorch库中提供了NeuralNetClassifier类来包裹分类模型,NeuralNetRegressor类来包裹回归模型,也可以直接使用这两个类的基类NeuralNet来包裹模型,但部分参数需要自行设定。skorch中的NeuralNet类在创建时需要使用参数criterion来指定损失函数,参数optimizer来指定优化器。NeuralNet类接受一个module参数,可以将模型类传入。