CROSS_VALIDATE

使用输入关系对学习算法执行 k-fold 交叉验证,并对超参数执行网格搜索。输出是所选算法的平均性能指标。该函数支持 SVM 分类、朴素贝叶斯和逻辑回归。

这是元函数。您必须在顶级 SELECT 语句中调用元函数。

行为类型

易变

语法

CROSS_VALIDATE ( 'algorithm', 'input‑relation', 'response‑column', 'predictor‑columns'
        [ USING PARAMETERS
              [exclude_columns = 'excluded‑columns']
           [, cv_model_name = 'model']
           [, cv_metrics = 'metrics']
           [, cv_fold_count = num‑folds]
           [, cv_hyperparams = 'hyperparams']
           [, cv_prediction_cutoff = prediction‑cutoff] ] )

参数

算法
算法训练函数的名称,为以下之一:
input‑relation
包含用于训练和测试的数据的表或视图。 如果输入关系在 Hive 中定义,请使用 SYNC_WITH_HCATALOG_SCHEMA 以同步 hcatalog 架构,然后运行机器学习功能。
response‑column
包含响应的输入列的名称。
predictor‑columns

输入关系中表示模型自变量的列的逗号分隔列表,或者使用星号 (*) 以选择所有列。如果选择所有列,则参数 exclude_columns 的实参列表必须包含 response‑column,以及任何无效的列作为预测工具列。

参数

exclude_columns
要从处理中排除来自 predictor‑columns 列的逗号分隔列表。
cv_model_name
允许您检索交叉验证过程结果的模型的名称。如果忽略此参数,则显示结果但不保存。如果将此参数设置为模型名称,则可以使用摘要函数 GET_MODEL_ATTRIBUTEGET_MODEL_SUMMARY 检索结果
cv_metrics
用于评估算法的指标,指定为指标名称的逗号分隔列表或 JSON 数组。在这两种情况下,您都需要指定以下一个或多个指标名称:
  • accuracy (默认值)

  • error_rate

  • TP:真阳性,预测为 1 类的 1 类案例数

  • FP:假阳性,预测为 1 类的 0 类案例数

  • TN:真阴性,预测为 0 类的 0 类案例数

  • FN:假阴性,预测 0 类的 1 类案例数

  • TPRrecall:真阳性率,1 类中的正确预测

  • FPR:假阳性率,0 类中的错误预测

  • TNR:真阴性率,0 类中的正确预测

  • FNR:假阴性率,1 类中的错误预测

  • PPVprecision:阳性预测值,预测为 1 类案例中的正确预测

  • NPV:阴性预测值,预测为 0 类案例中的正确预测

  • MSE:均方误差

     ![](/images/machine-learning/mean-squared-error.png)
    
  • MAE:平均绝对误差

     ![](/images/machine-learning/mean-absolute-error.png)
    
  • rsquared:决定系数

     ![](/images/machine-learning/rsquared.png)
    
  • explained_variance

    ![](/images/machine-learning/explained-variance.png)
    
  • fscore

    (1 + beta˄2) * precison * recall / (beta˄2 * precision + recall)
    

    beta 默认等于 1

  • auc_roc:使用指定数量 bin 的 ROC 的 AUC,默认为 100

  • auc_prc:使用指定数量 bin 的 PRC 的 AUC,默认为 100

  • counts:解析为其他四个指标的快捷方式:TPFPTNFN

  • count:仅在 JSON 语法中有效,计算由一个类 (case-class-label) 标记但预测为另一类 (predicted-class-label) 的案例数:

    cv_metrics='[{"count":[case-class-label, predicted-class-label]}]'
    
cv_fold_count
拆分数据的折叠数。

默认值: 5

cv_hyperparams
JSON 字符串,描述用于超参数网格搜索的参数组合。JSON 字符串包含成对的超参数名称。每个超参数的值可以指定为数组或序列。例如:
{"param1":[value1,value2,...], "param2":{"first":first_value, "step":step_size, "count":number_of_values} }

应使用 JSON 标准引用超参数名称和字符串值。这些参数被传递给训练函数。

cv_prediction_cutoff
传递给逻辑回归预测阶段的临界阈值,介于 0 和 1(不含)之间的 FLOAT

默认值: 0.5

模型属性

call_string
在调用 CROSS_VALIDATE 时指定的所有输入实参的值。
run_average
参数 cv_metrics 中指定的所有指标的所有折叠的平均值(如果指定);否则为平均精度。
fold_info
每个折叠的行数:
  • fold_id:折叠的索引。

  • row_count:折叠中为测试而保留的行数。

