模型评估

一、数据集切分

  1. 数据集切分的通用参数:

    • random_state:一个整数或者一个RandomState实例,或者None,指定随机数种子。

      • 如果为整数,则它指定了随机数生成器的种子。
      • 如果为RandomState实例,则指定了随机数生成器。
      • 如果为None,则使用默认的随机数生成器。
    • X:样本集合。通常是一个numpy array,每行代表一个样本,每列代表一个特征。

    • y:样本的标签集合。它与X 的每一行相对应。

    • groups:样本的分组标记集合。它与X 的每一行相对应,用于训练集、测试集的拆分。

1.1 train_test_split

  1. train_test_split用于将数据集切分成训练集和测试集,其原型为:

    返回值:一个列表,依次给出一个或者多个数据集的划分的结果。每个数据集都划分为两部分:训练集、测试集。

    参数:

    • *arrays:一个或者多个数组,代表被拆分的一些数据集。

    • test_size:一个浮点数,整数或者None,指定测试集大小。

      • 浮点数:必须是0.0 到 1.0 之间的数,代表测试集占原始数据集的比例。
      • 整数:代表测试集大小。
      • None:如果训练集大小也指定为None,则test_size设为 0.25。
    • train_size:一个浮点数,整数或者None,指定训练集大小。

      • 浮点数:必须是0.0 到 1.0 之间的数,代表训练集占原始数据集的比例。
      • 整数:代表训练集大小。
      • None:如果测试集大小也指定为None,则test_size设为 0.75。
    • random_state:指定随机数种子。

    • stratify:一个数组对象或者None。如果它不是None,则原始数据会分层采样,采样的标记数组就由该参数指定。

1.2 KFold

  1. KFold类实现了数据集的 折交叉切分。其原型为:

    • n_splits:一个整数,即 (要求该整数值大于等于 2)。
    • shuffle:一个布尔值。如果为True,则在切分数据集之前先混洗数据集。
    • random_state:指定随机数种子。
  2. 方法:

    • get_n_splits([X, y, groups]) :返回n_splits参数。

      参数:其参数都被忽略,用于保持接口的兼容性。

    • split(X[, y, groups]):切分数据集为训练集和测试集。返回测试集的样本索引、训练集的样本索引。

      参数:

      • X为训练数据集,形状为(n_samples,n_features)
      • y为标记信息,形状为(n_samples,)
      • groups:样本的分组标记,用于拆分。
  3. KFold首先将 0~(n-1)之间的整数从前到后均匀划分成 n_splits份。每次迭代时依次挑选一份作为测试集样本的下标。

    • 如果shuffle=True, 则按顺序划分。
    • 如果shuffle=False, 则按随机划分。

1.3 StratifiedKFold

  1. StratifiedKFold类实现了数据集的分层采样 折交叉切分。其原型为:

    参数:参考KFold

  2. 方法:参考KFold

  3. StratifiedKFold 的用法类似于KFold,但是StratifiedKFold执行的是分层采样:保证训练集、测试集中各类别样本的比例与原始数据集中相同。

1.4 LeaveOneOut

  1. LeaveOneOut 类实现了数据集的留一法拆分(简称LOO)。它是个生成器,其原型为:

    • n:一个整数,表示数据集大小。
  2. LeaveOneOut的用法很简单。它每次迭代时,依次取 0,1,...(n-1) 作为测试集样本的下标。

