Python机器学习库笔记(8)——scikit-learn:模型评估与优化

模型评估

cross_val_score交叉验证

1
sklearn.model_selection.cross_val_score(estimator, X, y=None, groups=None, scoring=None, cv="warn", n_jobs=None, verbose=0, fit_params=None, pre_dispatch="2*n_jobs", error_score="raise-deprecating")

cross_val_score将数据集分为cv折,每次取1折作为验证集,其他作为训练集进行预测,总共运行cv次,最后得到K次结果取其均值作为模型得分。由于该方法在分割数据集前不会对数据洗牌,常搭配sklearn.model_selection.KFold使用。关于scoring参数可选项,参见官方文档。返回值是每次验证得分的数组,通常取其均值和标准差。

GridSearchCV超参数调试

1
sklearn.model_selection.GridSearchCV(estimator, param_grid, scoring=None, fit_params=None, n_jobs=None, iid="warn", refit=True, cv="warn", verbose=0, pre_dispatch="2*n_jobs", error_score="raise-deprecating", return_train_score="warn")

GridSearchCV网格搜索法会根据输入的参数搜寻最优值,能大大便利模型调参。我们主要关心如下参数:

  • estimator:需要调参的estimator。
  • param_grid:通常接收一个字典,键是参数名,值是对应参数名的待选参数值的列表。
  • scoring:评分函数,和cross_val_score类似。

定义好对象后,使用fit()方法进行网格搜索,通过如下属性查看最优参数:

  • cv_results_:字典类型,包含使用所给参数的不同组合得到的各项得分。
  • best_score_:所给参数中的最高得分。
  • best_params_:所给参数中的最高得分对应的键值对。

Pipeline

1
sklearn.pipeline.Pipeline(steps, memory=None)

一般的机器学习项目里,通常要将数据先标准化,再拟合,有时还要在中间插上降维的过程。同样的步骤可能会在不同的数据集上重复使用。而使用Pipeline就可以将以上步骤像流水线一样完成,避免重复代码。

Pipeline一般只接收一个列表参数,每个元素是一个类似于键值对的元祖,键为步骤名称,值为实例化的对象,例如Pipeline([('norm', norm),('pca',pca),('svm', svm)])

sklearn.metrics

在scikit-learn中,要对一个拟合好的模型进行评估,有三种方法:

  • 使用各种estimator自带的score方法。一般来说,分类器的默认评估指标是正确率(accuracy),回归器的是拟合优度(R方)。
  • 使用模型评估工具(例如sklearn.model_selection.cross_val_score)的scoring参数设置各种评估指标来交叉验证。
  • 使用sklearn.metrics中的各种函数进行验证。

sklearn.metrics模块提供了非常多的评估函数,这些函数可以接收真实结果和预测结果并直接输出得分,另一种方法是使用sklearn.metrics.make_scorer打包供scoring参数调用。

分类

正确率(accuracy)

1
sklearn.metrics.accuracy_score(y_true, y_pred, normalize=True, sample_weight=None)

分类模型默认的评价指标,该值为预测正确的样本数与总样本数的比值,适用于二分类和多分类,但缺点在于不适合样本类别分布不均的情况,并且在有些问题中无法满足特定需求(例如,检查癌症,宁可错查不可遗漏,这时适用召回率)。

混淆矩阵(confusion matrix)

1
sklearn.metrics.confusion_matrix(y_true, y_pred, labels=None, sample_weight=None)

混淆矩阵适合查看各个类别被正确/错误分类的情况。

  • True Positive(TP):分类器正确分类的正例数据。
  • True Negative(TN):分类器正确分类的负例数据。
  • False Positive(FP):分类器错误标记为正例的负例数据。
  • False Negative(FN):分类器错误标记为负例的正例数据。

以下三种评价函数都是基于混淆矩阵。

准确率(precision)、召回率(recall)、F1 score

关于准确率(precision)和召回率(recall),可见此文章

F1-score是这两者的结合。

1
sklearn.metrics.precision_recall_fscore_support(y_true, y_pred, beta=1.0, labels=None, pos_label=1, average=None, warn_for=("precision", "recall", "f-score"), sample_weight=None)

使用classification_report会输出准确率、召回率和F1-score。

1
sklearn.metrics.classification_report(y_true, y_pred, labels=None, target_names=None, sample_weight=None, digits=2, output_dict=False)

AUC值

1
sklearn.metrics.roc_auc_score(y_true, y_score, average="macro", sample_weight=None, max_fpr=None)

ROC曲线是以FPR(False Positive Rate)为横轴,TPR(True Positive Rate)为纵轴绘制的坐标图。AUC值为ROC曲线下方区域的面积。AUC值越大,分类器效果越好。

回归

平均绝对误差(mean absolute error)

1
sklearn.metrics.mean_absolute_error(y_true, y_pred, sample_weight=None, multioutput="uniform_average")

均方误差(mean squared error)

1
sklearn.metrics.mean_squared_error(y_true, y_pred, sample_weight=None, multioutput="uniform_average")

拟合优度(R方)

1
sklearn.metrics.r2_score(y_true, y_pred, sample_weight=None, multioutput="uniform_average")

R方可以是负值,说明拟合效果很差。如果一个模型的预测结果恒为y的期望,则该模型的R方为0。

聚类

调整兰德系数(Adjusted Rand index)

1
sklearn.metrics.adjusted_rand_score(labels_true, labels_pred)

需要提供真实标签,取值位于-1到1之间,越高聚类效果越好。

轮廓系数(silhouette coefficient)

1
sklearn.metrics.silhouette_score(X, labels, metric="euclidean", sample_size=None, random_state=None, **kwds)

该聚类评估指标无需真实标签,得分最高是1,最差是-1。

Calinski-Harabaz Index

1
sklearn.metrics.calinski_harabaz_score(X, labels)

同样无需真实标签。