对于这个例子,我不介意它是使用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
将此模型信息存储在数据库中的最佳方法是什么,对于我的动态计算,我是否需要规范化客户表以便我可以直接加入每个变量?
答案 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
转置运算符)轻松完成此操作,然后使用矩阵乘法。