1.5 cross_val_score

  1. 便利函数cross_val_scoreestimator 执行k 折交叉验证。其原型为:

    返回值:返回一个浮点数的数组。每个浮点数都是针对某次 折交叉的数据集上, estimator预测性能得分。

    参数:

    • estimator:指定的学习器,该学习器必须有.fit方法来进行训练。

    • X:样本集合。通常是一个numpy array,每行代表一个样本,每列代表一个特征。

    • y:样本的标签集合。它与X 的每一行相对应。

    • groups:样本的分组标记集合。它与X 的每一行相对应,用于训练集、测试集的拆分。

    • scoring:一个字符串,或者可调用对象,或者None,它指定了评分函数。

      如果为可调用对象,则参数为estimator, X, y ,返回值为一个浮点数表示预测能力得分。

      如果为None,则采用estimator学习器的.score方法。

      如果为字符串,则可以为下列字符串:

      • 'accuracy':采用的是metrics.accuracy_score评分函数。

      • 'average_precision':采用的是metrics.average_precision_score评分函数。

      • f1系列:采用的是metrics.f1_score 评分函数。包括:

        • 'f1'f1 值作为评分。用于二分类问题。
        • 'f1_micro' :微f1 值作为评分。用于多分类问题。
        • 'f1_macro':宏f1 值作为评分。用于多分类问题。
        • 'f1_weighted':加权 f1 值作为评分。
        • 'f1_samples' :多标签f1 值作为评分。
      • 'log_loss': 采用的是metrics.log_loss评分函数。

      • precision系列:采用的是metrics.precision_score评分函数。

        具体形式类似f1系列。

      • recall 系列:采用的是metrics.recall_score评分函数。

        具体形式类似f1系列。

      • 'roc_auc':采用的是metrics.roc_auc_score 评分函数 。

      • 'adjusted_rand_score':采用的是metrics.adjusted_rand_score 评分函数。

      • 'mean_absolute_error':采用的是metrics.mean_absolute_error 评分函数。

      • 'mean_squared_error’':采用的是metrics.mean_squared_error 评分函数。

      • 'median_absolute_error':采用的是metrics.median_absolute_error 评分函数。

      • 'r2':采用的是metrics.r2_score 评分函数 。

    • cv:一个整数、 折交叉生成器、一个迭代器、或者None,指定k 折交叉参数。

      • 如果为None,则使用默认的 3 折交叉生成器。
      • 如果为整数,则指定了 折交叉生成器的 值。
      • 如果为 折交叉生成器,则直接指定了 折交叉生成器。
      • 如果为迭代器,则迭代器的结果就是数据集划分的结果。
    • fit_params:一个字典,指定了estimator执行.fit方法时的关键字参数。

    • n_jobs:一个整数,指定并行性。

    • verbose:一个整数,用于控制输出日志。

    • pre_dispatch:一个整数或者字符串或者None,用于控制并行执行时,分发的总的任务数量。

      • 如果为None,则所有的job 立即创建并派生。
      • 如果为整数,则它指定了立即派生的job 的数量。
      • 如果为字符串,则指定了n_jobs 的表达式。如'2*n_jobs' 表示立即派生2倍 n_jobs 数量的job
  2. 之所以称cross_val_score 为便利函数,是因为完全可以凭借现有的函数手动完成这个功能,步骤为:

    • 折交叉划分数据集,对每次划分结果执行:

      • 在训练集上训练 estimator
      • 用训练好的 estimator 预测测试集,返回测试性能得分。
    • 收集所有的测试性能得分,放入一个数组并返回。

 

二、性能度量

  1. scikit-learn中有三种方法来评估estimator 的预测性能:

    • estimator.score方法。
    • 通过使用model_selection中的模型评估工具来评估,如model_selection.cross_val_score等方法。
    • 通过scikit-learnmetrics模块中的函数来评估estimator 的预测性能。这里重点讲解这些函数。
  2. metrics模块中的性能评价函数的通用参数:

    • y_true:一个数组,给出了真实的标记集合。
    • y_pred:一个数组,给出了预测的标记集合。
    • sample_weight:一个浮点数,给出了样本权重。默认每个样本的权重为 1。

2.1 分类问题性能度量

2.1.1 accuracy_score

  1. accuracy_score函数用于计算分类结果的准确率,其原型为:

    返回值:如果normalizeTrue,则返回准确率;如果normalizeFalse,则返回正确分类的数量。

    参数:

    • y_true:真实的标记集合。

    • y_pred:预测的标记集合。

    • normalize:一个布尔值,指示是否需要归一化结果。

      • 如果为True,则返回分类正确的比例(准确率)。
      • 如果为False,则返回分类正确的样本数量。
    • sample_weight:样本权重,默认每个样本的权重为 1 。

2.1.2 precision_score

  1. precision_score函数用于计算分类结果的查准率,其原型为:

    返回值:查准率。即预测结果为正类的那些样本中,有多少比例确实是正类。

    参数:

    • y_true:真实的标记集合。

    • y_pred:预测的标记集合。

    • labels:一个列表。当average 不是'binary' 时使用。

      • 对于多分类问题,它指示:将计算哪些类别。不在labels 中的类别,计算macro precision 时其成分为 0 。
      • 对于多标签问题,它指示待考察的标签的索引。
      • 除了average=None 之外,labels 的元素的顺序也非常重要。
      • 默认情况下,y_truey_pred 中所有的类别都将被用到。
    • pos_label:一个字符串或者整数,指定哪个标记值属于正类。

      • 如果是多分类或者多标签问题,则该参数被忽略。
      • 如果设置label=[pos_label] 以及average!='binary' 则会仅仅计算该类别的precision
    • average:一个字符串或者None,用于指定二分类或者多类分类的precision 如何计算。

      • 'binary':计算二类分类的precision。 此时由pos_label 指定的类为正类,报告其precision

        它要求y_true、y_pred 的元素都是0,1

      • 'micro':通过全局的正类和父类,计算precision

      • 'macro':计算每个类别的precision,然后返回它们的均值。

      • 'weighted':计算每个类别的precision,然后返回其加权均值,权重为每个类别的样本数。

      • 'samples':计算每个样本的precision,然后返回其均值。

        该方法仅仅对于多标签分类问题有意义。

      • None:计算每个类别的precision,然后以数组的形式返回每个precision

    • sample_weight:样本权重,默认每个样本的权重为 1

2.1.3 recall_score

  1. recall_score函数用于计算分类结果的查全率,其原型为:

    返回值:查全率。即真实的正类中,有多少比例被预测为正类。

    参数:参考precision_score

2.1.4 f1_score

  1. f1_score函数用于计算分类结果的 值,其原型为:

    返回值: 值。即查准率和查全率的调和均值。

    参数:参考precision_score

2.1.5 fbeta_score

  1. fbeta_score函数用于计算分类结果的 值,其原型为:

    返回值: 值。

    参数:

    • beta
    • 其它参数参考precision_score

2.1.6 classification_report

  1. classification_report函数以文本方式给出了分类结果的主要预测性能指标。其原型为:

    返回值:一个格式化的字符串,给出了分类评估报告。

    参数:

    • y_true:真实的标记集合。
    • y_pred:预测的标记集合。
    • labels:一个列表,指定报告中出现哪些类别。
    • target_names:一个列表,指定报告中类别对应的显示出来的名字。
    • digits:用于格式化报告中的浮点数,保留几位小数。
    • sample_weight:样本权重,默认每个样本的权重为 1
  2. 分类评估报告的内容如下,其中:

    • precision列:给出了查准率。它依次将类别 0 作为正类,类别 1 作为正类...

    • recall列:给出了查全率。它依次将类别 0 作为正类,类别 1 作为正类...

    • recall列:给出了 值。

    • support列:给出了该类有多少个样本。

    • avg / total行:

      • 对于precision,recall,recall,给出了该列数据的算术平均。
      • 对于support列,给出了该列的算术和(其实就等于样本集总样本数量)。

2.1.7 confusion_matrix

  1. confusion_matrix函数给出了分类结果的混淆矩阵。其原型为:

    返回值:一个格式化的字符串,给出了分类结果的混淆矩阵。

    参数:参考classification_report

  2. 混淆矩阵的内容如下,其中 表示真实标记为 但是预测为 的样本的数量。

2.1.8 precision_recall_curve

  1. precision_recall_curve函数用于计算分类结果的P-R曲线。其原型为:

    返回值:一个元组,元组内的元素分别为:

    • P-R曲线的查准率序列。该序列是递增序列,序列第 i 个元素是当正类概率的判定阈值为 thresholds[i]时的查准率。
    • P-R曲线的查全率序列。该序列是递减序列,序列第 i 个元素是当正类概率的判定阈值为 thresholds[i]时的查全率。
    • P-R曲线的阈值序列thresholds。该序列是一个递增序列,给出了判定为正例时的正类概率的阈值。

    参数:

    • y_true:真实的标记集合。
    • probas_pred:每个样本预测为正类的概率的集合。
    • pos_label:正类的类别标记。
    • sample_weight:样本权重,默认每个样本的权重为 1。

