R語言機(jī)器學(xué)習(xí)與臨床預(yù)測(cè)模型87--預(yù)測(cè)模型的特征篩選及構(gòu)建

R小鹽準(zhǔn)備介紹R語言機(jī)器學(xué)習(xí)與預(yù)測(cè)模型的學(xué)習(xí)筆記

你想要的R語言學(xué)習(xí)資料都在這里, 快來收藏關(guān)注【科研私家菜】


01 什么是特征構(gòu)建

特征對(duì)于預(yù)測(cè)而言是相當(dāng)重要的成福,在預(yù)測(cè)建模之前的大部分工作都是在尋找特征宜狐,沒有合適特征的預(yù)測(cè)模型屠列,就幾乎等于瞎猜弱睦,對(duì)預(yù)測(cè)目標(biāo)而言沒有任何意義。特征通常是指輸入數(shù)據(jù)中對(duì)因變量的影響比較明顯的有趣變量或?qū)傩酝涡3R姷奶卣魈崛∑耙酢⑻卣鳂?gòu)建、特征選擇三個(gè)概念有著本質(zhì)不同健无,特征提取是指通過函數(shù)映射從原始特征中提取新特征的過程荣恐,假設(shè)有n個(gè)原始特征(或?qū)傩?表示為A.,A....An,通過特征提取我們可以得到另外一組特征睬涧,表示為B,B...,m(m<m)募胃,其中Bi = f(A,A2,...An),i∈[1,m]且f是對(duì)應(yīng)的函數(shù)映射,注意到畦浓,這里我們用得到的新特征替代了原始特征痹束,最終得到m個(gè)特征;而特征構(gòu)建是從原始特征中推斷或構(gòu)建額外特征的過程,對(duì)于原始的n個(gè)特征A.2....An.經(jīng)過特征構(gòu)建讶请,我們得到m個(gè)額外的特征祷嘶,表示為An+.,7....An+m.所得到的這些特征都是由原始特征定義的,最終得到n+m個(gè)特征夺溢。特征選擇是指從原始的n個(gè)特征中選擇m(m<n)個(gè)子特征的過程论巍,因此特征選擇按照某個(gè)標(biāo)準(zhǔn)實(shí)現(xiàn)了最優(yōu)簡(jiǎn)化,即實(shí)現(xiàn)了降維风响,最終得到m個(gè)特征(注意特征并沒有發(fā)生變化嘉汰,只是總的數(shù)量減少了)。
特征的構(gòu)建與選取在提高預(yù)測(cè)精度方面越來越受到重視状勤,甚至影響到預(yù)測(cè)項(xiàng)目的成敗鞋怀。通常初始特征是基于領(lǐng)域經(jīng)驗(yàn)構(gòu)建的双泪,比如在預(yù)測(cè)短期負(fù)荷的時(shí)候,一般會(huì)考慮節(jié)假日密似、氣溫焙矛、歷史負(fù)荷水平等因素來構(gòu)建特征。然而這樣得到的特征未必能夠充分地描述目標(biāo)變量残腌,因此很有必要基于這些初始特征構(gòu)建更多更強(qiáng)的特征村斟,從而盡可能地提高預(yù)測(cè)精度。最近幾年這方面的研究也不少抛猫,百度等科技巨頭企業(yè)已經(jīng)有成熟的特征學(xué)習(xí)算法蟆盹,并且應(yīng)用在相關(guān)的業(yè)務(wù)場(chǎng)景中。


02 特征變換

特征變換通常是指對(duì)原始的某個(gè)特征通過一定規(guī)則或映射得到新特征的方法闺金,主要的方法包括概念分層叉谜、標(biāo)準(zhǔn)化羞延、離散化赂摆、函數(shù)變換以及深入表達(dá)赡突。特征變換主要是由人工完成杨幼,屬于比較基礎(chǔ)的特征構(gòu)建方法莲趣。

02.1 概念分層

