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

熱線電話:13121318867

登錄
首頁精彩閱讀數(shù)據(jù)分析中非常實(shí)用的自編函數(shù)和代碼模塊整理
數(shù)據(jù)分析中非常實(shí)用的自編函數(shù)和代碼模塊整理
2017-12-04
收藏

數(shù)據(jù)分析中非常實(shí)用的自編函數(shù)和代碼模塊整理

搞了接近四個(gè)周的模型開發(fā)工作,今天整理代碼文件,評(píng)分卡模型基本告一段落了。那么在模型開發(fā)或者是我們?nèi)粘5臄?shù)據(jù)分析工作中,根據(jù)我們具體的業(yè)務(wù)需求,經(jīng)常會(huì)重復(fù)地用到某些模塊的功能。而這些模塊的功能在R的packages里是沒有的,這個(gè)時(shí)候,我們一般是通過自己寫代碼實(shí)現(xiàn)功能。通俗的說,在數(shù)據(jù)分析工作中,我們經(jīng)常會(huì)通過調(diào)用自編函數(shù)來實(shí)現(xiàn)某些高級(jí)的功能。
一般在結(jié)束某項(xiàng)數(shù)據(jù)分析的工作之后,對(duì)于使用頻率比較高的模塊功能,我會(huì)將實(shí)現(xiàn)代碼封裝在一個(gè)模塊函數(shù)當(dāng)中,并命好名,方便下次調(diào)用。其實(shí)你可以把它理解為自己開發(fā)的一個(gè)package,通過模塊化的調(diào)用,提高我們?cè)跀?shù)據(jù)分析工作中的效率,而不用每次都用造輪子式的方法來敲代碼!
我一直認(rèn)為這是一個(gè)很好的習(xí)慣,你的自編函數(shù)或者說是代碼模塊積累得越多,對(duì)于以后的建模工作來說會(huì)更加輕車熟路,這也是每一個(gè)數(shù)據(jù)分析師在工作的過程當(dāng)中積累的寶貴經(jīng)驗(yàn)。
說了這么多,今天給大家分享幾個(gè)我平時(shí)用得比較多,實(shí)用性也比較強(qiáng)的自編函數(shù)和代碼模塊,方便大家借鑒參考。
1、centralImputation( )
根據(jù)樣本間的相似性填補(bǔ)缺失值方法,把實(shí)現(xiàn)代碼封裝在如下函數(shù)中,并將該函數(shù)命名為centralImputation
根據(jù)樣本之間的相似性填補(bǔ)缺失值是指用這些缺失值最可能的值來填補(bǔ)它們,通常使用能代表變量中心趨勢的值進(jìn)行填補(bǔ),因?yàn)榇碜兞恐行内厔莸闹捣从沉俗兞糠植嫉淖畛R娭?。代表變量中心趨勢的指?biāo)包括平均值、中位數(shù)、眾數(shù)等,那么我們采用哪些指標(biāo)來填補(bǔ)缺失值呢?最佳選擇是由變量的分布來確定,例如,對(duì)于接近正態(tài)分布的變量來說,由于所有觀測值都較好地聚集在平均值周圍,因此平均值就就是填補(bǔ)該類變量缺失值的最佳選擇。然而,對(duì)于偏態(tài)分布或者離群值來說,平均值就不是最佳選擇。因?yàn)?a href='/map/piantaifenbu/' style='color:#000;font-size:inherit;'>偏態(tài)分布的大部分值都聚集在變量分布的一側(cè),平均值不能作為最常見值的代表。對(duì)于偏態(tài)分布或者有離群值的分布而言,中位數(shù)是更好地代表數(shù)據(jù)中心趨勢的指標(biāo)。對(duì)于名義變量(如定性指標(biāo)),通常采用眾數(shù)填補(bǔ)缺失值。
我們將上述分析放在一個(gè)統(tǒng)一的函數(shù)centralImputation( )中,對(duì)于數(shù)值型變量,我們用中位數(shù)填補(bǔ),對(duì)于名義變量,我們用眾數(shù)填補(bǔ),函數(shù)代碼如下:

centralImputation<-function(data)
  {
  for(i in seq(ncol(data)))
     if(any(idx<-is.na(data[,i])))
     {
       data[idx,i]<-centralValue(data[,i])
       }
     data}
     centralValue<-function(x,ws=NULL)
     {
       if(is.numeric(x))
     {
         if(is.null(ws))
         {
           median(x,na.rm = T)
           }
       else if((s<sum(ws))>0)
       {
         sum(x*(ws/s))
         }
       else NA
         }
       else
       {
         x<-as.factor(x)
         if(is.null(ws))
         {
           levels(x)[which.max(table(x))]
           }
       else
       {
         levels(x)[which.max(aggregate(ws,list(x),sum)[,2])]
         }
       }
  }

調(diào)用上述函數(shù)對(duì)缺失值進(jìn)行填補(bǔ),代碼如下:

x<-centralImputation(data)
View(x)     #查看填補(bǔ)結(jié)果
2、knnImputation( )

