最近接到了一些真實的資料,資料中包含著許多缺失值,如何對缺失值處理,能更好的為我們做資料分析,更高效率的建模,縮小在測試集上預測性分析的偏差,當然這個偏差越小我們肯定越高興的。 資料準備
我用的是一份地理樣本資料,裡面有座標,各種物質成分(Ca,N,P等)
對於缺失資料的檢驗,有多個方法。 第一種:
library(VIM)
aggr(env,prop=T,numbers=T)
函數用法,可以在控制台載入完包後help()或者?函數
一看這資料還不算崩潰,但是缺失還是比較嚴重的, 第二種方法:
用mice包中的md.pattern(data)
怎麼解讀這個呢,其實最後一行返回的就是缺失數目,98為一共有多少缺失值。
缺失值的處理方法有哪些呢。我主要是做筆記 1、刪除缺失值
其實這種方法只有在自己擁有大量的資料進行模型訓練才可以選擇刪除,比如用na.omit()或者
在建模時設定na.action=na.omit。當然,實際業務在過手的時候,資料量不大的情況下,或者你刪除
缺失值後,建立的模型不能很好的解釋業務,可以考慮缺失值的重新認定。 2、刪除個別變數
對於有些確實很嚴重的資料,比如缺失值的數量超過了你在業務上認定的比例,那麼可以刪除這個變數。但是我最近接到的資料居然是長這樣的,就是這個變數對於要建立的模型很重要,在不能
刪除這個變數,我們需要考量變數在模型中的地位以及訓練和測試的數量上做一抉擇。 3、用普通的方法進行插值
為什麼我要說普通的方法呢。使用我稍後舉例的方法進行插值,這種方法略顯粗糙,我並不否定
這些方法,每一種方法都有其存在的應用情境。
library(Hmisc)
impute(env$Ca,mean) ####平均值
impute(env$K,median) ####中位元
impute(env$P,zs) ####眾 數 這裡的zs<-MS(env$P)
impute(env$N,"random") ####隨 機
當然在e1071裡面也有這函數。還有
眾數是需要自己計算的
MS <- function(x){ return(as.numeric(names(table(x))[table(x) == max(table(x))]))}
當然你要直接採用這種方法進行插補資料,
env$Ca<-impute(env$Ca,mean) ####平均值,適用於接近常態分佈
env$K<-impute(env$K,median) ####中位元,偏態不是很嚴重
env$P<-impute(env$P,zs) ####眾 數
env$N<-impute(env$N,"random") ####隨 機
這樣就將資料產生一個完整的資料集了。分析的事情就可以繼續走了。祝好運。
當然不管怎樣,這樣的資料產生的是否合理。怎麼去檢驗我插補的資料是否客觀呢或者近乎合理呢。
此時,我們需要計算插值的精度。我們需要引進DMwR包install.packages("DMwR"),library(DMwR)
提到這個包,裡面有manyNAs(data,0.2)這麼個函數返回的是找出缺失值大於列數20%的行,這個0.2是可
以調的。
在計算插補效果需要用到DMwR包的regr.eval()函數
4、在DMwR包裡有centralImputation()這個函數是利用資料的中心趨勢值來填補缺失值。
看下和未經處理資料的差距,這兒我用的是PerformanceAnalytics包的chart.Correlation()函數
上圖是用centralImputation()函數插補後的分布,看一下插補效果
mape值比前面普通方法還大了,看來效果不咋的啊
再看一下來源資料
總的來講,沒有影響到相關性,還有大致的分布。 5、K最近鄰法
在DMwR包中的knnImputation()函數是基於歐氏距離找到K個與其最近的觀測數值,然後對這K個近鄰的資料利用距離逆加權得到插補的值,然後替代了來源資料中的缺失值。 knnoutput <- knnImputation(env)
這下顯得略有可怕的地方,只是輕微改變了相關係數的值,有的還沒有被改變,而且變數的相關性僅僅有細微的差別。
我們看mape值是下降了的,看來插補效果是實在的在提升啊。 6、rpart
使用決策樹來預測缺失值,它相對於前面的優點是能夠對因子類變數進行插補,centralImputation()函數也是可以的,
不過對於名義型變數它採取的是眾數。
使用rpart()函數對於數值型變數(method=anova),因子型變數(method=class)。需要注意method的使用方法
看了下,效果沒有K最鄰近法好啊。 7、mice
這個主要是利用mice()函數進行建模,利用complete()函數再產生完整的資料
看到代碼,mice在建模的時候用的是隨機森林。最後計算了下插補效果,不行呐。
然後我把method的參數改成method="norm"(常態分佈)
然後我計算了一下插補效果,大不如人意啊,因為我們從來源資料的分布看缺失指標並不
成常態分佈,所以我能理解。
對mice()換個用法,繼續
我看看我的插補效果,此時我比較喜歡lattice包中的densityplot()函數
看了下,對N的預測還不是很好,但趨勢預測還是蠻可以的。其他變數的缺失預測性分析還是不錯。 8、還有的包和方法
包 大致描述 Hmisc
對多種函數,支援簡單插補、多重插補和典型變數插補
longitudinalData
對時間序列缺失值進行插補的一系列函數
pan
多元面板資料或著聚類的多重插補
kmi
處理生存分析缺失值的Kaplan-Meier的多重插補
cat
在對數線性模型中帶有多元類型變數的多重插補
mvnmle
對多元正態頒資料中缺失值的最大似然估計
。。。 。。。
這是目前本人接觸過的,部分我已經用過的,再繼續補充。 9、回到問題的本身
對缺失值處理,不同的資料來源和不同的業務要求,採用的方法肯定是不一樣的,當然需要我們在對缺失值處理的過程中保持客觀的判斷,加油。