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è)模型