模型评估
要对模型的预测准确度进行评估,需要利用estimator中的.score()方法、交叉验证函数中的scoring参数指定的评估算法和metrics包中提供的计量方法。一般estimator中的.score()方法都是内置定义好的,一般都紧密贴合模型不需要进行修改,所以对模型的评估主要是选择交叉验证函数的scoring参数和计量算法。
像前一节提到的GridSearchCV和交叉验证评估函数model_selection.cross_val_score()都可以接受一个名为scoring的参数用来指定模型的评估和计量方法。scoring参数可以接受一个字符串值,scikit-learn中的评估函数都有对应的字符串表示。常用的评估计量方法有以下这些。
| 标识字符串 | 对应函数 |
|---|---|
| 用于分类算法 | |
accuracy | metrics.accuracy_score |
balanced_accuracy | metrics.balanced_accuracy_score |
average_precision | metrics.average_precision_score |
brier_score_loss | metrics.brier_score_loss |
f1 | metrics.f1_score |
neg_log_loss | metrics.log_loss |
precision | metrics.precision_score |
recall | metrics.recall_score |
jaccard | metrics.jaccard_score |
roc_auc | metrics.roc_auc_score |
| 用于聚类算法 | |
adjusted_mutual_info_score | metrics.adjusted_mutual_info_score |
adjusted_rand_score | metrics.adjusted_rand_score |
completeness_score | metrics.completeness_score |
fowlkes_mallow_score | metrics.fowlkes_mallow_score |
homogeneity_score | metrics.homogeneity_score |
mutual_info_score | metrics.mutual_info_score |
normalized_mutual_info_score | metrics.normalized_mutual_info_score |
v_measure_score | metrics.v_measure_score |
| 用于回归算法 | |
explained_variance | metrics.explained_variance_score |
max_error | metrics.max_error |
neg_mean_absolute_error | metrics.mean_absolute_error |
neg_mean_squared_error | metrics.mean_squared_error |
neg_mean_squared_log_error | metrics.mean_squared_log_error |
neg_median_absolute_error | metrics.median_absolute_error |
r2 | metrics.r2_score |
neg_mean_poisson_deviance | metrics.mean_poisson_deviance |
neg_mean_gamma_deviance | metrics.mean_gamma_deviance |
需要注意的是f1、precision、recall、jaccard四个标识支持添加后缀,可用的后缀及意义如下:
- 无后缀,应用于二分类。
_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参数,可以将模型类传入。