全部版块 我的主页
论坛 数据科学与人工智能 数据分析与数据科学 SAS专版
4980 8
2009-06-05

在SAS/EM里,目标属性的target profile里定义了loss matrix,目标选的是minimize loss

在regression模块里,用的是logistic regression,criteria选的是profit/loss,

模型运行后,得到的train/validation/test的total loss,与我自己根据错误分类矩阵(混淆矩阵)计算出的total loss不同,这是怎么回事?

顺便请问下SAS是怎么计算total loss的?

谢谢啊~~谢谢~~~

[此贴子已经被作者于2009-6-5 19:25:28编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

全部回复
2009-6-5 17:28:00

没有过EM的人都不知道你在说什么。我不知道你是怎么玩的,但是可以告诉你SAS的收益成本矩阵都是自己定义的,默认的cutoff是0.5。而这个收益成本矩阵的定义有分两种:一种是平均收益成本矩阵,还有一种是个体收益成本矩阵,一般后者操作非常困难,前者操作也是和具体的业务联系在一起的。不是在玩数字游戏。所以如果你没有历史数据做支撑来确保你的收益成本矩阵的正确性,我还是劝你最好取0.5,也就是EM的默认值。还有,你自己对误分类矩阵的total loss又是怎么计算的?

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-5 19:55:00
以下是引用nkwilling在2009-6-5 17:28:00的发言:

没有过EM的人都不知道你在说什么。我不知道你是怎么玩的,但是可以告诉你SAS的收益成本矩阵都是自己定义的,默认的cutoff是0.5。而这个收益成本矩阵的定义有分两种:一种是平均收益成本矩阵,还有一种是个体收益成本矩阵,一般后者操作非常困难,前者操作也是和具体的业务联系在一起的。不是在玩数字游戏。所以如果你没有历史数据做支撑来确保你的收益成本矩阵的正确性,我还是劝你最好取0.5,也就是EM的默认值。还有,你自己对误分类矩阵的total loss又是怎么计算的?


有点没看懂~~

我主要就是想比较下不同错误代价下的分类结果,对假正(false positive)和假负(false negative)错误定义不同的loss,而对真正(true positive)和真负(true negative)的loss为0。计算total loss的时候,就是对 每类错误个数乘以此类错误的代价 求和。

还有就是发现,对假正和假负定义其它代价后,逻辑回归分类结果差不多,cutoff还是50%,不知道为什么会这样?我觉得应该代价更高的错误更少发生~~

谢谢~~~

[此贴子已经被作者于2009-6-5 19:58:24编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-5 21:37:00

你可能还没有搞清误分类矩阵和收益成本矩阵之间的关系:

1.误分类矩阵是评价建模的效果一种方法,还有C统计量;HL等评价方法。与误分类矩阵对应的就是LIFT图或者ROC图,这些都是等价的。但是在商业实践中,我们做logistic分析时都是用C统计量和lift图。很少用误分类矩阵。

2.收益成本矩阵(也就是你说的代价)是用来做决策用的,也就是说,根据收益成本矩阵,有如下公式E(收益|预测为1)=P*收益-(1-P)*成本,令期望E=0,得到cutoff,只要P>cutoff的所有预测概率,都决策为1,反之为0.SAS默认的cutoff为0.5,也就是说,P>=0.5决策为1,反之为0,这就是为什么我们在运行SAS代码output结果集中只要是概率大于等于0.5对应的预测值都是1的原因。

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-6 09:46:00

恩,谢谢~

那请问下~以下在sas中,怎么实现呢?

我主要就是想比较下不同错误代价下的分类结果,对假正(false positive)和假负(false negative)错误定义不同的loss,而对真正(true positive)和真负(true negative)的loss为0。计算total loss的时候,就是对 每类错误个数乘以此类错误的代价 求和。

谢谢啊~~ 

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

2009-6-6 12:56:00

昨晚把以前的代码整理了一下,你参考一下:


data Remission;
      input remiss cell smear infil li blast temp;
      label remiss='Complete Remission';
      datalines;
   1   .8   .83  .66  1.9  1.1     .996
   1   .9   .36  .32  1.4   .74    .992
   0   .8   .88  .7    .8   .176   .982
   0  1     .87  .87   .7  1.053   .986
   1   .9   .75  .68  1.3   .519   .98
   0  1     .65  .65   .6   .519   .982
   1   .95  .97  .92  1    1.23    .992
   0   .95  .87  .83  1.9  1.354  1.02
   0  1     .45  .45   .8   .322   .999
   0   .95  .36  .34   .5  0      1.038
   0   .85  .39  .33   .7   .279   .988
   0   .7   .76  .53  1.2   .146   .982
   0   .8   .46  .37   .4   .38   1.006
   0   .2   .39  .08   .8   .114   .99
   0  1     .9   .9   1.1  1.037   .99
   1  1     .84  .84  1.9  2.064  1.02
   0   .65  .42  .27   .5   .114  1.014
   0  1     .75  .75  1    1.322  1.004
   0   .5   .44  .22   .6   .114   .99
   1  1     .63  .63  1.1  1.072   .986
   0  1     .33  .33   .4   .176  1.01
   0   .9   .93  .84   .6  1.591  1.02
   1  1     .58  .58  1     .531  1.002
   0   .95  .32  .3   1.6   .886   .988
   1  1     .6   .6   1.7   .964   .99
   1  1     .69  .69   .9   .398   .986
   0  1     .73  .73   .7   .398   .986
   ;
run;

%let pi1=.2;/*总体先验概率*/      

/* 计算样本的先验概率:*/

proc SQL noprint;
  select mean(remiss) into :rho1 from Remission;
quit;

%put &rho1;


%let selected =
cell smear infil li blast temp
;


/*1.全模型训练*/

ods listing close;
ods output bestsubsets=score;

proc logistic data=Remission des;
   model remiss=&selected
   / selection=SCORE best=2;
run;

ods listing;

proc print data=score(obs=12);
run;


/*2.全模型评估*/

proc sql noprint;
  select variablesinmodel into :inputs1 - :inputs99999
  from score;
  select NumberOfVariables into :ic1 - :ic99999
  from score;
quit;

%put &inputs1;
%put &ic1;

%let lastindx = &SQLOBS;


%let rho0 = %sysevalf(1-&rho1);
%let pi0 = %sysevalf(1-&pi1);

%put &rho0;
%put &pi0;

%let pf11 = 99; %let pf10 = 0;
%let pf01 = -1; %let pf00 = 0;
%let valf1=%sysevalf(&pi0/&rho0);
%let valf2=%sysevalf(&pi1/&rho1);

%put &valf1;
%put &valf2;

proc logistic data=Remission des;
  model remiss=&inputs1;
  score data=Remission
        out=scoredtrain(keep=remiss p_1 p_0)
        priorevent=&pi1;
run;

/*此宏为全模型训练和全模型评估,目的是求C统计量和总收益*/

proc sort data=scoredtrain;
  by descending p_1;
run;


data assess;
  retain sse 0 csum 0 ;

  /* 2 x 2 count array, or count matrix */
  array n[0:1,0:1] _temporary_ (0 0 0 0);
  /* sample weights array */
  array w[0:1] _temporary_ (&valf1 &valf2);

set scoredtrain end=last;
/* profit associated with each decision */
  d1=&PF11*p_1+&PF01*p_0;
  d0=&PF10*p_1+&PF00*p_0; 

/* T is a flag for response */
  t=(strip(remiss)="1");
/* D is the decision, based on profit. */
  d=(d1>d0);
 
/* update the count matrix, sse, and c */
  n[t,d] + w[t];

  n_td=n[t,d];
  n_1=n[0,0];
   n_2=n[0,1];
    n_3=n[1,0];
  n_4=n[1,1];

  w_1=w[0];
   w_2=w[1];

  sse + (remiss-p_1)**2;
  csum + ((n[1,1]+n[1,0])*(1-t)*w[0]);

  if last then do;
    INPUT_COUNT=&ic1;
    TOTAL_PROFIT = sum(&PF11*n[1,1],&PF10*n[1,0],&PF01*n[0,1],&PF00*n[0,0]);
    OVERALL_AVG_PROFIT = TOTAL_PROFIT/sum(n[0,0],n[1,0],n[0,1],n[1,1]);
    ASE = sse/sum(n[0,0],n[1,0],n[0,1],n[1,1]);
    C = csum/(sum(n[0,0],n[0,1])*sum(n[1,0],n[1,1]));

  end;
run;

自己慢慢体会吧。其中的TOTAL_PROFIT应该是你关心的。

[此贴子已经被作者于2009-6-6 13:08:40编辑过]

二维码

扫码加我 拉你入群

请注明:姓名-公司-职位

以便审核进群资格,未注明则拒绝

点击查看更多内容…
相关推荐
栏目导航
热门文章
推荐文章

说点什么

分享

扫码加好友,拉您进群
各岗位、行业、专业交流群