如何使用SAS或SQL计算以数据库格式存储的预测模型方程的输出

时间:2016-07-04 21:49:01

标签: sql model sas

对于这个例子,我不介意它是使用SAS还是任何SQL语言解决的

我想要做的是生产模型方程式,以便我可以动态计算预测

我有一个查找,它存储所有模型方程式

对于这个例子我们可以假设公式总是截距+ coef1 * var1 + coef2 * var2等

model   coef    variable
churn   0.8 intercept
churn   0.5 var1
churn   -0.2    var2
churn   0.2 var3
然后,我为每个客户提供了一个非规范化变量表,即

customer_id var1    var2    var3
a   3   2   4
b   5   1   2
c   2   4   5

我想要的输出是每个客户的公式预测 即对于客户a:

The output would be the result of 0.8 + 0.5*3 + -0.2*2 + 0.2*4

将此模型信息存储在数据库中的最佳方法是什么,对于我的动态计算,我是否需要规范化客户表以便我可以直接加入每个变量?

1 个答案:

答案 0 :(得分:1)

如果您在SAS中的SQL中执行此操作,那么规范化客户数据肯定会更容易。如果您在SQL Server中执行此操作,则可以使用pivot来使事情朝着相同的方向发展。

在基础SAS中,我会做相反的事情。两个选项:PROC SCORE或简单的数据步骤。

PROC SCORE真正用于此目的。无论哪种方式,您都需要将标准化模型数据PROC TRANSPOSE分成一行,如果您正在执行数据步骤版本,请确保使用prefix选项添加前缀(例如model_var1等。 ),然后执行以下操作之一:

data model;
  input model $ coef variable :$10.;
  datalines;
churn   0.8 intercept
churn   0.5 var1
churn   -0.2    var2
churn   0.2 var3
;;;;
run;

data have;
input customer_id $ var1    var2    var3;
datalines;
a   3   2   4
b   5   1   2
c   2   4   5
;;;;
run;

proc transpose data=model out=model_score;
  id variable;
  by model;
run;


data model_score_fin;
  set model_score;
  drop _name_;
  rename
    model = _model_;
  _type_ = 'PARMS';
run;


proc score data=have out=want_score score=model_score_fin type=parms predict  nostd;
  var var1 var2 var3;
run;

proc transpose data=model out=model_t prefix=model_;
id variable;
where model="churn";
run;

data want;
  if _n_=1 then set model_t;
  set have;
  array models model_var:;
  array vars var:;
  result = model_intercept;
  do _i = 1 to dim(vars);
    result = sum(result,models[_i]*vars[_i]);
  end;
run;

最后,如果您有SAS IML,则可以通过转置(如上所述或使用IML转置运算符)轻松完成此操作,然后使用矩阵乘法。