1. 程式人生 > >空值法填充

空值法填充

hot 過多 另一個 標準 assign multiple 數據采集 至少 出發點

空值填充算法

編寫人員:夏思彬,劉澤寧

簡介

造成數據缺失的原因

現實世界中的數據異常雜亂,屬性值缺失的情況經常發全甚至是不可避免的。造成數據缺失的原因是多方面的:

  • 信息暫時無法獲取。例如在醫療數據庫中,並非所有病人的所有臨床檢驗結果都能在給定的時間內得到,就致使一部分屬性值空缺出來。
  • 信息被遺漏。可能是因為輸入時認為不重要、忘記填寫了或對數據理解錯誤而遺漏,也可能是由於數據采集設備的故障、存儲介質的故障、傳輸媒體的故障、一些人為因素等原因而丟失。
  • 有些對象的某個或某些屬性是不可用的。如一個未婚者的配偶姓名、一個兒童的固定收入狀況等。
  • 有些信息(被認為)是不重要的。如一個屬性的取值與給定語境是無關。
  • 獲取這些信息的代價太大。
  • 系統實時性能要求較高。即要求得到這些信息前迅速做出判斷或決策。

缺失的類型

在對缺失數據進行處理前,了解數據缺失的機制和形式是十分必要的。將數據集中不含缺失值的變量稱為完全變量,數據集中含有缺失值的變量稱為不完全變量。從缺失的分布來將缺失可以分為完全隨機缺失,隨機缺失和完全非隨機缺失。

  • 完全隨機缺失(missing completely at random,MCAR):指的是數據的缺失是完全隨機的,不依賴於任何不完全變量或完全變量,不影響樣本的無偏性。如家庭地址缺失。
  • 隨機缺失(missing at random,MAR):指的是數據的缺失不是完全隨機的,即該類數據的缺失依賴於其他完全變量。例如財務數據缺失情況與企業的大小有關。
  • 非隨機缺失(missing not at random,MNAR):指的是數據的缺失與不完全變量自身的取值有關。如高收入人群的不原意提供家庭收入。

對於隨機缺失和非隨機缺失,刪除記錄是不合適的,隨機缺失可以通過已知變量對缺失值進行估計;而非隨機缺失還沒有很好的解決辦法。

說明:對於分類問題,可以分析缺失的樣本中,類別之間的比例和整體數據集中,類別的比例

用途

缺失值處理的必要性

數據缺失在許多研究領域都是一個復雜的問題。對數據挖掘來說,缺省值的存在,造成了以下影響:

  • 系統丟失了大量的有用信息;
  • 系統中所表現出的不確定性更加顯著,系統中蘊涵的確定性成分更難把握;
  • 包含空值的數據會使挖掘過程陷入混亂,導致不可靠的輸出。

數據挖掘算法本身更致力於避免數據過分擬合所建的模型,這一特性使得它難以通過自身的算法去很好地處理不完整數據。因此,缺省值需要通過專門的方法進行推導、填充等,以減少數據挖掘算法與實際應用之間的差距。

可用的算法及優缺點

處理不完整數據集的方法主要有三大類:刪除元組、數據補齊、不處理。

刪除元組

也就是將存在遺漏信息屬性值的對象(元組,記錄)刪除,從而得到一個完備的信息表。這種方法簡單易行,在對象有多個屬性缺失值、被刪除的含缺失值的對象與初始數據集的數據量相比非常小的情況下非常有效,類標號缺失時通常使用該方法。

然而,這種方法卻有很大的局限性。它以減少歷史數據來換取信息的完備,會丟棄大量隱藏在這些對象中的信息。在初始數據集包含的對象很少的情況下,刪除少量對象足以嚴重影響信息的客觀性和結果的正確性;因此,當缺失數據所占比例較大,特別當遺漏數據非隨機分布時,這種方法可能導致數據發生偏離,從而引出錯誤的結論。

說明:刪除元組,或者直接刪除該列特征,有時候會導致性能下降。

數據補齊

這類方法是用一定的值去填充空值,從而使信息表完備化。通常基於統計學原理,根據初始數據集中其余對象取值的分布情況來對一個缺失值進行填充。數據挖掘中常用的有以下幾種補齊方法:

人工填寫(filling manually)

由於最了解數據的還是用戶自己,因此這個方法產生數據偏離最小,可能是填充效果最好的一種。然而一般來說,該方法很費時,當數據規模很大、空值很多的時候,該方法是不可行的。

特殊值填充(Treating Missing Attribute values as Special values)

將空值作為一種特殊的屬性值來處理,它不同於其他的任何屬性值。如所有的空值都用“unknown”填充。這樣將形成另一個有趣的概念,可能導致嚴重的數據偏離,一般不推薦使用。

平均值填充(Mean/Mode Completer)

將初始數據集中的屬性分為數值屬性和非數值屬性來分別進行處理。
如果空值是數值型的,就根據該屬性在其他所有對象的取值的平均值來填充該缺失的屬性值;
如果空值是非數值型的,就根據統計學中的眾數原理,用該屬性在其他所有對象的取值次數最多的值(即出現頻率最高的值)來補齊該缺失的屬性值。與其相似的另一種方法叫條件平均值填充法(Conditional Mean Completer)。在該方法中,用於求平均的值並不是從數據集的所有對象中取,而是從與該對象具有相同決策屬性值的對象中取得。
這兩種數據的補齊方法,其基本的出發點都是一樣的,以最大概率可能的取值來補充缺失的屬性值,只是在具體方法上有一點不同。與其他方法相比,它是用現存數據的多數信息來推測缺失值。

熱卡填充(Hot deck imputation,或就近補齊)

對於一個包含空值的對象,熱卡填充法在完整數據中找到一個與它最相似的對象,然後用這個相似對象的值來進行填充。不同的問題可能會選用不同的標準來對相似進行判定。該方法概念上很簡單,且利用了數據間的關系來進行空值估計。這個方法的缺點在於難以定義相似標準,主觀因素較多。

K最近距離鄰法(K-means clustering)

先根據歐式距離或相關分析來確定距離具有缺失數據樣本最近的K個樣本,將這K個值加權平均來估計該樣本的缺失數據。

使用所有可能的值填充(Assigning All Possible values of the Attribute)

用空缺屬性值的所有可能的屬性取值來填充,能夠得到較好的補齊效果。但是,當數據量很大或者遺漏的屬性值較多時,其計算的代價很大,可能的測試方案很多。

組合完整化方法(Combinatorial Completer)

用空缺屬性值的所有可能的屬性取值來試,並從最終屬性的約簡結果中選擇最好的一個作為填補的屬性值。這是以約簡為目的的數據補齊方法,能夠得到好的約簡結果;但是,當數據量很大或者遺漏的屬性值較多時,其計算的代價很大。

回歸(Regression)

基於完整的數據集,建立回歸方程。對於包含空值的對象,將已知屬性值代入方程來估計未知屬性值,以此估計值來進行填充。當變量不是線性相關時會導致有偏差的估計。

期望值最大化方法(Expectation maximization,EM)

EM算法是一種在不完全數據情況下計算極大似然估計或者後驗分布的叠代算法。在每一叠代循環過程中交替執行兩個步驟:E步(Excepctaion step,期望步),在給定完全數據和前一次叠代所得到的參數估計的情況下計算完全數據對應的對數似然函數的條件期望;M步(Maximzation step,極大化步),用極大化對數似然函數以確定參數的值,並用於下步的叠代。算法在E步和M步之間不斷叠代直至收斂,即兩次叠代之間的參數變化小於一個預先給定的閾值時結束。該方法可能會陷入局部極值,收斂速度也不是很快,並且計算很復雜。

多重填補(Multiple Imputation,MI)

多重填補方法分為三個步驟:

  1. 為每個空值產生一套可能的填補值,這些值反映了無響應模型的不確定性;每個值都被用來填補數據集中的缺失值,產生若幹個完整數據集合。
  2. 每個填補數據集合都用針對完整數據集的統計方法進行統計分析。
  3. 對來自各個填補數據集的結果進行綜合,產生最終的統計推斷,這一推斷考慮到了由於數據填補而產生的不確定性。該方法將空缺值視為隨機樣本,這樣計算出來的統計推斷可能受到空缺值的不確定性的影響。該方法的計算也很復雜。

C4.5方法

通過尋找屬性間的關系來對遺失值填充。它尋找之間具有最大相關性的兩個屬性,其中沒有遺失值的一個稱為代理屬性,另一個稱為原始屬性,用代理屬性決定原始屬性中的遺失值。這種基於規則歸納的方法只能處理基數較小的名詞型屬性。

就幾種基於統計的方法而言,刪除元組法和平均值法差於熱卡填充法、期望值最大化方法和多重填充法;回歸是比較好的一種方法,但仍比不上hot deck和EM;EM缺少MI包含的不確定成分。值得註意的是,這些方法直接處理的是模型參數的估計而不是空缺值預測本身。它們合適於處理無監督學習的問題,而對有監督學習來說,情況就不盡相同了。譬如,你可以刪除包含空值的對象用完整的數據集來進行訓練,但預測時你卻不能忽略包含空值的對象。另外,C4.5和使用所有可能的值填充方法也有較好的補齊效果,人工填寫和特殊值填充則是一般不推薦使用的。

不處理

補齊處理只是將未知值補以我們的主觀估計值,不一定完全符合客觀事實,在對不完備信息進行補齊處理的同時,我們或多或少地改變了原始的信息系統。而且,對空值不正確的填充往往將新的噪聲引入數據中,使挖掘任務產生錯誤的結果。因此,在許多情況下,我們還是希望在保持原始信息不發生變化的前提下對信息系統進行處理。

不處理缺失值,直接在包含空值的數據上進行數據挖掘的方法包括貝葉斯網絡和人工神經網絡等。

貝葉斯網絡提供了一種自然的表示變量間因果信息的方法,用來發現數據間的潛在關系。在這個網絡中,用節點表示變量,有向邊表示變量間的依賴關系。貝葉斯網絡僅適合於對領域知識具有一定了解的情況,至少對變量間的依賴關系較清楚的情況。否則直接從數據中學習貝葉斯網的結構不但復雜性較高(隨著變量的增加,指數級增加),網絡維護代價昂貴,而且它的估計參數較多,為系統帶來了高方差,影響了它的預測精度。

人工神經網絡可以有效的對付缺失值,但人工神經網絡在這方面的研究還有待進一步深入展開。

知乎上的一種方案:

4.把變量映射到高維空間。比如性別,有男、女、缺失三種情況,則映射成3個變量:是否男、是否女、是否缺失。連續型變量也可以這樣處理。比如Google、百度的CTR預估模型,預處理時會把所有變量都這樣處理,達到幾億維。這樣做的好處是完整保留了原始數據的全部信息、不用考慮缺失值、不用考慮線性不可分之類的問題。缺點是計算量大大提升。

而且只有在樣本量非常大的時候效果才好,否則會因為過於稀疏,效果很差。

總結

大多數數據挖掘系統都是在數據挖掘之前的數據預處理階段采用第一、第二類方法來對空缺數據進行處理。並不存在一種處理空值的方法可以適合於任何問題。無論哪種方式填充,都無法避免主觀因素對原系統的影響,並且在空值過多的情形下將系統完備化是不可行的。從理論上來說,貝葉斯考慮了一切,但是只有當數據集較小或滿足某些條件(如多元正態分布)時完全貝葉斯分析才是可行的。而現階段人工神經網絡方法在數據挖掘中的應用仍很有限。值得一提的是,采用不精確信息處理數據的不完備性已得到了廣泛的研究。不完備數據的表達方法所依據的理論主要有可信度理論、概率論、模糊集合論、可能性理論,D-S的證據理論等。

目前實現方式

目前所實現的三種方式均可歸類為上文中的回歸方式。

1、 基於小區時間序列數據的多項式擬合,實現小區某一時間均價的空值填充

實現原理:

算法以小區為單位進行空值填充,以時間為自變量x,均價為因變量y,假設時間與均價之間的擬合函數為形如 y = ax^5 + bx^4 + cx^3 + dx^2 + ex + f 的一元5次方程(該方程的圖形為一條二維空間的曲線),將已有的自變量與因變量數據代入,求解函數中的a、b、c、d、e、f系數。

系數解出後,將參數反代回方程,這樣就得到了完整的擬合方程,這時將空值所在的某一時間x1代入擬合方程,就能得到當前小區在x1時間的均價y1。

2、 基於最小二乘法的空間曲面擬合,實現同一時刻商區中某一小區均價的空值填充

實現原理:

與多項式擬合思路類似,算法以某一時間的商圈為單位進行空值填充,以緯度為自變量x,經度為自變量y,均價為因變量z,假設經緯度與均價之間的擬合函數為形如 z = ax^2 + by^2 + cx + dy + exy + f 的二元2次方程(該方程的圖形為一個三維空間的曲面),將已有的自變量與因變量數據代入,求解函數中的a、b、c、d、e、f系數。

系數解出後,將參數反代回方程,得到完整的擬合方程,這時將空值所在的某一小區經緯度x1、y1代入擬合方程,就能得到該小區的均價z1

關於擬合函數模型的選擇:

擬合函數的選擇是擬合的基礎,是否選擇了合適的關系函數關系到擬合後模型的精準度好壞。關系函數有二維的如:y = ax + b(線性函數)、y = ax^2 + bx + c(二次多項式函數)、y = a*e^(bx)(指數函數)等,三維的如:z = ax + by(平面)、z = ax^2 + by^2 + cx + dy + exy + f(二次曲面)、z^2 = (x + a)^2 + (y + b)^2(柱面)等。具體選擇關系函數時,應根據已有數據的離散分布情況,函數自身的基本特性,及已有數據量來綜合考量。

在空值填充的實現中選擇多項式函數與三維曲面函數進行擬合的原因:

多項式函數相較於其他二維函數,可以做到一定程度的波動,能夠更好地貼合真實數據。

二次曲面相較於其他三維函數,具有易於建模,較為貼合真實數據的優點,相較於更高次的曲面,具有建模時需求數據量小的優點。

關於最小二乘擬合算法原理:

根據兩個變量的實驗數據找出它們之間的近似函數表達式f(x),即經驗公式。

若f(x)為線性函數,則相應問題為線性最小二乘問題,否則稱為非線性最小二乘問題。

線性最小二乘問題可以借助多元微分學知識通過求解方程組得到。

非線性最小二乘問題求解比較困難,一般要借用線性化方法(例如將化學反應的速度用指數函數來表示)或最優方法(搜索算法和叠代算法)才行。

不論是二維擬合還是三維擬合,最小二乘擬合算法都是在確定擬合函數模型後,將已有的各組數據全部代入,通過一系列矩陣運算,求解未知系數的過程。根據矩陣相關定理,已有數據的組數必須大於等於未知系數個數,否則導致矩陣無解,進而無法得到擬合函數。當已有數據的組數等於未知系數個數時,解出的擬合函數將經過所有已有的數據點;當已有數據的組數大於未知系數個數時,解出的擬合函數將會盡量貼合已有數據點。具體的矩陣運算操作不作贅述。

3、 基於移動最小二乘(MLS)的曲面構造

移動最小二乘法

在離散的點雲中,求曲線曲面擬合,不能簡單地連接這些點,如果知道曲線曲面的形式,如為二次曲線等,可以簡單地使用最小二乘法估計參數;但如果曲線曲面形式未知,可以使用移動最小二乘法。

移動最小二乘法與傳統的最小二乘法相比,有兩個比較大的改進【1】:

(1)擬合函數的建立不同。這種方法建立擬合函數不是采用傳統的多項式或其它函數,而是由一個系數向量a(x)和基函數p(x)構成,這裏a(x)不是常數,而是坐標x 的函數。

(2)引入緊支(Compact Support)概念,認為點x 處的值y 只受x 附近子域內節點影響,這個子域稱作點x 的影響區域,影響區域外的節點對x的取值沒有影響。在影響區域上定義一個權函數w(x),如果權函數在整個區域取為常數,就得到傳統的最小二乘法。

這些改進能夠帶來許多優點,減緩或解決傳統曲線曲面擬合過程中存在的困難。可以取不同階的基函數以獲得不同的精度,取不同的權函數以改變擬合曲線(曲面)的光滑度,這是其它擬合方法無法做到的。

從上述的闡述來看,如果取不同的基函數,不同的權函數,不同的影響區域範圍,可以得到不同的擬合效果。

下面介紹一下算法:

如果直接求解出a,那麽可以算出在x處的函數值了。

介紹一下權函數:

在影響區域內,權函數非負,並且沿徑向單調遞減,即隨著到當前x處的距離的增加而遞減。比如:

matlab示例代碼:

x=[0, 0.1, 0.2, 0.3, 0.4, 0.5, 0.6, 0.7, 0.8, 0.9, 1.0];
y=[0, 4, 5, 14, 15, 14.5, 14, 12, 10, 5, 4];
scatter(x,y,‘filled‘);
len_x = length(x);

max_x = max(x);
min_x = min(x);

num = 100;
delta = (max_x-min_x)/num;
x_f =[];
f =[];
max_delta = (max_x-min_x)*3/10;
for i=0:num
x_val = min_x + i*delta;
x_f = [x_f,x_val];
A = zeros(2,2);
B = [];
for j=1:len_x
s = abs(x(j)-x_val)/max_delta;
if s<=0.5
w = 2/3-4*s^2+4*s^3;
elseif s<=1
w = 4/3-4*s+4*s^2-4*s^3/3;
else
w = 0;
end
A = A + w*[1;x(j)]*[1,x(j)];
B = [B,w*[1;x(j)]];
end
f =[f,[1,x_val]*inv(A)*B*y‘];
end
hold on
plot(x_f,f,‘r‘);

代碼說明:使用x、y構建

空值法填充