根據(jù)變量間的相關(guān)關(guān)系填補(bǔ)缺失值(基于knn算法)
上述按照中心趨勢進(jìn)行缺失值填補(bǔ)的方法,考慮的是數(shù)據(jù)每列的數(shù)值或字符屬性,在進(jìn)行缺失值填補(bǔ)時(shí),我們也可以考慮每行的屬性,即根據(jù)變量之間的相關(guān)關(guān)系填補(bǔ)缺失值。
當(dāng)我們采用數(shù)據(jù)集每行的屬性進(jìn)行缺失值填補(bǔ)時(shí),通常有兩種方法,第一種方法是計(jì)算k個(gè)(我用的k=10)最相近樣本的中位數(shù)并用這個(gè)中位數(shù)來填補(bǔ)缺失值。如果缺失值是名義變量,則使用這k個(gè)最近相似數(shù)據(jù)的加權(quán)平均值進(jìn)行填補(bǔ),權(quán)重大小隨著距離待填補(bǔ)缺失值樣本的距離增大而減小,本文我們采用高斯核函數(shù)從距離獲得權(quán)重,即如果相鄰樣本距離待填補(bǔ)缺失值的樣本的距離為d,則它的值在加權(quán)平均中的權(quán)重為:

在尋找跟包含缺失值的樣本最近的k個(gè)鄰居樣本時(shí),最常用的經(jīng)典算法是knn(k-nearest-neighbor) 算法,它通過計(jì)算樣本間的歐氏距離,來尋找距離包含缺失值樣本最近的k個(gè)鄰居,樣本x和y之間歐式距離的計(jì)算公式如下:

式中:δi()是變量i的兩個(gè)值之間的距離,即

在計(jì)算歐式距離時(shí),為了消除變量間不同尺度的影響,通常要先對(duì)數(shù)值變量進(jìn)行標(biāo)準(zhǔn)化,即:

我們將上述根據(jù)數(shù)據(jù)集每行的屬性進(jìn)行缺失值填補(bǔ)的方法,封裝到knnImputation( )函數(shù)中,代碼如下:

knnImputation<-function(data,k=10,scale=T,meth="weighAvg",distData=NULL)
{
  n<-nrow(data)
  if(!is.null(distData))
  {
    distInit<-n+1
    data<-rbind(data,distData)
  }
  else
  {
    disInit<-1
  }
  N<-nrow(data)
  ncol<-ncol(data)
  nomAttrs<-rep(F,ncol)
  for(i in seq(ncol))
  {
    nomAttrs[i]<-is.factor(data[,1])
  }
  nomAttrs<-which(nomAttrs)
  hasNom<-length(nomAttrs)
  contAttrs<-setdiff(seq(ncol),nomAttrs)
  dm<-data
  if(scale)
  {
    dm[,contAttrs]<-scale(dm[,contAttrs])
  }
  if(hasNom)
  {
    for(i in nomAttrs)
      dm[,i]<-as.integer(dm[,i])
  }
  dm<as.matrix(dm)
  nas<-which(!complete.cases(dm))
  if(!is.null(distData))
  {
    tgt.nas<-nas[nas<=n]
  }
  else
  {
    tgt.nas<-nas
  }
  if(length(tgt.nas)==0)
  {
    warning("No case has missing values. Stopping as there is nothing to do.")
  }
  xcomplete<-dm[setdiff(disInit:N,nas),]
  if(nrow(xcomplete)<k)
  {
    stop("Not sufficient complete cases for computing neighbors.")
  }
  for(i in tgt.nas)
  {
    tgtAs<-which(is.na(dm[i,]))
    dist<-scale(xcomplete,dm[i,],FALSE)
    xnom<-setdiff(nomAttrs,tgtAs)
    if(length(xnom))
    {
      dist[,xnom]<-ifelse(dist[,xnom]>0,1,dist[,xnom])
    }
    dist<-dist[,-tgtAs]
    dist<-sqrt(drop(dist^2%*%rep(1,ncol(dist))))
    ks<-order(dist)[seq(k)]
    for(j in tgtAs) if(meth=="median")
    {
      data[i,j]<-centralValue(data[setdiff(distInit:N,nas),j][ks])
    }
    else
    {
      data[i,j]<-centralValue(data[setdiff(distInit:N,nas),j]
                              [ks],exp(-dist[ks]))
    }
  }
  data[1:n,]
}

調(diào)用knnImputation( )函數(shù),用knn方法填補(bǔ)缺失值,代碼如下:

d<-knnImputation(data)
View(d)     #查看填補(bǔ)結(jié)果
以上兩個(gè)模塊化函數(shù)的分析和代碼實(shí)現(xiàn),大家get到了嗎。在數(shù)據(jù)分析最頭痛,最花時(shí)間的數(shù)據(jù)清洗數(shù)據(jù)預(yù)處理環(huán)節(jié),通過直接調(diào)用模塊化函數(shù),大大的節(jié)省了我們耗費(fèi)的時(shí)間,提高數(shù)據(jù)分析工作的效率。

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

若不方便掃碼,搜微信號(hào):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(), // 加隨機(jī)數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調(diào)用 initGeetest 進(jìn)行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調(diào),回調(diào)的第一個(gè)參數(shù)驗(yàn)證碼對(duì)象,之后可以使用它調(diào)用相應(yīng)的接口 initGeetest({ // 以下 4 個(gè)配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺(tái)檢測極驗(yàn)服務(wù)器是否宕機(jī) new_captcha: data.new_captcha, // 用于宕機(jī)時(shí)表示是新驗(yàn)證碼的宕機(jī) product: "float", // 產(chǎn)品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請(qǐng)參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計(jì)時(shí)完成 $(".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 = '請(qǐng)輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請(qǐng)輸入正確的'+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); }