99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀sas字符變量基于bad_rate分組
sas字符變量基于bad_rate分組
2017-04-19
收藏

sas字符變量基于bad_rate分組

最近因為模型擬合的不理想的原因,sas信用評分的內(nèi)容可能要停更一兩周了,因為我還沒能進行到模型評分卡這一步就被跨期驗證給拍下來了,我做的模型,訓(xùn)練的數(shù)據(jù)以及測試的數(shù)據(jù)指標都還不錯,跨期驗證指標掉的厲害。希望有經(jīng)驗的大神可以在留言區(qū)給我點建議,因為你們的建議可以讓我少走很多彎路。我現(xiàn)在要重新調(diào)整,至于怎么調(diào)整的內(nèi)容,我后面會做一個總結(jié)的文章,講對于指標達不到指標的時候可以有什么方便調(diào)整下指標,在這些方法之后還調(diào)整不了指標的再回頭看變量。

這次分享的代碼是字符變量依據(jù)bad_rate做的一個分組。之前分享過給予基尼系數(shù),給予iv值的,那么這次就叫基于bad_rate的吧。這次的代碼可能會比之前的代碼容易理解很多,而這次的代碼也是我的partner陳先生寫的。不要問我陳先生是誰,這是個秘密。

%macrodatasplit(data,target,group);

proc sql;

create table csm_CASH_MODEL_Train_rank1(

table_name varchar(100)

,col_name varchar(50)

,rank_name numeric

,low  numeric

,up numeric

,cnt numeric

,rate numeric

,n1  numeric

,bad_rate numeric

,woe  numeric

,iv  numeric

,split_type  numeric);

quit;

proc sql;

create table csm_CASH_MODEL_Train_rank2(

table_name varchar(100)

,col_name varchar(50)

,rank_name varchar(2000)

,lownumeric                                ,, ,up numeric

,cnt numeric

,rate  numeric

,n1 numeric

,bad_rate  numeric

,woe numeric

,iv numeric

,split_type numeric);

quit;

proc sql;/*獲得總記錄數(shù)、總壞客戶數(shù)、總好客戶數(shù)*/

select count(*),SUM(&target.),count(*)-SUM(&target.) into :record_cnt,

:bad_cnt,

:good_cnt

from &data.;

quit;


proc contents/*獲取輸入數(shù)據(jù)集的所有變量信息*/

data=&data.

out=CASH_SELECT_MODEL_VALID_V10_CONT

noprint;

run;


data CASH_SELECT_MODEL_VALID_V10_CONT;

set CASH_SELECT_MODEL_VALID_V10_CONT;

where name ^='&target.';

run;


data _null_;

set CASH_SELECT_MODEL_VALID_V10_CONT;

call symput(compress("numobs"),compress(_n_));

run;


%doi=1%to&numobs;

%put&NUMOBS.||&i.;

data _null_;

pointer=&i.;

set CASH_SELECT_MODEL_VALID_V10_CONT POINT=POINTER;

call symput('col_name', NAME);

call symput('TYPE', put(TYPE,1.));

stop;

run;

%if&TYPE.=2%then%do;

proc sql;

create table &col_name.as select

&col_name.

,sum(&target.)/count(1) as bad_rate

,sum(&target.) as &target.

,count(1) as num

from &data.

group by &col_name.;

quit;


%put&col_name;

%put&type;

proc sql;

select count(1) into:valuenum from &col_name;

quit;

%if&valuenum.>&group.%then%do;


proc rank data= &col_name out = data_rank ties = mean groups = &group.descending;

var bad_rate;

ranks group_name;

run;

proc sql;

create table  &data.as

select *,

b.group_name as new_&col_name.

from &data.a

left join data_rank b

ona.&col_name.=b.&col_name.;

quit;

proc sql;

insert into csm_CASH_MODEL_Train_rank1(table_name ,col_name ,rank_name ,low ,up,cnt,rate,n1,bad_rate,woe,iv,split_type)

