加载中…
个人资料
supersasmacro
supersasmacro
  • 博客等级:
  • 博客积分:0
  • 博客访问:6,212
  • 关注人气:503
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

SAS EM:Data Partition node(数据拆分节点)

(2010-07-14 19:10:38)
标签:

sas

em

data

partition

node

数据拆分

节点

教育

分类: 企业数据挖掘EM
SAS EM:Data Partition node(数据拆分节点)

SAS EM(Enterprise Miner)企业数据挖掘节点功能详解及代码实现(第二弹)

本文未经作者允许,请勿转载

Data Partition node(数据拆分节点)允许用户拆分数据做为训练、验证及测试等目的。拆分数据有助于加速模块开发。此外数据拆分也提供相互独立的数据做为交叉验证和模块评估之用。主要以简单、分层随机或自定义的抽样为基础。在做完抽样之后,你可以对将资料拆分成几个互斥的子集合,使用互斥的集合可使得评估模式更为精确。在这边可设定的参数,除了抽样方法、样本大小和随机数种子之外,必须分别决定训练、验证和测试集合所占的比例。
 http://s9/middle/5d3b177cg8b570e539ab8&690EM:Data Partition node(数据拆分节点)" TITLE="SAS EM:Data Partition node(数据拆分节点)" />

SAS EM提供了三种数据拆分的方式,主要有简单随机数据拆分,层次数据拆分以及用户自定义的数据拆分:
数据拆分(Data Partition),将数据集按照40%,30%和30%的比例拆分成相互独立的数据集,训练集、验证集和测试集。训练集用于拟合可供选择的模型,验证集用于选择合适的模型,测试集用于对模型效果进行评估测试。
1 简单随机数据拆分(Simple Random)
随机地将数据分到三个数据集中。
 http://s5/middle/5d3b177cg8b570f5887f4&690EM:Data Partition node(数据拆分节点)" TITLE="SAS EM:Data Partition node(数据拆分节点)" />

代码如下:
*先得到EM数据集;
data EMDATA.VIEW_4O9 / view=EMDATA.VIEW_4O9;
 set EMSAMPLE.BUYTEST;
run;
* 设置随机种子为 12345;
%let seed = 12345; 

* 随机拆分,得到三个数据集
data EMDATA.TRNAB45E 
     EMDATA.VALN980S 
     EMDATA.TSTJIB82; 
     drop _c00: _partseed; 
 set EMDATA.VIEW_4O9; 
     _partseed = ranuni(12345); 
**这里,因为SAS EM已经得到原始数据集为10000个,并且三个要得到的数据集的大小分别是40%:30%:30%,因此,这里直接就用4000,3000,3000来进行计算。我们写代码的时候,得先确定样本的总数,然后再将这个总数作为参数写入代码中;
     if (10000 +1-_n_)*_partseed <= (4000 - _c000001) then do; 
        _c000001 + 1; 
        output EMDATA.TRNAB45E; 
     end; 
     else if (10000 +1-_n_)*_partseed <= (4000 - _c000001 + 3000 - _c000002) then do;
        _c000002 + 1; 
        output EMDATA.VALN980S; 
     end; 
     else do; 
        _c000003 + 1; 
        output EMDATA.TSTJIB82; 
     end; 
run;


2 层次数据拆分(Stratitied Partition)
层次数据拆分,就是按照某一个变量进行分层,每个层的数据再进行数据拆分。例如:
 http://s13/middle/5d3b177cg8b5711213a5c&690EM:Data Partition node(数据拆分节点)" TITLE="SAS EM:Data Partition node(数据拆分节点)" />

这里,我们对sex这个变量进行层次数据拆分
 http://s3/middle/5d3b177cg8b571238e152&690EM:Data Partition node(数据拆分节点)" TITLE="SAS EM:Data Partition node(数据拆分节点)" />

代码如下:
*首先查看sex这个变量各个值的样本数;
proc freq data=EMDATA.VIEW_4O9; 
     format SEX $1.; 
     table SEX /out=EMPROJ._FRQKJRU(drop=percent); 
run;
 
proc sort data=EMPROJ._FRQKJRU; 
     by descending count; 
run; 

**查看每个值的样本数是否大于3,如果小于3,则层次拆分无意义,故删除。这些值都可以自己设置;
data EMPROJ._FRQV3ZL(keep=count); 
 set EMPROJ._FRQKJRU; 
     where (.01 * 40 * count) >= 3; 
run;