在數(shù)據(jù)分析過程中扎酷,對(duì)于類別過多的分類變量通常使用概念分層的方法變換得到類別較少的變量馒闷,比如可以將年齡變量,其值為“1歲”尚卫、“12歲”归榕、“38歲"等,變換成更高概念層次的值,如“兒童”、“青年"吱涉、“中年”等刹泄,其中每個(gè)值對(duì)應(yīng)多個(gè)年齡,經(jīng)過這樣的處理怎爵,類別減少到幾類特石,既避免了程序陷入過擬合,又能提高算法的效率鳖链。因此姆蘸,概念分層是縮減離散變量取值數(shù)量的方法。由于取值概念層級(jí)更高芙委,這必然會(huì)損失一些細(xì)節(jié)信息逞敷,極端情況是取到概念分層的頂層,也就是信息損失最大的取值灌侣,這種情況下推捐,對(duì)所有的樣本,該變量的值都是一樣的侧啼,因此就失去概念分層的意義牛柒。

boysData<-read.csv("orgdata.csv")
#屬性說明:
#age:年齡
#hgt:身高
#wgt:體重
#bmi:體重指數(shù)
#hc:頭圍
#gen:發(fā)育程度1
#phb:發(fā)育程度2
#tv:發(fā)育程度3
#reg:所屬區(qū)域
print(head(boysData))
##     age  hgt   wgt   bmi   hc  gen  phb tv   reg
## 1 0.035 50.1 3.650 14.54 33.7 <NA> <NA> NA south
## 2 0.038 53.5 3.370 11.77 35.0 <NA> <NA> NA south
## 3 0.057 50.0 3.140 12.56 35.2 <NA> <NA> NA south
## 4 0.060 54.5 4.270 14.37 36.7 <NA> <NA> NA south
## 5 0.062 57.5 5.030 15.21 37.3 <NA> <NA> NA south
## 6 0.068 55.5 4.655 15.11 37.0 <NA> <NA> NA south
summary(boysData)
##       age              hgt              wgt              bmi       
##  Min.   : 0.035   Min.   : 50.00   Min.   :  3.14   Min.   :11.77  
##  1st Qu.: 1.581   1st Qu.: 84.88   1st Qu.: 11.70   1st Qu.:15.90  
##  Median :10.505   Median :147.30   Median : 34.65   Median :17.45  
##  Mean   : 9.159   Mean   :132.15   Mean   : 37.15   Mean   :18.07  
##  3rd Qu.:15.267   3rd Qu.:175.22   3rd Qu.: 59.58   3rd Qu.:19.53  
##  Max.   :21.177   Max.   :198.00   Max.   :117.40   Max.   :31.74  
##                   NA's   :20       NA's   :4        NA's   :21     
##        hc          gen        phb            tv           reg     
##  Min.   :33.70   G1  : 56   P1  : 63   Min.   : 1.00   city : 73  
##  1st Qu.:48.12   G2  : 50   P2  : 40   1st Qu.: 4.00   east :161  
##  Median :53.00   G3  : 22   P3  : 19   Median :12.00   north: 81  
##  Mean   :51.51   G4  : 42   P4  : 32   Mean   :11.89   south:191  
##  3rd Qu.:56.00   G5  : 75   P5  : 50   3rd Qu.:20.00   west :239  
##  Max.   :65.00   NA's:503   P6  : 41   Max.   :25.00   NA's :  3  
##  NA's   :46                 NA's:503   NA's   :522
#這里根據(jù)BMI指數(shù)堪簿,將泛化成體重類型的wtype字段
#通過summary的結(jié)果得知bmi字段存在21個(gè)缺失值與總量748相比遠(yuǎn)小于5%,這里將其刪除
boysData<-boysData[!is.na(boysData$bmi),]
#設(shè)置變換規(guī)則
typeUp<-c(18.5,24.99,25,28,32,100)
typeDown<-c(0,18.5,20,25,28,32)
typeName<-c("過輕","正常","適中","過重","肥胖","非常肥胖")
boysData$wtype<-typeName[unlist(mapply(function(x){
    tmp<-intersect(which(typeDown<x),which(typeUp>=x))
    #如果同時(shí)滿足正常和適中焰络,則默認(rèn)為適中
    return(tmp[length(tmp)])
},boysData$bmi))]
head(boysData)
##     age  hgt   wgt   bmi   hc  gen  phb tv   reg wtype
## 1 0.035 50.1 3.650 14.54 33.7 <NA> <NA> NA south  過輕
## 2 0.038 53.5 3.370 11.77 35.0 <NA> <NA> NA south  過輕
## 3 0.057 50.0 3.140 12.56 35.2 <NA> <NA> NA south  過輕
## 4 0.060 54.5 4.270 14.37 36.7 <NA> <NA> NA south  過輕
## 5 0.062 57.5 5.030 15.21 37.3 <NA> <NA> NA south  過輕
## 6 0.068 55.5 4.655 15.11 37.0 <NA> <NA> NA south  過輕
barplot(table(boysData$wtype),col=rainbow(9),border='gray')

02.2 標(biāo)準(zhǔn)化

在數(shù)據(jù)分析過程中戴甩,通常使用的變量量綱不一致,在確定權(quán)重闪彼、系數(shù)甜孤、距離的時(shí)候,也會(huì)有所
影響畏腕,因此要進(jìn)行數(shù)據(jù)標(biāo)準(zhǔn)化缴川。標(biāo)準(zhǔn)化對(duì)數(shù)據(jù)進(jìn)行無量綱處理,使不同量綱的數(shù)據(jù)可以在同一個(gè)數(shù)量級(jí)上進(jìn)行橫向比較描馅,減少因?yàn)閿?shù)據(jù)級(jí)差異帶來的誤差把夸。分成線性標(biāo)準(zhǔn)化和非線性標(biāo)準(zhǔn)化兩類。
(1)線性標(biāo)準(zhǔn)化
所謂線性標(biāo)準(zhǔn)化铭污,即是滿足y= ax + b的標(biāo)準(zhǔn)化處理過程恋日,其中a、b為常數(shù)嘹狞。常見的線性標(biāo)準(zhǔn)
化方法包括極差標(biāo)準(zhǔn)化岂膳、z-score 標(biāo)準(zhǔn)化、小數(shù)定標(biāo)標(biāo)準(zhǔn)化磅网。
(2)非線性標(biāo)準(zhǔn)化
非線性標(biāo)準(zhǔn)化谈截,就是標(biāo)準(zhǔn)化處理過程是非線性,常見的包括對(duì)數(shù)涧偷、倒數(shù)標(biāo)準(zhǔn)化簸喂。


stdProc<-function(x,isPos)
{
    #(1)線性標(biāo)準(zhǔn)化
    #---極差標(biāo)準(zhǔn)化
    if(max(x)>min(x)){
        if(isPos){
            yExt=(x-min(x))/(max(x)-min(x))
        }else{
            yExt=(max(x)-x)/(max(x)-min(x))
        }
    }else{
        print("最大值與最小值相等,不能進(jìn)行極差標(biāo)準(zhǔn)化!")
        yExt=NULL
    }
    
    #---z-score標(biāo)準(zhǔn)化
    sd0<-sd(x)
    mean0<-mean(x)
    if(sd0==0){
        print("由于標(biāo)準(zhǔn)差為0燎潮,不能進(jìn)行z-score標(biāo)準(zhǔn)化")
        yZsc=NULL
    }else{
        yZsc=(x-mean0)/sd0
    }
    #---小數(shù)定標(biāo)標(biāo)準(zhǔn)化
    yPot=x/(10^nchar(max(abs(x))))
    
    #(2)非線性標(biāo)準(zhǔn)化
    #---對(duì)數(shù)標(biāo)準(zhǔn)化
    if(isPos){
        y=log(x-min(x)+1)
        yLog=(1/max(y))*y
    }else{
        y=log(max(x)-x+1)
        yLog=(1/max(y))*y
    }
    #---倒數(shù)標(biāo)準(zhǔn)化
    yInv=min(abs(x[x!=0]))/x
    
    return(list(yExt=yExt,yZsc=yZsc,yPot=yPot,yLog=yLog,yInv=yInv))
}

02.3 離散化