2.1.9 roc_curve

  1. roc_curve函数用于计算分类结果的ROC曲线。其原型为:

    返回值:一个元组,元组内的元素分别为:

    • ROC曲线的 序列。该序列是递增序列,序列第 i 个元素是当正类概率的判定阈值为 thresholds[i]时的假正例率。
    • ROC曲线的 序列。该序列是递增序列,序列第 i 个元素是当正类概率的判定阈值为 thresholds[i]时的真正例率。
    • ROC曲线的阈值序列thresholds。该序列是一个递减序列,给出了判定为正例时的正类概率的阈值。

    参数:

    • y_true:真实的标记集合。
    • y_score:每个样本预测为正类的概率的集合。
    • pos_label:正类的类别标记。
    • sample_weight:样本权重,默认每个样本的权重为 1。
    • drop_intermediate:一个布尔值。如果为True,则抛弃某些不可能出现在ROC曲线上的阈值。

2.1.10 roc_auc_score

  1. roc_auc_score函数用于计算分类结果的ROC曲线的面积AUC。其原型为:

    返回值:AUC值。

    参数:参考 roc_curve

2.2 回归问题性能度量

2.2.1 mean_absolute_error

  1. mean_absolute_error函数用于计算回归预测误差绝对值的均值(mean absolute error:MAE),其原型为:

    返回值:预测误差绝对值的均值。

    参数:

    • y_true:真实的标记集合。

    • y_pred:预测的标记集合。

    • multioutput:指定对于多输出变量的回归问题的误差类型。可以为:

      • 'raw_values':对每个输出变量,计算其误差 。
      • 'uniform_average':计算其所有输出变量的误差的平均值。
    • sample_weight:样本权重,默认每个样本的权重为 1。

2.2.2 mean_squared_error

  1. mean_squared_error函数用于计算回归预测误差平方的均值(mean square error:MSE),其原型为:

    返回值:预测误差的平方的平均值。

    参数:参考mean_absolute_error

三、验证曲线 && 学习曲线

3.1 验证曲线

  1. 验证曲线给出了estimator 因为某个超参数的不同取值在同一个测试集上预测性能曲线。

    它的作用是执行超参数调优。

  2. validation_curve 用于生成验证曲线,其原型为:

    返回值:返回一个元组,其元素依次为:

    • train_scores:学习器在训练集上的预测得分的序列(针对不同的参数值),是个二维数组。
    • test_scores:学习器在测试集上的预测得分的序列(针对不同的参数值),是个二维数组。

    因为对于每个固定的参数值, 折交叉会产生多个测试集,得到多个测试得分。

    参数:

    • estimator:一个学习器对象。它必须有.fit方法用于学习,.predict方法用于预测。
    • param_name:一个字符串,指定了学习器需要变化的参数。
    • param_range:一个序列,指定了param_name指定的参数的取值范围。
    • 其它参数参考cross_val_score

3.2 学习曲线

  1. 学习曲线给出了estimator 因为数据集大小的不同而导致的学习器在训练集和测试集上预测性能曲线。

    其作用是评估样本集大小的变化对学习器的性能的影响。

  2. learning_curve函数用于生成学习曲线,其原型为:

    返回值:返回一个元组,其元素依次为:

    • train_sizes_abs:考察数据集大小组成的序列。
    • train_scores:学习器在训练集上的预测得分的序列(针对不同的考察数据集),是个二维数组。
    • test_scores:学习器在测试集上的预测得分的序列(针对不同的考察数据集),是个二维数组。

    参数:

    • train_sizes:一个数组,给出了训练集的大小。

      • 如果元素为整数,则表示每个训练集的绝对大小。
      • 如果元素为浮点数,则表示每个训练集的相对大小。
    • exploit_incremental_learning:一个布尔值。如果estimator 支持增量学习,那么设置它为True

      此时该函数会使用增量学习来加速学习曲线的生成过程。

    • 其它参数参考validation_curve

