Redshift创建线性回归模型报错:numeric类型列不支持作为TARGET
AWS Redshift CREATE MODEL报错:numeric类型列不支持作为TARGET/RETURN的解决方法
问题描述
执行以下CREATE MODEL语句创建线性回归模型时,报错ERROR: numeric column type is not supported by CREATE MODEL as TARGET / RETURN:
CREATE MODEL CostRegressionModel FROM ( SELECT age, sex, bmi, children, smoker, region, charges as target_label FROM "dev"."public"."payout_training") TARGET target_label FUNCTION CostRegression IAM_ROLE 'arn:aws:iam::070649885991:role/LabRole' MODEL_TYPE LINEAR_LEARNER PROBLEM_TYPE REGRESSION OBJECTIVE 'MSE' SETTINGS( S3_BUCKET 'acmemlout', MAX_RUNTIME 15000 );
目标列charges的类型为numeric(10,2),数据表定义如下:
CREATE TABLE public.payout_training ( id bigint ENCODE az64, age integer ENCODE az64, sex character varying(256) ENCODE lzo, bmi numeric(10, 2) ENCODE az64, children integer ENCODE az64, smoker character varying(256) ENCODE lzo, region character varying(256) ENCODE lzo, charges numeric(10, 2) ENCODE az64 ) DISTSTYLE AUTO;
问题成因
Redshift的CREATE MODEL功能底层依赖AWS SageMaker服务,而SageMaker的Linear Learner算法不支持Redshift的numeric类型作为回归任务的目标变量。虽然Redshift官方文档未明确标注这一限制,但实际数据导出到S3供SageMaker训练时,numeric类型无法被Linear Learner正确解析。
解决方法
方法1:在查询中转换目标列类型
在创建模型的SELECT语句里,将目标列charges转换为DOUBLE PRECISION类型(SageMaker支持的浮点类型):
CREATE MODEL CostRegressionModel FROM ( SELECT age, sex, bmi, children, smoker, region, CAST(charges AS DOUBLE PRECISION) as target_label FROM "dev"."public"."payout_training") TARGET target_label FUNCTION CostRegression IAM_ROLE 'arn:aws:iam::070649885991:role/LabRole' MODEL_TYPE LINEAR_LEARNER PROBLEM_TYPE REGRESSION OBJECTIVE 'MSE' SETTINGS( S3_BUCKET 'acmemlout', MAX_RUNTIME 15000 );
方法2:修改原表列类型(可选)
如果允许修改原表结构,可以直接将charges列的类型改为DOUBLE PRECISION:
ALTER TABLE public.payout_training ALTER COLUMN charges TYPE DOUBLE PRECISION;
修改完成后,原CREATE MODEL语句即可正常执行。
内容的提问来源于stack exchange,提问作者MrMadium
相关产品推荐
相关产品推荐

