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_ATTRIBUTE
和GET_MODEL_SUMMARY
检索结果 -
cv_metrics
- 用于评估算法的指标,指定为指标名称的逗号分隔列表或 JSON 数组。在这两种情况下,您都需要指定以下一个或多个指标名称:
-
accuracy
(默认值) -
error_rate
-
TP
:真阳性,预测为 1 类的 1 类案例数 -
FP
:假阳性,预测为 1 类的 0 类案例数 -
TN
:真阴性,预测为 0 类的 0 类案例数 -
FN
:假阴性,预测 0 类的 1 类案例数 -
TPR
或recall
:真阳性率,1 类中的正确预测 -
FPR
:假阳性率,0 类中的错误预测 -
TNR
:真阴性率,0 类中的正确预测 -
FNR
:假阴性率,1 类中的错误预测 -
PPV
或precision
:阳性预测值,预测为 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
:解析为其他四个指标的快捷方式:TP
、FP
、TN
和FN
-
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_count
:input_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 对象的两个指标,即 accuracy
和 error_rate
:
cv_metrics='["accuracy", "error_rate"]'
在下一个示例中,cv_metrics
设置为两个指标,即 accuracy
和 TPR
(真阳性率)。此处,TPR
指标被指定为一个 JSON 对象,它接受一个包含两个类标签实参(即 2 和 3)的数组:
cv_metrics='[ "accuracy", {"TPR":[2,3] } ]'
指定为 JSON 对象的指标可以接受参数。在以下示例中,fscore
指标指定参数 beta
,该参数设置为 0.5:
cv_metrics='[ {"fscore":{"beta":0.5} } ]'
参数支持对于某些指标特别有用。例如,指标 auc_roc
和 auc_prc
构建一条曲线,然后计算该曲线下的面积。对于 ROC
,曲线是通过绘制指标 TPR
与 FPR
而成的;对于 PRC
,通过绘制指标 PPV
(precision
) 与 TPR
(recall
) 而成。通过将参数 num_bins
设置为大于默认值 100 的值,可以提高此类曲线的精度。例如,以下表达式计算使用 1000 个 bin 构建的 ROC 曲线的 AUC:
cv_metrics='[{"auc_roc":{"num_bins":1000}}]'
将指标用于多类分类器函数
所有支持的指标均为二元分类器函数
LOGISTIC_REG
和
SVM_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 分类器计算指标,而是以下列方式之一计算平均值:macro
、micro
或 weighted
(默认)。例如,以下 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)