四、超参数优化

4.1 GridSearchCV

  1. GridSearchCV用于实现超参数优化,其原型为:

    • estimator:一个学习器对象。它必须有.fit方法用于学习,.predict方法用于预测,有.score方法用于性能评分。

    • param_grid:字典或者字典的列表。每个字典都给出了学习器的一个超参数,其中:

      • 字典的键就是超参数名。
      • 字典的值是一个列表,指定了超参数对应的候选值序列。
    • fit_params:一个字典,用来给学习器的.fit方法传递参数。

    • iid:如果为True,则表示数据是独立同分布的。

    • refit:一个布尔值。如果为True,则在参数优化之后使用整个数据集来重新训练该最优的estimator

    • error_score:一个数值或者字符串'raise',指定当estimator训练发生异常时,如何处理:

      • 如果为'raise',则抛出异常。
      • 如果为数值,则将该数值作为本轮estimator的预测得分。
    • return_train_score: 一个布尔值,指示是否返回训练集的预测得分。

      如果为'warn',则等价于True 并抛出一个警告。

    • 其它参数参考cross_val_score

  2. 属性:

    • cv_results_:一个数组的字典。可以直接用于生成pandas DataFrame 。其中键为超参数名,值为超参数的数组。

      另外额外多了一些键:

      • mean_fit_timemean_score_timestd_fit_timestd_score_time:给出了训练时间、评估时间的均值和方差,单位为秒。
      • xx_score:给出了各种评估得分。
    • best_estimator_:一个学习器对象,代表了根据候选参数组合筛选出来的最佳的学习器。

      如果refit=False,则该属性不可用。

    • best_score_:最佳学习器的性能评分。

    • best_params_:最佳参数组合。

    • best_index_cv_results_中,第几组参数对应着最佳参数组合。

    • scorer_:评分函数。

    • n_splits_:交叉验证的 k 值。

  3. 方法:

    • fit(X[, y,groups]):执行参数优化。
    • predict(X) :使用学到的最佳学习器来预测数据。
    • predict_log_proba(X) :使用学到的最佳学习器来预测数据为各类别的概率的对数值。
    • predict_proba(X) :使用学到的最佳学习器来预测数据为各类别的概率。
    • score(X[, y]) :通过给定的数据集来判断学到的最佳学习器的预测性能。
    • transform(X):对最佳学习器执行transform
    • inverse_transform(X):对最佳学习器执行逆 transform
    • decision_function(X):对最佳学习器调用决策函数。
  4. GridSearchCV实现了estimator.fit.score方法。这些方法内部会调用estimator的对应的方法。

    在调用GridSearchCV.fit方法时,首先会将训练集进行 折交叉,然后在每次划分的集合上进行多轮的训练和验证(每一轮都采用一种参数组合),然后调用最佳学习器的.fit 方法。

4.2 RandomizedSearchCV

  1. GridSearchCV采用的是暴力寻找的方法来寻找最优参数。当待优化的参数是离散的取值的时候,GridSearchCV能够顺利找出最优的参数。但是当待优化的参数是连续取值的时候,暴力寻找就有心无力。

    GridSearchCV的做法是从这些连续值中挑选几个值作为代表,从而在这些代表中挑选出最佳的参数。

  2. RandomizedSearchCV采用随机搜索所有的候选参数对的方法来寻找最优的参数组合。其原型为:

    • param_distributions:字典或者字典的列表。每个字典都给出了学习器的一个参数,其中:

      • 字典的键就是参数名。

      • 字典的值是一个分布类,分布类必须提供.rvs方法。

        通常你可以使用scipy.stats模块中提供的分布类,比如scipy.expon(指数分布)、scipy.gamma(gamma分布)、scipy.uniform(均匀分布)、randint等等。

      • 字典的值也可以是一个数值序列,此时就在该序列中均匀采样。

    • n_iter:一个整数,指定每个参数采样的数量。通常该值越大,参数优化的效果越好。但是参数越大,运行时间也更长。

    • 其它参数参考GridSearchCV

  3. 属性:参考GridSearchCV

  4. 方法:参考GridSearchCV