select"csm_CASH_MODEL_Train_rank","&col_name",group_name ,min(bad_rate) ,max(bad_rate)  ,sum(num)

,sum(num)/&record_cnt

,sum(&target.)

,sum(&target.)/sum(num)

,log((ifn(sum(&target.)=0,0.001,sum(&target.))/&bad_cnt)/((sum(num)-sum(&target.))/&good_cnt))

,(sum(&target.)/&bad_cnt-(sum(num)-sum(&target.))/&good_cnt)*log((ifn(sum(&target.)=0,0.001,sum(&target.))/&bad_cnt)/((sum(num)-sum(&target.))/&good_cnt))

,&group.

from   data_rank

group by group_name;

quit;

%end;

%if&valuenum.<=&group.%then%do;


proc sql;

insert into csm_CASH_MODEL_Train_rank2( table_name ,col_name ,rank_name ,low,up,cnt,rate ,n1 ,bad_rate,woe ,iv ,split_type)

select"csm_CASH_MODEL_Train_rank","&col_name",&col_name.,min(bad_rate) ,max(bad_rate) ,sum(num),sum(num)/&record_cnt

,sum(&target.),sum(&target.)/sum(num)

,log((ifn(sum(&target.)=0,0.001,sum(&target.))/&bad_cnt)/((sum(num)-sum(&target.))/&good_cnt))

,(sum(&target.)/&bad_cnt-(sum(num)-sum(&target.))/&good_cnt)*log((ifn(sum(&target.)=0,0.001,sum(&target.))/&bad_cnt)/((sum(num)-sum(&target.))/&good_cnt))

,&valuenum

from   &col_name.

group by &col_name.;

quit;

%end;

%end;

%end;

data csm_CASH_MODEL_Train_rank1;

set csm_CASH_MODEL_Train_rank1;

rank_name1=put(rank_name,$8.);

drop rank_name;

rename rank_name1=rank_name;

run;


data csm_CASH_MODEL_Train_rank;

set csm_CASH_MODEL_Train_rank1 csm_CASH_MODEL_Train_rank2;

run;

%mend;

關(guān)于這個代碼的使用呢,就是下面這樣子啦。

Data:填入你的數(shù)據(jù)集,重點來啦,這個數(shù)據(jù)集也是等下的產(chǎn)出的數(shù)據(jù)集,所以你突然覺得,慘了,我拿錯數(shù)據(jù)集,那么你就得重新跑下這個數(shù)據(jù)集,因為經(jīng)過這個過程他已經(jīng)被改變了。

Target:因變量

Group;你要分的組數(shù)。

還有說下這個代碼,因為是針對字符的分組,就意味著要是有點變量的觀測情況就只用3種,那怎么分五組呢,譬如性別啊,你活生生的要是把男女分成5組,這就不道德了哈,所以代碼中對于觀測情況少于你的分組數(shù)的就不分組了。

說下結(jié)果哈:

變量指標統(tǒng)計表:

產(chǎn)出的表中就有圖中的這些指標,low以及up是bad_rate的區(qū)間。Cnt是分組統(tǒng)計的人數(shù),n1是壞客戶的數(shù)量。后面的split_type是分成幾組。宏里面設(shè)定的5組,所以顯示的是5。

碼表:

這張表是碼表。名字為每個變量的名字,譬如你這個變量叫l(wèi)oan_cnt,那么你找到一個數(shù)據(jù)叫l(wèi)oan_cnt就是loan_cnt的碼表。這個碼表不是你等下一個一個按照主表去leftjoin的哈。這個主表只要是想你之后要生成評分或者做數(shù)據(jù)集驗證的時候可以用的。數(shù)據(jù)分析師培訓(xùn)

最后就是主表:

為什么剛才說碼表不是主表連的呢,因為生成的主表里面已經(jīng)有新的分組,new_開頭的就是新生成的變量。便于后面的區(qū)分。


數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個參數(shù)驗證碼對象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務(wù)器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }