學(xué)習(xí)數(shù)據(jù)分析:缺失值處理的正確姿勢!
寫在前面
在進(jìn)行數(shù)據(jù)競賽中,數(shù)據(jù)預(yù)處理階段經(jīng)常需要對數(shù)據(jù)進(jìn)行缺失值處理。關(guān)于缺失值的處理并沒有想象中的那么簡單。以下為一些經(jīng)驗(yàn)分享,基本涵蓋了大部分處理方式。
文章目錄
數(shù)據(jù)缺失類型 缺失值處理 缺失值統(tǒng)計(jì) 缺失值刪除 虛擬變量調(diào)整(啞變量,dummy variables) 缺失值插補(bǔ) 不處理缺失值
數(shù)據(jù)缺失類型
完全隨機(jī)丟失(MCAR,Missing Completely at Random):某個變量是否缺失與它自身的值無關(guān),也與其他任何變量的值無關(guān)。例如,由于測量設(shè)備出故障導(dǎo)致某些值缺失。 隨機(jī)丟失(MAR,Missing at Random):在控制了其他變量已觀測到的值后,某個變量是否缺失與它自身的值無關(guān)。例如,人們是否透露收入可能與性別、教育程度、職業(yè)等因素有關(guān)系。 非隨機(jī)丟失(MNAR,Missing not at Random):數(shù)據(jù)的缺失與不完全變量自身的取值有關(guān)。分為兩種情況:缺失值取決于其假設(shè)值(例如,高收入人群通常不希望在調(diào)查中透露他們的收入);或者,缺失值取決于其他變量值(假設(shè)女性通常不想透露她們的年齡,則這里年齡變量缺失值受性別變量的影響)。
在前兩種情況下可以根據(jù)其出現(xiàn)情況刪除缺失值的數(shù)據(jù),同時(shí),隨機(jī)缺失可以通過已知變量對缺失值進(jìn)行估計(jì)。在第三種情況下,刪除包含缺失值的數(shù)據(jù)可能會導(dǎo)致模型出現(xiàn)偏差,同時(shí),對數(shù)據(jù)進(jìn)行填充也需要格外謹(jǐn)慎。正確判斷缺失值的類型,能給我們的工作帶來很大的便利,但目前還沒有一套規(guī)范的缺失值類型判定標(biāo)準(zhǔn)。大多是依據(jù)經(jīng)驗(yàn)或業(yè)務(wù)進(jìn)行判斷。
缺失值處理
解決缺失數(shù)據(jù)問題的方法主要有:成列刪除、成對刪除、虛擬變量調(diào)整、插補(bǔ)、多重插補(bǔ)和最大似然等。