*开始层次拆分:这里,通过上面的freq过程步,我们就已经知道了sex的各个值的样本数,然后EM会计算出有多少个样本会拆分到三个数据集中;
即:最终结果: 

性别

总体

训练集(40%)

验证集(30%)

测试集(30%)

(F)

4489

1796

1347

1347

(M)

5277

2111

1583

1583

缺失

234

94

70

70

以下的代码就是根据上表来生成的。这里,我们在写代码的时候,可以根据参数来实现。
%let seed = 12345; 
data EMDATA.TRNAB45E 
     EMDATA.VALN980S 
     EMDATA.TSTJIB82; 
     drop _c00: _partseed; 
 set EMDATA.VIEW_4O9; 
     length _Pformat1 $200; 
     drop _Pformat1; 
     _Pformat1 = trim(left(put(SEX,$1.))); 
     if _Pformat1 = 'M' then do; 
        _partseed = ranuni(12345); 
        if (5277 +1-_c000004)*_partseed <= (2111 - _c000001) then do;  
           _c000001 + 1; 
           output EMDATA.TRN986YZ; **男,训练集;
        end; 
        else if (5277 +1-_c000004)*_partseed <= (2111 - _c000001 + 1583 - _c000002) then do;
           _c000002 + 1;  
           output EMDATA.VALQDIJU; **男,验证集;
        end; 
        else do; 
           _c000003 + 1; 
           output EMDATA.TSTQDKTQ; **男,测试集;
        end; 
        _c000004+1; 
     end; 
     else if _Pformat1 = 'F' then do; 
        _partseed = ranuni(12345); 
        if (4489 +1-_c000008)*_partseed <= (1796 - _c000005) then do; 
           _c000005 + 1; 
           output EMDATA.TRN986YZ; **女,训练集;
        end; 
        else if (4489 +1-_c000008)*_partseed <= (1796 - _c000005 + 1347 - _c000006) then do;
           _c000006 + 1; 
           output EMDATA.VALQDIJU; **女,验证集;
        end; 
        else do; 
           _c000007 + 1; 
           output EMDATA.TSTQDKTQ; **女,测试集;
        end; 
        _c000008+1; 
     end; 
     else if _Pformat1 = '' then do; 
        _partseed = ranuni(12345); 
        if (234 +1-_c000012)*_partseed <= (94 - _c000009) then do; 
           _c000009 + 1; 
           output EMDATA.TRN986YZ; **sex为缺失,训练集;
        end; 
        else if (234 +1-_c000012)*_partseed <= (94 - _c000009 + 70 - _c000010) then do; 
           _c000010 + 1; 
           output EMDATA.VALQDIJU; **sex为缺失,验证集;
        end; 
        else do; 
           _c000011 + 1; 
           output EMDATA.TSTQDKTQ; **sex为缺失,测试集;
        end; 
        _c000012+1; 
     end; 
run;
 

3 用户自定义数据拆分(USER DEFINDED)
用户自定义数据拆分可以根据不同的变量,这些变量的不同的值进行拆分。
 http://s1/middle/5d3b177cg8b57158870c0&690EM:Data Partition node(数据拆分节点)" TITLE="SAS EM:Data Partition node(数据拆分节点)" />

例如:我们根据BUY12这个变量的值进行拆分,其中,当BUY12=0时,为训练集,当BUY12=1时,为验证集,当BUY12=2时,为测试集。
 http://s14/middle/5d3b177cg8b57168dc5ad&690EM:Data Partition node(数据拆分节点)" TITLE="SAS EM:Data Partition node(数据拆分节点)" />

代码如下:
**当BUY12=0时,创建训练集;
proc sql; 
  create view EMDATA.TRNAB45E as 
    select * 
    from EMDATA.VIEW_4O9 
    where trim(left(put(BUY12,BEST12.))) = '0'; 
quit;
**当BUY12=1时,创建验证集;
proc sql; 
  create view EMDATA.VALN980S as 
    select * 
    from EMDATA.VIEW_4O9 
    where trim(left(put(BUY12,BEST12.))) = '1'; 
quit;
**当BUY12=2时,创建测试集;
proc sql; 
  create view EMDATA.TSTJIB82 as 
    select * 
    from EMDATA.VIEW_4O9 
    where trim(left(put(BUY12,BEST12.))) = '2'; 
quit;



本文用到的SAS数据集为buytest.sas7bdat,其下载地址:
http://ishare.iask.sina.com.cn/f/8641118.html
本系列全部数据下载地址:
http://iask.sina.com.cn/u/1564153724/ish

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有