counters
该函数的所有计数器,包括:
  • accepted_row_countinput_relation 中的总行数减去拒绝的行数。

  • rejected_row_count:因包含无效值而跳过的 input_relation 行数。

  • feature_count:输入到机器学习模型的特征数量。

run_details
有关每次运行的信息,其中运行意味着训练一个模型,然后在一个保留的折叠上测试该模型:
  • fold_id:保留用于测试的折叠的索引。

  • iteration_count:在非保留折叠的模型训练中使用的迭代数。

  • accuracy:参数 cv_metrics 中指定的所有指标,或精度(如果未提供 cv_metrics)。

  • error_rate:参数 cv_metrics 中指定的所有指标,或精度(如果忽略该参数)。

特权

非超级用户:

  • 对输入关系的 SELECT 权限

  • 机器学习算法在其中生成模型的默认架构的 CREATE 和 USAGE 权限。如果提供了 cv_model_name,则交叉验证结果将作为模型保存在同一架构中。

在 JSON 中指定指标

参数 cv_metrics 可以将指标指定为 JSON 对象 的数组,其中每个对象指定一个指标名称。例如,以下表达式将 cv_metrics 设置为指定为 JSON 对象的两个指标,即 accuracyerror_rate

cv_metrics='["accuracy", "error_rate"]'

在下一个示例中,cv_metrics 设置为两个指标,即 accuracyTPR(真阳性率)。此处,TPR 指标被指定为一个 JSON 对象,它接受一个包含两个类标签实参(即 2 和 3)的数组:

cv_metrics='[ "accuracy", {"TPR":[2,3] } ]'

指定为 JSON 对象的指标可以接受参数。在以下示例中,fscore 指标指定参数 beta,该参数设置为 0.5:

cv_metrics='[ {"fscore":{"beta":0.5} } ]'

参数支持对于某些指标特别有用。例如,指标 auc_rocauc_prc 构建一条曲线,然后计算该曲线下的面积。对于 ROC,曲线是通过绘制指标 TPRFPR 而成的;对于 PRC,通过绘制指标 PPV (precision) 与 TPR (recall) 而成。通过将参数 num_bins 设置为大于默认值 100 的值,可以提高此类曲线的精度。例如,以下表达式计算使用 1000 个 bin 构建的 ROC 曲线的 AUC:

cv_metrics='[{"auc_roc":{"num_bins":1000}}]'

将指标用于多类分类器函数

所有支持的指标均为二元分类器函数 LOGISTIC_REGSVM_CLASSIFIER 而定义。对于 NAIVE_BAYES 等多类分类器函数,可以针对每个 one-versus-the-rest 二元分类器计算这些指标。使用实参请求每个分类器的指标。例如,如果训练数据具有整数类标签,您可以使用 precision (PPV) 指标设置 cv_metrics,如下所示:

cv_metrics='[{"precision":[0,4]}]'

此设置指定返回为两个分类器计算精度的两列:

  • 第 1 列:对 0 与非 0 进行分类

  • 第 2 列:对 4 与非 4 进行分类

如果忽略类标签实参,则使用索引为 1 的类。不是为单个 one-versus-the-rest 分类器计算指标,而是以下列方式之一计算平均值:macromicroweighted(默认)。例如,以下 cv_metrics 设置返回按类大小加权的平均值:

cv_metrics='[{"precision":{"avg":"weighted"}}]'

可以采用类似方式为多类分类器定义 AUC 类型的指标。例如,以下 cv_metrics 设置计算每个 one-versus-the-rest 分类器的 ROC 曲线下面积,然后返回按类大小加权的平均值。

cv_metrics='[{"auc_roc":{"avg":"weighted", "num_bins":1000}}]'

示例

=> SELECT CROSS_VALIDATE('svm_classifier', 'mtcars', 'am', 'mpg'
      USING PARAMETERS cv_fold_count= 6,
                       cv_hyperparams='{"C":[1,5]}',
                       cv_model_name='cv_svm',
                       cv_metrics='accuracy, error_rate');
         CROSS_VALIDATE
----------------------------
 Finished

===========
run_average
===========
C  |accuracy      |error_rate
---+--------------+----------
1 | 0.75556       |  0.24444
5 | 0.78333       |  0.21667
(1 row)