BigQuery ML Standard Scaler“无法计算均值”

时间:2020-08-20 13:08:26

标签: sql google-cloud-platform google-bigquery

尝试使用BigQuery ML建立逻辑回归时,出现以下错误:

由于相应列'x'中的条目均为NULL,因此无法计算均值。

这是一个可重复的查询-确保更改数据集名称:

CREATE MODEL `samples.TEST_MODELS_001`
TRANSFORM (
    flag,
split_col,
ML.standard_scaler(SAFE_CAST(x as FLOAT64)) OVER() as x
)
OPTIONS
  ( MODEL_TYPE='LOGISTIC_REG',
    AUTO_CLASS_WEIGHTS=TRUE,
    INPUT_LABEL_COLS=['flag'],
    EARLY_STOP=true,
    DATA_SPLIT_METHOD='CUSTOM',
    DATA_SPLIT_COL='split_col',
    L2_REG = 0.3) AS
SELECT
    *
    ,train_test_split = 0 as split_col
FROM (
  select
    0 as train_test_split, 1 as flag, "" as x
   union all
   select 0, 0, "0"
   union all
   select 0, 1, "1"
   union all
   select 1, 1, ""
   union all
   select 1, 0, ""
   union all
   select 1, 1, "1"
)

问题似乎与缩放有关,因为如果我使用ML.MIN_MAX_SCALER而不是ML.STANDARD_SCALER,它将按预期工作。不确定为什么会发生这种情况,因为显然不是所有x的值都在训练测试拆分组中NULLs

我想知道这是否是一个错误,或者我在这里做错了什么。

1 个答案:

答案 0 :(得分:0)

如果在TRANSFORM之外使用ML.STANDARD_SCALER函数,它将正确返回结果。根据此功能上的documentation

在TRANSFORM子句中使用此变量时,为标准化表达式而计算的STDDEV和MEAN将自动用于预测。

这意味着它必须计算MEAN和STDDEV才能将结果放在第一位,因此看来应该可以。

我将其报告为BigQuery问题here。我建议订阅问题跟踪程序,以便在BigQuery团队进行更新时接收通知。

更新

这在issue tracker中得到了回答。

分割后,将ML.STANDARD_SCALER函数应用于训练数据。这意味着适用的正确SQL如下:

-- training data: 1, null, null

select  ml.standard_scaler(x) over() from (select 1 as x)
union all select null as x
union all select null as x

-- Result:
-- null
-- null
-- null

这就是为什么消息中提到空列的原因。通过将一个记录添加到训练数据的x列的“ 0”值中,您可以进一步看到这种情况。

CREATE MODEL `samples.TEST_MODELS_001`
TRANSFORM (
    flag,
split_col,
ML.standard_scaler(SAFE_CAST(x as FLOAT64)) OVER() as x
)
OPTIONS
  ( MODEL_TYPE='LOGISTIC_REG',
    AUTO_CLASS_WEIGHTS=TRUE,
    INPUT_LABEL_COLS=['flag'],
    EARLY_STOP=true,
    DATA_SPLIT_METHOD='CUSTOM',
    DATA_SPLIT_COL='split_col',
    L2_REG = 0.3) AS
SELECT
    *
    ,train_test_split = 0 as split_col
FROM (
  select
    0 as train_test_split, 1 as flag, "" as x
   union all
   select 0, 0, "0"
   union all
   select 0, 1, "1"
   union all
   select 1, 1, ""
   union all
   select 1, 0, ""
   union all
   select 1, 1, "1"
   union all
   select 1, 1, "0"
)
相关问题