離散化通常是對(duì)實(shí)數(shù)而言的喻鳄,它是將無限的連續(xù)值映射到有限分類值中去的方法,并且這些分
類規(guī)定了與無限連續(xù)值相同的取值空間确封。比如我們可以將收入金額诽表,取值范圍為2000~100000, 離散化成“低等收入”隅肥、“中等收入”竿奏、“高等收入”等分類值,-般對(duì)于這種類型的離散化腥放,得到的是有序分類變量泛啸。通過離散化處理,可以簡(jiǎn)化數(shù)據(jù)秃症,有助于提高算法的執(zhí)行效率和模型的可解釋性候址。
常見用于離散化處理的方法主要包括分箱法吕粹、熵離散法、ChiMerge法岗仑、規(guī)則離散法匹耕。

(1)分箱法

分箱法是一種將連續(xù)數(shù)值按照一定規(guī)則存放到不同箱中的數(shù)據(jù)處理方法,箱的寬度表示箱中數(shù)
值的取值區(qū)間荠雕,箱的深度表示箱中數(shù)值的數(shù)量稳其。通常按箱的等寬、等深的差異將分箱法分成兩類,一類是等寬分箱炸卑,另一類是等比分箱既鞠。
對(duì)于數(shù)據(jù)2、4盖文、7嘱蛋、10、 13五续、24洒敏、26、29疙驾、 30桐玻、 45、68荆萤、89,由于共12個(gè),可以按深度4將數(shù)值等比分成3個(gè)箱铣卡,分別為箱1I: 2链韭、4、7煮落、10;箱2: 13敞峭、24、 26蝉仇、29;箱3: 30旋讹、 45、68轿衔、89沉迹。由于數(shù)值介于區(qū)間[2,87],可以按寬度44將數(shù)值等寬分成2個(gè)箱害驹,分別為箱1: 2鞭呕、4、7宛官、10葫松、13瓦糕、24、26腋么、29咕娄、30、 45;箱2: 68珊擂、89圣勒。

tmpV=runif(100,10,100)
#1.使用quantile函數(shù)進(jìn)行等比分箱,此處將數(shù)據(jù)分成4份
newType=c("A1","A2","A3","A4")
q0=quantile(tmpV,probs=seq(0,1,1/4))
v0=rep(newType[1],length(tmpV))
for(i in 2:(length(q0)-1)){
    v0[tmpV>q0[i] & tmpV<=q0[i+1]]=newType[i]
}
#...另外澄床#可通過均值灾而、中位數(shù)、最大最小值來平滑數(shù)值以生成新的特征
vt0=tmpV[tmpV>=q0[1] & tmpV<=q0[2]]
v_mean=rep(mean(vt0),length(tmpV))
v_median=rep(median(vt0),length(tmpV))
v_max=rep(max(vt0),length(tmpV))
v_min=rep(min(vt0),length(tmpV))
for(i in 2:(length(q0)-1)){
    v_mean[tmpV>q0[i] & tmpV<=q0[i+1]]=mean(tmpV[tmpV>q0[i] & tmpV<=q0[i+1]])
    v_median[tmpV>q0[i] & tmpV<=q0[i+1]]=median(tmpV[tmpV>q0[i] &tmpV<=q0[i+1]])
    v_max[tmpV>q0[i] & tmpV<=q0[i+1]]=max(tmpV[tmpV>q0[i] & tmpV<=q0[i+1]])
    v_min[tmpV>q0[i] & tmpV<=q0[i+1]]=min(tmpV[tmpV>q0[i] & tmpV<=q0[i+1]])
}
#2.使用cut函數(shù)進(jìn)行等寬分箱扳剿,此處將數(shù)據(jù)分成5份
c0=cut(tmpV,breaks=5,labels=c("B1","B2","B3","B4","B5"))
#...另外可通過設(shè)置labels為NULL旁趟,并通過levles函數(shù)查看cut的水平
#...進(jìn)一步確定各分箱的取值區(qū)間
#...可通過均值、中位數(shù)庇绽、最大最小值來平滑數(shù)值以生成新的特征
L0=levels(cut(tmpV,breaks=5))
v2_mean=v2_median=v2_max=v2_min=rep(0,length(tmpV))
for(lvl in L0)
{
    splitval=as.integer(strsplit(strsplit(strsplit(lvl,split='\\(')[[1]][2],
              split='\\]')[[1]],split=',')[[1]])
    subcond=tmpV>splitval[1] & tmpV<=splitval[2]
    subval=tmpV[subcond]
    v2_mean[subcond]=mean(subval)
    v2_median[subcond]=median(subval)
    v2_max[subcond]=max(subval)
    v2_min[subcond]=min(subval)
}

