前言
最近正在學(xué)習(xí)數(shù)據(jù)挖掘方面知識(shí),前前后后也查閱了不少資料。但是總是一個(gè)人學(xué)習(xí),有點(diǎn)枯燥,所以就想著分享些資料。也是意在找點(diǎn)同道中人交流學(xué)習(xí),亦或是大神指導(dǎo)下(這個(gè)當(dāng)然更好><)。第一次發(fā)表文章,心里還是有點(diǎn)緊張的,所以不多說了,直接上干貨:
在對數(shù)據(jù)進(jìn)行分類前,對數(shù)據(jù)的預(yù)處理可以提高分類預(yù)測的準(zhǔn)確性、有效性和可伸縮性。以下是幾種數(shù)據(jù)預(yù)處理:
1、數(shù)據(jù)清理:為了消除和減少數(shù)據(jù)噪聲和處理缺失值的數(shù)據(jù)預(yù)處理。雖然大部分的分類算法都會(huì)處理噪聲和缺失值,但在進(jìn)行分類對數(shù)據(jù)的清理可以減少學(xué)習(xí)時(shí)的混亂。
2、相關(guān)性分析:數(shù)據(jù)中很多屬性可能與分類預(yù)測任務(wù)不相關(guān)或是冗余的。因此在分類前進(jìn)行相關(guān)性分析可以刪除學(xué)習(xí)過程中不相關(guān)的或是冗余的屬性,提高分類預(yù)測的效率和準(zhǔn)確率。
3、數(shù)據(jù)變換:分類前的數(shù)據(jù)變換主要有概念分層和規(guī)范化兩種。概念分層就是連續(xù)值屬性概化為離散的區(qū)間,壓縮了原來的訓(xùn)練數(shù)據(jù),學(xué)習(xí)時(shí)可以減少輸入輸出操作。規(guī)范化是將給定屬性的所有值按比例縮放,使得它們落入較小的指定區(qū)間,比如落入【0,1】內(nèi),可以防止具有較大初始域的屬性相對于具有較小初始域的屬性權(quán)種過大,該方法常用于神經(jīng)網(wǎng)絡(luò)和距離度量方法。
引自:方匡南. 基于數(shù)據(jù)挖掘的分類和聚類算法研究及R語言實(shí)現(xiàn)[D]. 暨南大學(xué), 2007.
數(shù)據(jù)缺失
當(dāng)處理含有缺失值(NA)的數(shù)據(jù)時(shí),可以運(yùn)用以下幾種最常見的策略:
- 將含有缺失值的案例剔除。
- 根據(jù)變量之間的相關(guān)性關(guān)系填補(bǔ)缺失值。
- 根據(jù)案例之間的相似性填補(bǔ)缺失值。
- 使用能夠處理缺失值數(shù)據(jù)的工具。
下文的例子都用到了"DMwR"包,讀取數(shù)據(jù)代碼如下:
> library(DMwR)
> data(algae)
將缺失部分剔除
將含有缺失值的案例剔除非常容易實(shí)現(xiàn),尤其是當(dāng)這些記錄所占的比例在可用數(shù)據(jù)集中非常小的時(shí)候,這個(gè)選擇就比較合理。因此,我們在選擇這個(gè)方案時(shí)先檢查觀測值,或者至少得到這些觀測值的個(gè)數(shù)。
例如:
> algae[!complete.case(algae),]
...
...
> nrow(algae[!complete.case(algae),])
[1] 16
函數(shù)complete.case()產(chǎn)生一個(gè)布爾值向量,該向量的元素個(gè)數(shù)與algae數(shù)據(jù)框中的行數(shù)相同,如果數(shù)據(jù)框的相應(yīng)行中不含NA值,則函數(shù)返回TRUE。如果直接刪除所有含有至少一個(gè)NA的樣本,我們可以輸入:
> algae<-na.omit(algae)
然而這種辦法太過極端,我們一般不采用。但是對于某些缺失值太多的樣本我們可以直接剔除,因?yàn)樗麄儙缀跏菬o用的樣本。觀測方法可通過如下代碼:
> apply(algae,1,function(x) sum(is.na(x)))
然而之前我們加載的"DMwR"包中有相關(guān)處理函數(shù),應(yīng)用如下:
> algae<-algae[-manyNAs(algae),]
函數(shù)manyNAs()的功能是找出缺失值個(gè)數(shù)大于列數(shù)20%的行,第二個(gè)參數(shù)默認(rèn)值是0.2。
用最高頻率來填補(bǔ)缺失值
填補(bǔ)含有缺失值記錄的另一個(gè)方法是嘗試找到這些缺失值最可能的值。這里也有多種策略可以選擇,不同策略對逼近程度和算法復(fù)雜度的權(quán)衡不同。
填補(bǔ)缺失數(shù)據(jù)最簡便和快捷的方法是使用一些代表中心趨勢的值。代表中心趨勢的值反映了變量分布的最常見值,因此中心趨勢值是最自然的選擇。然而,中心趨勢值也有很多種,如平均值、中位數(shù)、眾數(shù)等。如何選擇還要由變量的分布決定。對于接近正態(tài)分布來說,所有的觀測值都較好地聚集在平均值周圍,平均數(shù)就是最佳選擇。然而對于偏態(tài)分布,平均值就不適用。另一方面,離群值(極值)的存在會(huì)扭曲平均值(這些可以通過箱式圖觀測到)。下面我們列舉幾個(gè)填補(bǔ)例子:
用平均值填補(bǔ):
> algae[48,"mxPH"]<-mean(algae$mxPH,na.rm=T)
用中位數(shù)填補(bǔ):
> algae[is.na(algae$Chla),"Chla"]<-median(algae$Chla,na.rm=T)
其中,na.rm是使計(jì)算時(shí)忽略缺失數(shù)據(jù)。當(dāng)然,我們例子中用到的包下也提供了一個(gè)函數(shù)centralImputation()可以用數(shù)據(jù)的中心趨勢值來填補(bǔ)缺失值。對數(shù)值型變量使用中位數(shù),對名義變量使用眾數(shù)。應(yīng)用如下:
> data(algae)
> algae<-algae[-manyNAs(algae),]
> algae<-centralImputation(algae)
上述方法雖然快捷方便,但是它可能導(dǎo)致較大的數(shù)據(jù)偏差,影響后期的數(shù)據(jù)分析工作。
通過變量的相關(guān)關(guān)系來填補(bǔ)缺失值
另一種獲得較少偏差填補(bǔ)缺失值的方法是探尋變量之間的相關(guān)關(guān)系。我們可以通過以下命令:
> symnum(cor(algae[,4:18],use="complete.obs"))
函數(shù)cor()的功能是產(chǎn)生變量之間的相關(guān)值矩陣,設(shè)定參數(shù)use="complete.obs"可以使R在計(jì)算相關(guān)值時(shí)忽略含有NA的紀(jì)錄。而函數(shù)symnum()是用來改善結(jié)果的輸出形式的。
在找到相關(guān)性較高的兩個(gè)變量后,我們開始尋找他們之間的線性相關(guān)關(guān)系,如下:
> data(algae)
> algae<-algae[-manyNAs(algae),]
> lm(PO4~oPO4,data=algae)
然后,我們通過線性關(guān)系計(jì)算缺失值的填補(bǔ)值。
如果PO4中存在多個(gè)缺失值,我們也可以通過構(gòu)造一個(gè)函數(shù)來完成,如下:
> data(algae)
> algae<-algae[-manyNAs(algae),]
> fillPO4<-function(oP){
if(is.na(oP))
return(NA)
else return(42.897+1.293*oP)
}
> algae[is.na(algae$PO4),"PO4"]<-sapply(algae[is.na(algae$PO4),"oPO4"],fillPO4)
函數(shù)sapply()的第一個(gè)參數(shù)是一個(gè)向量,第二個(gè)參數(shù)是一個(gè)函數(shù)。作用是將函數(shù)結(jié)果應(yīng)用到第一個(gè)參數(shù)中向量的每一個(gè)元素。
在上面的例子中由于我們使用的是相關(guān)值,所以只用到了數(shù)值變量而排除了名義變量與缺失值之間的關(guān)系。針對這個(gè),我們可以通過直方圖等形式進(jìn)行觀測(這里不多贅述,感興趣的可以查閱原書)。
通過探索案例之間的相似性來填補(bǔ)缺失值
除了變量之間的相關(guān)性外,多個(gè)樣本(行)之間的相似性也可以用來填補(bǔ)缺失值。度量相似性的指標(biāo)有很多,常用的是歐式距離,這個(gè)距離可以非正式的定義為任何兩個(gè)案例之的觀測值之差的平方和。書中提供的包的函數(shù)knnImputation()可以實(shí)現(xiàn)上述操作,這個(gè)函數(shù)用一個(gè)歐式距離的變種來找到任何個(gè)案最近的k個(gè)鄰居。使用方法如下:
> algae<-knnImputation(algae,k=10)
用中位數(shù)來填補(bǔ):
> algae<-knnImputation(algae,k=10,meth="median")
小結(jié)
綜合上述幾個(gè)方法,各有優(yōu)缺點(diǎn),具體如何選擇還應(yīng)該根據(jù)分析領(lǐng)域的知識(shí)來確定。此外,根據(jù)個(gè)案之間的相似性來填補(bǔ)缺失值也有不合理處,例如可能存在不相關(guān)的變量扭曲相似性。對于這些大數(shù)據(jù)集問題,可以通過隨機(jī)抽取樣本的方法來計(jì)算它們之間的相似性。
引自:《數(shù)據(jù)挖掘與R語言》(葡)Luis Torgo著
最后再打個(gè)小廣告=。=,這是我的博客,最近剛弄的,很多東西都在起步,歡迎大家指正提議!