缺失值統(tǒng)計(jì)
missing_value_formats = ["n.a.","?","NA","n/a", "na", "--"]
df = pd.read_csv("employees.csv", na_values = missing_value_formats)
df.isna().sum()
缺失值刪除
成列刪除(listwise deletion)
常見的操作方法:刪除掉所有存在缺失值的個案。
優(yōu)點(diǎn):
可用于任何類型的統(tǒng)計(jì)分析。不需要特別的運(yùn)算方法。如果數(shù)據(jù)是MCAR,則減少的樣本將會是原樣本的一個隨機(jī)次樣本。如果任何因變量缺失數(shù)據(jù)的概率不取決于自變量的值,則使用成列刪除的回歸估計(jì)值將會是無偏誤的。
缺點(diǎn):
標(biāo)準(zhǔn)誤通常較大。如果數(shù)據(jù)不是MCAR(完全隨機(jī)缺失)而只是MAR(隨機(jī)缺失),那么成列刪除可能會產(chǎn)生有偏誤的估計(jì)值。(例如,教育缺失數(shù)據(jù)的概率取決于職業(yè)地位,那么對于二者的回歸會產(chǎn)生一個有偏誤的回歸系數(shù)估計(jì)值。) 成對刪除(pairwise deletion)
一般的備選方案,在進(jìn)行多變量的聯(lián)立時(shí),只刪除掉需要執(zhí)行的變量的缺失數(shù)據(jù)。例如在ABC三個變量間,需要計(jì)算A和C的協(xié)方差,那么只有同時(shí)具備A/C的數(shù)據(jù)會被使用。文獻(xiàn)指出,當(dāng)變量間的相關(guān)性普遍較低時(shí),成對刪除會產(chǎn)生更有效的估計(jì)值。然而當(dāng)變量間的相關(guān)性較高時(shí),建議還是使用成列刪除。理論上成對刪除不建議作為成列刪除的備選方案。這是一種保守的處理方法,最大限度地保留了數(shù)據(jù)集中的可用信息。
優(yōu)點(diǎn):如果數(shù)據(jù)為MCAR,成對刪除就產(chǎn)生一致的參數(shù)估計(jì)值(在大樣本中接近無偏誤),且有比成列刪除更少的抽樣變異(較小的真實(shí)標(biāo)準(zhǔn)誤),而當(dāng)變量間相關(guān)性普遍較低時(shí),成對刪除會產(chǎn)生更有效的估計(jì)值。
缺點(diǎn):
如果數(shù)據(jù)是MAR但不是隨機(jī)被觀察到的,估計(jì)值可能會嚴(yán)重偏誤。 由統(tǒng)計(jì)軟件所產(chǎn)生的標(biāo)準(zhǔn)誤和檢驗(yàn)統(tǒng)計(jì)量估計(jì)時(shí)偏誤的。 在小樣本中,建構(gòu)的協(xié)方差或相關(guān)矩陣可能不是“正定的”。
Pandas中的dropna()方法
DataFrame.dropna(axis=0, how='any', thresh=None, subset=None, inplace=False)
參數(shù)說明:
axis:軸。0或’index’,表示按行刪除;1或’columns’,表示按列刪除。 how:篩選方式。‘a(chǎn)ny’,表示該行/列只要有一個以上的空值,就刪除該行/列;‘a(chǎn)ll’,表示該行/列全部都為空值,就刪除該行/列。 thresh:非空元素最低數(shù)量。int型,默認(rèn)為None。如果該行/列中,非空元素?cái)?shù)量小于這個值,就刪除該行/列。 subset:子集。列表,元素為行或者列的索引。如果axis=0或者‘index’,subset中元素為列的索引;如果axis=1或者‘column’,subset中元素為行的索引。由subset限制的子區(qū)域,是判斷是否刪除該行/列的條件判斷區(qū)域。 inplace:是否原地替換。布爾值,默認(rèn)為False。如果為True,則在原DataFrame上進(jìn)行操作,返回值為None。使用示例:
# 刪除所有含空的行
df.dropna(inplace=True)
# 刪除某列含控制的行
df.dropna(subset=['列名'],inplace=True)
虛擬變量調(diào)整(啞變量,dummy variables)
新建兩個變量,其中一個變量D為“是否缺失”,缺失值設(shè)為0,存在值設(shè)為1。
另一個變量X’,將缺失值設(shè)為c(可以是任何常數(shù)),存在值設(shè)為本身。隨后,對X’,D和其他變量(因變量和其他預(yù)設(shè)模型中的自變量)進(jìn)行回歸。這種調(diào)整的好處是它利用了所有可用的缺失數(shù)據(jù)的信息(是否缺失)。為了便利,一個好的c的設(shè)置方式是現(xiàn)有非缺失數(shù)據(jù)X的均數(shù)。這樣做的好處是,D的系數(shù)可以被解釋成“在控制了其他變量的情況下,X具缺失數(shù)據(jù)的個體其Y的預(yù)測值減去具X平均數(shù)的個體于Y的預(yù)測值”
缺失值插補(bǔ)
相對丟棄而言,補(bǔ)全是更加常用的缺失值處理方式。通過一定的方法將缺失的數(shù)據(jù)補(bǔ)上,從而形成完整的數(shù)據(jù)記錄,對于后續(xù)的數(shù)據(jù)處理、分析和建模至關(guān)重要。常用的補(bǔ)全方法如下。
統(tǒng)計(jì)法:對于數(shù)值型的數(shù)據(jù),使用均值、加權(quán)均值、中位數(shù)等方法補(bǔ)足;對于分類型數(shù)據(jù),使用類別眾數(shù)最多的值補(bǔ)足。 模型法:更多時(shí)候我們會基于已有的其他字段,將缺失字段作為目標(biāo)變量進(jìn)行預(yù)測,從而得到最為可能的補(bǔ)全值。如果帶有缺失值的列是數(shù)值變量,采用回歸模型補(bǔ)全;如果是分類變量,則采用分類模型補(bǔ)全。 專家補(bǔ)全:對于少量且具有重要意義的數(shù)據(jù)記錄,專家補(bǔ)足也是非常重要的一種途徑。 其他方法:例如隨機(jī)法、特殊值法、多重填補(bǔ)等。
人工填寫(filling manually)
當(dāng)你對自己手頭的數(shù)據(jù)集足夠了解時(shí),可以選擇自己填寫缺失值。
特殊值填充(Treating Missing Attribute values as Special values)
將空值作為一種特殊的屬性值來處理,它不同于其他的任何屬性值。如所有的空值都用“unknown”填充。一般作為臨時(shí)填充或中間過程。有時(shí)可能導(dǎo)致嚴(yán)重的數(shù)據(jù)偏離,一般不推薦。
平均值填充(Mean/Mode Completer)
將初始數(shù)據(jù)集中的屬性分為數(shù)值屬性和非數(shù)值屬性來分別進(jìn)行處理。
如果空值是數(shù)值型的,就根據(jù)該屬性在其他所有對象的取值的平均值來填充該缺失的屬性值;如果空值是非數(shù)值型的,就根據(jù)統(tǒng)計(jì)學(xué)中的眾數(shù)原理,用該屬性在其他所有對象的取值次數(shù)最多的值(即出現(xiàn)頻率最高的值)來補(bǔ)齊該缺失的屬性值。
與其相似的另一種方法叫條件平均值填充法(Conditional Mean Completer)。在該方法中,用于求平均的值并不是從數(shù)據(jù)集的所有對象中取,而是從與該對象具有相同決策屬性值的對象中取得。這兩種數(shù)據(jù)的補(bǔ)齊方法,其基本的出發(fā)點(diǎn)都是一樣的,以最大概率可能的取值來補(bǔ)充缺失的屬性值,只是在具體方法上有一點(diǎn)不同。與其他方法相比,它是用現(xiàn)存數(shù)據(jù)的多數(shù)信息來推測缺失值。
熱卡填充(Hot deck imputation,或就近補(bǔ)齊)
對于一個包含空值的對象,熱卡填充法在完整數(shù)據(jù)中找到一個與它最相似的對象,然后用這個相似對象的值來進(jìn)行填充。不同的問題可能會選用不同的標(biāo)準(zhǔn)來對相似進(jìn)行判定。該方法概念上很簡單,且利用了數(shù)據(jù)間的關(guān)系來進(jìn)行空值估計(jì)。這個方法的缺點(diǎn)在于難以定義相似標(biāo)準(zhǔn),主觀因素較多。
聚類填充(clustering imputation)
最為典型的代表是K均值(K-means clustering),先根據(jù)歐式距離或相關(guān)分析來確定距離具有缺失數(shù)據(jù)樣本最近的K個樣本,將這K個值加權(quán)平均來估計(jì)該樣本的缺失數(shù)據(jù)。
同均值插補(bǔ)的方法都屬于單值插補(bǔ),不同的是,它用層次聚類模型預(yù)測缺失變量的類型,再以該類型的均值插補(bǔ)。
假設(shè)X=(X1,X2…Xp)為信息完全的變量,Y為存在缺失值的變量,那么首先對X或其子集行聚類,然后按缺失個案所屬類來插補(bǔ)不同類的均值。如果在以后統(tǒng)計(jì)分析中還需以引入的解釋變量和Y做分析,那么這種插補(bǔ)方法將在模型中引入自相關(guān),給分析造成障礙。
K最近距離鄰法(K-means clustering)
先根據(jù)歐式距離或相關(guān)分析來確定距離具有缺失數(shù)據(jù)樣本最近的K個樣本,將這K個值加權(quán)平均來估計(jì)該樣本的缺失數(shù)據(jù)。這個方法要求我們選擇k的值(最近鄰居的數(shù)量),以及距離度量。KNN既可以預(yù)測離散屬性(k近鄰中最常見的值)也可以預(yù)測連續(xù)屬性(k近鄰的均值)。
根據(jù)數(shù)據(jù)類型的不同,距離度量也不盡相同:
連續(xù)數(shù)據(jù):最常用的距離度量有歐氏距離,曼哈頓距離以及余弦距離。 分類數(shù)據(jù):漢明(Hamming)距離在這種情況比較常用。對于所有分類屬性的取值,如果兩個數(shù)據(jù)點(diǎn)的值不同,則距離加一。漢明距離實(shí)際上與屬性間不同取值的數(shù)量一致。
KNN算法最吸引人的特點(diǎn)之一在于,它易于理解也易于實(shí)現(xiàn)。其非參數(shù)的特性在某些數(shù)據(jù)非常“不尋常”的情況下非常有優(yōu)勢。
KNN算法的一個明顯缺點(diǎn)是,在分析大型數(shù)據(jù)集時(shí)會變得非常耗時(shí),因?yàn)樗鼤谡麄€數(shù)據(jù)集中搜索相似數(shù)據(jù)點(diǎn)。此外,在高維數(shù)據(jù)集中,最近與最遠(yuǎn)鄰居之間的差別非常小,因此KNN的準(zhǔn)確性會降低。
使用所有可能的值填充(Assigning All Possible values of the Attribute)
這種方法是用空缺屬性值的所有可能的屬性取值來填充,能夠得到較好的補(bǔ)齊效果。但是,當(dāng)數(shù)據(jù)量很大或者遺漏的屬性值較多時(shí),其計(jì)算的代價(jià)很大,可能的測試方案很多。一般不推薦。
另有一種方法,填補(bǔ)遺漏屬性值的原則是一樣的,不同的只是從決策相同的對象中嘗試所有的屬性值的可能情況,而不是根據(jù)信息表中所有對象進(jìn)行嘗試,這樣能夠在一定程度上減小原方法的代價(jià)。
組合完整化方法(Combinatorial Completer)
這種方法是用空缺屬性值的所有可能的屬性取值來試,并從最終屬性的約簡結(jié)果中選擇最好的一個作為填補(bǔ)的屬性值。這是以約簡為目的的數(shù)據(jù)補(bǔ)齊方法,能夠得到好的約簡結(jié)果;但是,當(dāng)數(shù)據(jù)量很大或者遺漏的屬性值較多時(shí),其計(jì)算的代價(jià)很大。
另一種稱為條件組合完整化方法(Conditional Combinatorial Complete),填補(bǔ)遺漏屬性值的原則是一樣的,不同的只是從決策相同的對象中嘗試所有的屬性值的可能情況,而不是根據(jù)信息表中所有對象進(jìn)行嘗試。條件組合完整化方法能夠在一定程度上減小組合完整化方法的代價(jià)。在信息表包含不完整數(shù)據(jù)較多的情況下,可能的測試方案將巨增。
回歸(Regression)
基于完整的數(shù)據(jù)集,建立回歸方程,或利用機(jī)器學(xué)習(xí)中的回歸算法。對于包含空值的對象,將已知屬性值代入方程來估計(jì)未知屬性值,以此估計(jì)值來進(jìn)行填充。當(dāng)變量不是線性相關(guān)時(shí)會導(dǎo)致有偏差的估計(jì)。較常用。但是要注意防止過擬合。
期望值最大化方法(Expectation maximization,EM)
EM算法是一種在不完全數(shù)據(jù)情況下計(jì)算極大似然估計(jì)或者后驗(yàn)分布的迭代算法。在每一迭代循環(huán)過程中交替執(zhí)行兩個步驟:
E步(Excepctaion step,期望步),在給定完全數(shù)據(jù)和前一次迭代所得到的參數(shù)估計(jì)的情況下計(jì)算完全數(shù)據(jù)對應(yīng)的對數(shù)似然函數(shù)的條件期望 M步(Maximzation step,極大化步),用極大化對數(shù)似然函數(shù)以確定參數(shù)的值,并用于下步的迭代。算法在E步和M步之間不斷迭代直至收斂,即兩次迭代之間的參數(shù)變化小于一個預(yù)先給定的閾值時(shí)結(jié)束。該方法可能會陷入局部極值,收斂速度也不是很快,并且計(jì)算很復(fù)雜。
極大似然估計(jì)(Max Likelihood ,ML)
在缺失類型為隨機(jī)缺失的條件下,假設(shè)模型對于完整的樣本是正確的,那么通過觀測數(shù)據(jù)的邊際分布可以對未知參數(shù)進(jìn)行極大似然估計(jì)(Little and Rubin)。這種方法也被稱為忽略缺失值的極大似然估計(jì),對于極大似然的參數(shù)估計(jì)實(shí)際中常采用的計(jì)算方法是期望值最大化(Expectation Maximization,EM)。
該方法比刪除個案和單值插補(bǔ)更有吸引力,它一個重要前提:適用于大樣本。有效樣本的數(shù)量足夠以保證ML估計(jì)值是漸近無偏的并服從正態(tài)分布。但是這種方法可能會陷入局部極值,收斂速度也不是很快,并且計(jì)算很復(fù)雜。
多重插補(bǔ)(Multiple Imputation,MI)
多值插補(bǔ)的思想來源于貝葉斯估計(jì),認(rèn)為待插補(bǔ)的值是隨機(jī)的,它的值來自于已觀測到的值。具體實(shí)踐上通常是估計(jì)出待插補(bǔ)的值,然后再加上不同的噪聲,形成多組可選插補(bǔ)值。根據(jù)某種選擇依據(jù),選取最合適的插補(bǔ)值。
多重插補(bǔ)方法分為三個步驟:
為每個空值產(chǎn)生一套可能的插補(bǔ)值,這些值反映了無響應(yīng)模型的不確定性;每個值都可以被用來插補(bǔ)數(shù)據(jù)集中的缺失值,產(chǎn)生若干個完整數(shù)據(jù)集合。 每個插補(bǔ)數(shù)據(jù)集合都用針對完整數(shù)據(jù)集的統(tǒng)計(jì)方法進(jìn)行統(tǒng)計(jì)分析。 對來自各個插補(bǔ)數(shù)據(jù)集的結(jié)果,根據(jù)評分函數(shù)進(jìn)行選擇,產(chǎn)生最終的插補(bǔ)值。
多重插補(bǔ)和貝葉斯估計(jì)的思想是一致的,但是多重插補(bǔ)彌補(bǔ)了貝葉斯估計(jì)的幾個不足。
貝葉斯估計(jì)以極大似然的方法估計(jì),極大似然的方法要求模型的形式必須準(zhǔn)確,如果參數(shù)形式不正確,將得到錯誤得結(jié)論,即先驗(yàn)分布將影響后驗(yàn)分布的準(zhǔn)確性。而多重插補(bǔ)所依據(jù)的是大樣本漸近完整的數(shù)據(jù)的理論,在數(shù)據(jù)挖掘中的數(shù)據(jù)量都很大,先驗(yàn)分布將極小的影響結(jié)果,所以先驗(yàn)分布的對結(jié)果的影響不大。 貝葉斯估計(jì)僅要求知道未知參數(shù)的先驗(yàn)分布,沒有利用與參數(shù)的關(guān)系。而多重插補(bǔ)對參數(shù)的聯(lián)合分布作出了估計(jì),利用了參數(shù)間的相互關(guān)系。
同時(shí),多重插補(bǔ)保持了單一插補(bǔ)的兩個基本優(yōu)點(diǎn),即應(yīng)用完全數(shù)據(jù)分析方法和融合數(shù)據(jù)收集者知識的能力。相對于單一插補(bǔ),多重插補(bǔ)有三個極其重要的優(yōu)點(diǎn):
為表現(xiàn)數(shù)據(jù)分布,隨機(jī)抽取進(jìn)行插補(bǔ),增加了估計(jì)的有效性。 當(dāng)多重插補(bǔ)是在某個模型下的隨機(jī)抽樣時(shí),按一種直接方式簡單融合完全數(shù)據(jù)推斷得出有效推斷,即它反映了在該模型下由缺失值導(dǎo)致的附加變異。 在多個模型下通過隨機(jī)抽取進(jìn)行插補(bǔ),簡單地應(yīng)用完全數(shù)據(jù)方法,可以對無回答的不同模型下推斷的敏感性進(jìn)行直接研究。
多重插補(bǔ)也有以下缺點(diǎn):
生成多重插補(bǔ)比單一插補(bǔ)需要更多工作 貯存多重插補(bǔ)數(shù)據(jù)集需要更多存儲空間 分析多重插補(bǔ)數(shù)據(jù)集比單一插補(bǔ)需要花費(fèi)更多精力
C4.5方法
通過尋找屬性間的關(guān)系來對遺失值填充。它尋找之間具有最大相關(guān)性的兩個屬性,其中沒有遺失值的一個稱為代理屬性,另一個稱為原始屬性,用代理屬性決定原始屬性中的遺失值。這種基于規(guī)則歸納的方法只能處理基數(shù)較小的名詞型屬性。
就幾種基于統(tǒng)計(jì)的方法而言,刪除元組法和平均值法差于熱卡填充法、期望值最大化方法和多重填充法;回歸是比較好的一種方法,但仍比不上hot deck和EM;EM缺少M(fèi)I包含的不確定成分。值得注意的是,這些方法直接處理的是模型參數(shù)的估計(jì)而不是空缺值預(yù)測本身。它們合適于處理無監(jiān)督學(xué)習(xí)的問題,而對有監(jiān)督學(xué)習(xí)來說,情況就不盡相同了。譬如,你可以刪除包含空值的對象用完整的數(shù)據(jù)集來進(jìn)行訓(xùn)練,但預(yù)測時(shí)你卻不能忽略包含空值的對象。另外,C4.5和使用所有可能的值填充方法也有較好的補(bǔ)齊效果,人工填寫和特殊值填充則是一般不推薦使用的。
Pandas中的fillna方法
DataFrame.fillna(value=None,method=None,axis=None,inplace=False,limit=None,downcast=None,**kwargs)
參數(shù)說明:
value:接收常數(shù)、dict、Series 或 DataFrame,表示填充缺失值的值。 method:表示填充缺失值的方法,method 的取值為{’pad’,’ffill’,’backfill’,’bfill’,None}。pad/ffill:用前一個非缺失值去填充該缺失值。backfill/bfill:用下一個非缺失值去填充該缺失值。None:指定一個值去替換缺失值(缺省默認(rèn)這種方式)。 axis:指定填充方向,當(dāng) axis=1 按列填充,axis=0 按行填充。 inplace:接收 True 或 False。True 表示直接修改原對象,F(xiàn)alse 表示創(chuàng)建一個副本,修改副本,原對象不變,默認(rèn)為 False。 limit:表示限制填充的個數(shù),如果 limit=2,則只填充兩個缺失值。 downcast:默認(rèn)為 None,如果需要將填充的值向下轉(zhuǎn)換為適當(dāng)?shù)南嗟葦?shù)據(jù)類型的數(shù)值,如將 float64 數(shù)據(jù)類型轉(zhuǎn)換為 int64 數(shù)據(jù)類型時(shí),則此參數(shù)的值為 ‘infer’。代碼示例:
# 用常量0填充
df1 = df.fillna(0)
# 用字典填充
df2 = df.fillna({'Normal':60,'exam':40})
# 指定method = 'ffill'/'pad':用前一個非缺失值去填充該缺失值
df2 = df.fillna(method='ffill')
# 將exam列的缺失值用均值替換
exa_mea = df['exam'].fillna(df['exam'].mean())
# 將Normal列的缺失值用中位數(shù)替換
Nor_med = df['Normal'].fillna(df['Normal'].median())
# 使眾數(shù)(mode)填充
df['Normal'].fillna(df['Normal'].mode())
# 使用隨機(jī)方式填充
df["column"].fillna(lambda x: random.choice(df[df[column] != np.nan]["column"]), inplace =True)
Pandas中的interpolate()方法
Series 和 DataFrame 對象都有interpolate()方法,默認(rèn)情況下,該函數(shù)在缺失值處執(zhí)行線性插值。這個方法是利用數(shù)學(xué)方法來估計(jì)缺失點(diǎn)的值,對于較大的數(shù)據(jù)非常有用。
DataFrame.interpolate(self, method='linear', axis=0, limit=None, inplace=False, limit_direction='forward', limit_area=None, downcast=None, **kwargs)
參數(shù)說明:
method :str,默認(rèn)為linear,差值方法可選參數(shù): linear:忽略索引,并將值等距地對待。這是MultiIndexes支持的唯一方法。 time:處理每日和更高分辨率的數(shù)據(jù),以內(nèi)插給定的時(shí)間間隔長度。 index,values:索引,值,使用索引的實(shí)際數(shù)值 pad:使用現(xiàn)有值填寫NaN。 nearest, zero, slinear, quadratic, cubic, spline, barycentric, polynomial:傳遞給interpolate.interp1d,這些方法使用索引的數(shù)值。polynomial 和 spline都要求您還指定一個順序(int),例如 df.interpolate(method=’polynomial’,order=5) nearest:最近 zero:零 slinear:線性 quadratic:二次方 cubic:立方 spline:花鍵,樣條插值 barycentric:重心插值 polynomial:多項(xiàng)式 krogh, piecewise_polynomial, spline, pchip, akima: SciPy 類似名稱的插值方法。 krogh: 克羅格插值 piecewise_polynomial: 分段多項(xiàng)式 spline: 樣條插值 pchip: 立方插值 akima: 阿克瑪插值 from_derivatives:指interpolate.BPoly.from_derivatives,它替換了 scipy 0.18 中的 piecewise_polynomial 插值方法。 axis: 插值應(yīng)用的軸方向,可選擇 {0 or index, 1 or columns, None}, 默認(rèn)為 None limitint: 要填充的連續(xù) NaN 的最大數(shù)量, 必須大于 0。 inplace: 是否將最終結(jié)果替換原數(shù)據(jù),默認(rèn)為 False limit_direction: 限制方向,可傳入 {forward, backward, both}, 默認(rèn)forward,如果指定了限制,則將沿該方向填充連續(xù)的 NaN limit_area: 限制區(qū)域,可傳入 {None, inside, outside}, 默認(rèn) None,如果指定了限制,則連續(xù)的NaN將被此限制填充 None: 沒有填充限制 inside: 僅填充有效值包圍的NaN(內(nèi)插) outside: 僅將NaN填充到有效值之外(外推) downcast: 可傳入‘infer’ 或者 None, 默認(rèn)是 None,如果可以向下轉(zhuǎn)換 dtypes **kwargs: 傳遞給插值函數(shù)的關(guān)鍵字參數(shù)
常用的有以下幾種方法:
鄰近點(diǎn)插值(method=’nearest’)。 線性插值(method=’linear’):在兩個數(shù)據(jù)點(diǎn)之間連接直線,計(jì)算給定的插值點(diǎn)在直線上的值作為插值結(jié)果,該方法是interp1函數(shù)的默認(rèn)方法。 三次樣條插值(method=’spline’):通過數(shù)據(jù)點(diǎn)擬合出三次樣條曲線,計(jì)算給定的插值點(diǎn)在曲線上的值作為插值結(jié)果。 立方插值(method=’pchip’ or ‘cubic’):通過分段立方Hermite插值方法計(jì)算插值結(jié)果。
選擇一種插值方法時(shí),考慮的因素包括運(yùn)算時(shí)間、占用計(jì)算機(jī)內(nèi)存和插值的光滑程度。一般來說:
鄰近點(diǎn)插值方法的速度最快,但平滑性最差; 線性插值方法占用的內(nèi)存較鄰近點(diǎn)插值方法多,運(yùn)算時(shí)間也稍長,與鄰近點(diǎn)插值不同,其結(jié)果是連續(xù)的,但頂點(diǎn)處的斜率會改變; 三次樣條插值方法的運(yùn)算時(shí)間最長,但內(nèi)存的占用較立方插值法要少,但其插值數(shù)據(jù)和導(dǎo)數(shù)都是連續(xù)的。在這4種方法中,三次樣條插值結(jié)果的平滑性最好,但如果輸入數(shù)據(jù)不一致或數(shù)據(jù)點(diǎn)過近,就可能出現(xiàn)很差的插值效果。
隨機(jī)森林填補(bǔ)法
任何回歸都是從特征矩陣中學(xué)習(xí),然后求解連續(xù)性標(biāo)簽y的值,之所以能實(shí)現(xiàn)這個過程,是因?yàn)榛貧w算法認(rèn)為,特征矩陣和標(biāo)簽之前存在著某種關(guān)系,實(shí)際上特征和標(biāo)簽是可以相互轉(zhuǎn)化的,比如說用地區(qū),環(huán)境,附近學(xué)校數(shù)量預(yù)測房價(jià)的問題,我們既可以用地區(qū),環(huán)境,附近學(xué)校數(shù)量的數(shù)據(jù)來預(yù)測房價(jià),也可以反過來,用環(huán)境,附近學(xué)校數(shù)量和房價(jià)來預(yù)測地區(qū),而回歸填補(bǔ)缺失值,正式利用了這種情況。
def fill_dependents_missing(data, to_fill):
df = data.copy()
columns = [*df.columns]
columns.remove(to_fill)
X = df.loc[:, columns]
y = df.loc[:, to_fill]
X_train = X.loc[df[to_fill].notnull()]
y_train = y.loc[df[to_fill].notnull()]
X_pred = X.loc[df[to_fill].isnull()]
rfr = RandomForestRegressor(random_state=22, n_estimators=200, max_depth=3, n_jobs=-1)
rfr.fit(X_train, y_train)
y_pred = rfr.predict(X_pred).round()
df.loc[df[to_fill].isnull(), to_fill] = y_pred
return df
不處理缺失值
在數(shù)據(jù)預(yù)處理階段,對于具有缺失值的數(shù)據(jù)記錄不做任何處理,也是一種思路。這種思路主要看后期的數(shù)據(jù)分析和建模應(yīng)用,很多模型對于缺失值有容忍度或靈活的處理方法,因此在預(yù)處理階段可以不做處理。
常見的能夠自動處理缺失值的模型包括:KNN、決策樹和隨機(jī)森林、神經(jīng)網(wǎng)絡(luò)和樸素貝葉斯、DBSCAN(基于密度的帶有噪聲的空間聚類)等。這些模型對于缺失值的處理思路是:
忽略,缺失值不參與距離計(jì)算,例如KNN。 將缺失值作為分布的一種狀態(tài),并參與到建模過程,例如各種決策樹及其變體。 不基于距離做計(jì)算,因此基于值的距離做計(jì)算本身的影響就消除了,例如DBSCAN。
在數(shù)據(jù)建模前的數(shù)據(jù)歸約階段,有一種歸約的思路是降維,降維中有一種直接選擇特征的方法。假如我們通過一定方法確定帶有缺失值(無論缺少字段的值缺失數(shù)量有多少)的字段對于模型的影響非常小,那么我們根本就不需要對缺失值進(jìn)行處理。
因此,后期建模時(shí)的字段或特征的重要性判斷也是決定是否處理字段缺失值的重要參考因素之一。
對于缺失值的處理思路是先通過一定方法找到缺失值,接著分析缺失值在整體樣本中的分布占比,以及缺失值是否具有顯著的無規(guī)律分布特征,然后考慮后續(xù)要使用的模型中是否能滿足缺失值的自動處理,最后決定采用哪種缺失值處理方法。

相關(guān)閱讀:
