该文档涉及的组件

带约束的线性回归训练 (ConstrainedLinearRegTrainBatchOp)

Java 类名:com.alibaba.alink.operator.batch.finance.ConstrainedLinearRegTrainBatchOp

Python 类名:ConstrainedLinearRegTrainBatchOp

功能介绍

  • 带约束的线性回归是一个回归算法
  • 和线性回归组件一样,带约束的线性回归支持稀疏、稠密两种数据格式
  • 和线性回归组件一样,带约束的线性回归支持带样本权重的训练

参数说明

名称 中文名称 描述 类型 是否必须? 取值范围 默认值
labelCol 标签列名 输入表中的标签列名 String ✓
constOptimMethod 优化方法 求解优化问题时选择的优化方法 String “SQP”, “Barrier”, “LBFGS”, “Newton”, “ALM” “SQP”
constraint 约束 约束 String ""
epsilon 收敛阈值 迭代方法的终止判断阈值,默认值为 1.0e-6 Double x >= 0.0 1.0E-6
featureCols 特征列名数组 特征列名数组,默认全选 String[] 所选列类型为 [BIGDECIMAL, BIGINTEGER, BYTE, DOUBLE, FLOAT, INTEGER, LONG, SHORT] null
l1 L1 正则化系数 L1 正则化系数,默认为0。 Double x >= 0.0 0.0
l2 L2 正则化系数 L2 正则化系数,默认为0。 Double x >= 0.0 0.0
maxIter 最大迭代步数 最大迭代步数,默认为 100 Integer x >= 1 100
standardization 是否正则化 是否对训练数据做正则化,默认true Boolean true
vectorCol 向量列名 向量列对应的列名,默认值是null String 所选列类型为 [DENSE_VECTOR, SPARSE_VECTOR, STRING, VECTOR] null
weightCol 权重列名 权重列对应的列名 String 所选列类型为 [BIGDECIMAL, BIGINTEGER, BYTE, DOUBLE, FLOAT, INTEGER, LONG, SHORT] null
withIntercept 是否有常数项 是否有常数项,默认true Boolean true

约束说明

约束有larger than value, larger than feature, less than value, less than feature, equal to feature, scale to feature这六种形式。

约束由ConstraintBetweenFeatures类控制,写完ConstraintBetweenFeatures实例以后存放于FeatureConstraint中。

约束可以通过constraint参数传入,也可以在linkFrom中通过表传入。但推荐直接通过constraint参数传入。

约束以如下格式传入,下面表示约束的意义为:

第2列的上界为7;第1列下界为3;第1列和第6列相等;第3列是第4列的7倍;第4列小于等于第5列;第5列大于等于第6列。

{“featureConstraint”:[],“constraintBetweenFeatures”:{“name”:“constraintBetweenFeatures”,“UP”:2,7.0,“LO”:1,3.0,“=”:[1,6],“%”:[3,4,7.0],“<”:[4,5],“>”:[5,6]}}

如果想通过feature colName的方式来表示约束,则以如下形式:

以下表示的是f1列下界是0,1.814,f1列大于等于f0列。

{“featureConstraint”:[],“constraintBetweenFeatures”:{“name”:“constraintBetweenFeatures”,“UP”:[],“LO”:"f1",0,1.814,“=”:[],“%”:[],“<”:"f0",0,"f1",0,“>”:[]}}

代码示例

Python 代码

from pyalink.alink import *

import pandas as pd

useLocalEnv(1)

df = pd.DataFrame([
    ["1.0 7.0 9.0", 16.8],
    ["1.0 3.0 3.0", 6.7],
    ["1.0 2.0 4.0", 6.9],
    ["1.0 3.0 4.0", 8.0]
])

data = BatchOperator.fromDataframe(df, schemaStr="vec string, label double")

constraint = pd.DataFrame([
        ['{"featureConstraint":[],"constraintBetweenFeatures":{"name":"constraintBetweenFeatures","UP":[],"LO":[],"=":[[1,1.814],[2,0.4]],"%":[],"<":[],">":[[1,2]]},"countZero":null,"elseNullSave":null}']
])
constraintData = BatchOperator.fromDataframe(constraint, schemaStr='data string')

batchOp = ConstrainedLinearRegTrainBatchOp()\
    .setWithIntercept(True)\
    .setVectorCol("vec")\
    .setConstOptimMethod("barrier")\
    .setLabelCol("label")

model = batchOp.linkFrom(data, constraintData)

predict = LinearRegPredictBatchOp()\
    .setPredictionCol("pred")
    
predict.linkFrom(model, data).print()

运行结果

vec label pred
1.0 7.0 9.0 16.8 17.15
1.0 3.0 3.0 6.7 8.45
1.0 2.0 4.0 6.9 4.90
1.0 3.0 4.0 8.0 7.90