(2)熵離散法

熵離散法是基于信息熵的一種數(shù)據(jù)離散方法锡搜,通常用在分類問題的預(yù)測(cè)場(chǎng)景中對(duì)數(shù)值屬性或特
征進(jìn)行離散化處理。這是一種有指導(dǎo)的離散化方法,并且通常進(jìn)行二元離散化瞧掺。大致思路是這樣的耕餐,首先對(duì)離散化的數(shù)值特征進(jìn)行排序,然后按順序?qū)?duì)應(yīng)數(shù)值作為分割點(diǎn),這樣可將該特征分為兩類,分別記為VI和V2辟狈,假設(shè)該特征為V,目標(biāo)變量為U,則該劃分可通過計(jì)算相應(yīng)的熵得到信息增益Gains(U,V) = Ent(U) - Ent(UIV),通過不斷地選擇分割點(diǎn)肠缔,并從得到的所有信息增益中,選取最大值哼转,其對(duì)應(yīng)的分割點(diǎn)即為最終用于離散化的分割點(diǎn)明未。

#將iris中的Sepal.Length變量排序,并保存在變量sortedSL中
sortedSL=sort(iris$Sepal.Length)
#循環(huán):按順序以sortedSL中的每個(gè)值作為分割點(diǎn)壹蔓,重建新特征new趟妥,默認(rèn)設(shè)置為0
gainsV<-NULL
splitV<-NULL
for(i in 1:NROW(sortedSL))
{
    splitVal=sortedSL[i]
    iris$new=0
    if(sum(iris$Sepal.Length>splitVal)>0)
    {
        iris[iris$Sepal.Length>splitVal,]$new=1
    }
    gainsV<-c(gainsV,gains(iris$Species,iris$new))
    splitV<-c(splitV,splitVal)
}
#分割點(diǎn)為
finalSplitV<-splitV[which.max(gainsV)]
finalSplitV

02.4 函數(shù)變換

函數(shù)變換指的是使用函數(shù)映射將變量或特征變換成另外一個(gè)特征的方法。通過函數(shù)變換會(huì)改變
數(shù)據(jù)的分布佣蓉,因此常用于對(duì)數(shù)據(jù)分布比較敏感的模型中披摄。常見的函數(shù)變換方法主要包括冪函數(shù)變換和對(duì)數(shù)變換。


關(guān)注R小鹽勇凭,關(guān)注科研私家菜(VX_GZH: SciPrivate)疚膊,有問題請(qǐng)聯(lián)系R小鹽。讓我們一起來學(xué)習(xí) R語言機(jī)器學(xué)習(xí)與臨床預(yù)測(cè)模型

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請(qǐng)聯(lián)系作者
  • 序言:七十年代末虾标,一起剝皮案震驚了整個(gè)濱河市酿联,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌,老刑警劉巖贞让,帶你破解...
    沈念sama閱讀 206,839評(píng)論 6 482
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件周崭,死亡現(xiàn)場(chǎng)離奇詭異,居然都是意外死亡喳张,警方通過查閱死者的電腦和手機(jī)续镇,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 88,543評(píng)論 2 382
  • 文/潘曉璐 我一進(jìn)店門,熙熙樓的掌柜王于貴愁眉苦臉地迎上來销部,“玉大人摸航,你說我怎么就攤上這事【俗” “怎么了酱虎?”我有些...
    開封第一講書人閱讀 153,116評(píng)論 0 344
  • 文/不壞的土叔 我叫張陵,是天一觀的道長(zhǎng)擂涛。 經(jīng)常有香客問我读串,道長(zhǎng),這世上最難降的妖魔是什么撒妈? 我笑而不...
    開封第一講書人閱讀 55,371評(píng)論 1 279
  • 正文 為了忘掉前任恢暖,我火速辦了婚禮,結(jié)果婚禮上狰右,老公的妹妹穿的比我還像新娘杰捂。我一直安慰自己,他們只是感情好棋蚌,可當(dāng)我...
    茶點(diǎn)故事閱讀 64,384評(píng)論 5 374
  • 文/花漫 我一把揭開白布嫁佳。 她就那樣靜靜地躺著,像睡著了一般谷暮。 火紅的嫁衣襯著肌膚如雪蒿往。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,111評(píng)論 1 285
  • 那天坷备,我揣著相機(jī)與錄音,去河邊找鬼情臭。 笑死省撑,一個(gè)胖子當(dāng)著我的面吹牛,可吹牛的內(nèi)容都是我干的俯在。 我是一名探鬼主播竟秫,決...
    沈念sama閱讀 38,416評(píng)論 3 400
  • 文/蒼蘭香墨 我猛地睜開眼,長(zhǎng)吁一口氣:“原來是場(chǎng)噩夢(mèng)啊……” “哼跷乐!你這毒婦竟也來了肥败?” 一聲冷哼從身側(cè)響起,我...
    開封第一講書人閱讀 37,053評(píng)論 0 259
  • 序言:老撾萬榮一對(duì)情侶失蹤,失蹤者是張志新(化名)和其女友劉穎馒稍,沒想到半個(gè)月后皿哨,有當(dāng)?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經(jīng)...
    沈念sama閱讀 43,558評(píng)論 1 300
  • 正文 獨(dú)居荒郊野嶺守林人離奇死亡纽谒,尸身上長(zhǎng)有42處帶血的膿包…… 初始之章·張勛 以下內(nèi)容為張勛視角 年9月15日...
    茶點(diǎn)故事閱讀 36,007評(píng)論 2 325
  • 正文 我和宋清朗相戀三年证膨,在試婚紗的時(shí)候發(fā)現(xiàn)自己被綠了。 大學(xué)時(shí)的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片鼓黔。...
    茶點(diǎn)故事閱讀 38,117評(píng)論 1 334
  • 序言:一個(gè)原本活蹦亂跳的男人離奇死亡央勒,死狀恐怖,靈堂內(nèi)的尸體忽然破棺而出澳化,到底是詐尸還是另有隱情崔步,我是刑警寧澤,帶...
    沈念sama閱讀 33,756評(píng)論 4 324
  • 正文 年R本政府宣布缎谷,位于F島的核電站井濒,受9級(jí)特大地震影響,放射性物質(zhì)發(fā)生泄漏慎陵。R本人自食惡果不足惜眼虱,卻給世界環(huán)境...
    茶點(diǎn)故事閱讀 39,324評(píng)論 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望席纽。 院中可真熱鬧捏悬,春花似錦、人聲如沸润梯。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,315評(píng)論 0 19
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽纺铭。三九已至寇钉,卻和暖如春,著一層夾襖步出監(jiān)牢的瞬間舶赔,已是汗流浹背扫倡。 一陣腳步聲響...
    開封第一講書人閱讀 31,539評(píng)論 1 262
  • 我被黑心中介騙來泰國(guó)打工, 沒想到剛下飛機(jī)就差點(diǎn)兒被人妖公主榨干…… 1. 我叫王不留竟纳,地道東北人撵溃。 一個(gè)月前我還...
    沈念sama閱讀 45,578評(píng)論 2 355
  • 正文 我出身青樓,卻偏偏與公主長(zhǎng)得像锥累,于是被迫代替她去往敵國(guó)和親缘挑。 傳聞我的和親對(duì)象是個(gè)殘疾皇子,可洞房花燭夜當(dāng)晚...
    茶點(diǎn)故事閱讀 42,877評(píng)論 2 345

推薦閱讀更多精彩內(nèi)容