前言
現實世界的資料中常常包含缺失的資料,原因很多,比如觀察結果沒有記錄,或資料損壞,處理缺失的資料很重要,因為許多機器學習演算法不支持具有缺失值的資料庫,
本教程將討論如何使用Python處理缺失的資料來進行機器學習,

您將了解到:
?如何在資料集中標記無效或損壞的值,
?如何從資料集中洗掉缺失資料的行,
?如何使用資料集的均值估算缺失值,
注意:文章中的例子前提是安裝了Python 2或3,Pandas,NumPy和Scikit-Learn的;特別是scikit-learn版本0.18或更高版本,
概述
本教程分為6部分:
Python學習交流Q群:906715085### ?皮馬印度人糖尿病資料集:我們在哪里查看已知缺失值的資料集, ?標記缺失值:我們學習如何在資料集中標記缺失值, ?缺少值導致的問題: 機器學習演算法如果包含缺少值,將會如何失敗, ?洗掉缺少值的行: 如何洗掉包含缺失值的行, ?估算缺失值:我們用合理的值替換缺失值, ?允許缺失值的演算法:哪些演算法允許缺失值,
首先,我們來看看缺少值的示例資料集,

1、皮馬印度人糖尿病資料集
皮馬印第安人糖尿病資料集根據現有的醫療資訊預測5年內皮馬印第安人糖尿病發作的概率,
這是兩類(2-class)分組問題,每組的觀察標本量不同,共有768個觀測值,8個輸入變數和1個輸出變數,變數名稱如下:
0.懷孕次數,
-
口服葡萄糖耐量試驗中血漿葡萄糖濃度為2小時,
-
舒張壓(mm Hg),
-
三頭肌組織褶厚度(mm),
-
2小時血清胰島素(μU/ ml),
-
體重指數(kg/ (身高(m))^ 2),
-
糖尿病系統功能,
-
年齡(歲),
-
類變數(0或1),
預測的標準是大約65%的分類精準度,最好結果的分類精度約為77%,
以下列出前5行的樣本,

已知此資料集具有缺失值,具體來說,某些列標記為零,即為缺少觀察值,
我們可以通過這些列的意義和這些度量值是否可能為零來證實這一點,例如體重指數或血壓為零是不可能的,

2、標記缺失值
在本節中,我們將識別并值標記缺失值,
我們可以使用圖表(plots)和匯總統計資訊來幫助識別缺失或損壞的資料,
我們可以將資料集加載為Pandas DataFrame,并查看每個屬性的統計摘要,

運行此示例生成以下輸出:

這種方法非常有用,我們可以看到有最小值為零(0)的列,在某些列上,零值無效,表示為無效值或缺失值,
具體來說,以下列具有無效的零最小值:
1:血漿葡萄糖濃度
2:舒張壓
3:三頭肌組織褶厚度
4:2小時血清胰島素
5:體重指數
讓我們來看看原始資料,這個例子顯示出前20行的資料,

運行示例,我們可以清楚地看到列2,3,4和5中的0值,

我們可以得到每列這些列中缺失值的數量,我們可以標記我們感興趣的DataFrame的子集中的所有零值為真,然后,我們可以計算每列中真值的數量,

運行示例得到結果:

我們可以看到1,2和5列只有幾個零值,而第3列和第4列顯示幾乎一半的行都為零值,
這充分表明,不同列可能需要不同的策略來處理,例如確保仍有足夠的資料來訓練預測模型,
在Python中,特別是Pandas,NumPy和Scikit-Learn,我們將缺失值標記為NaN,在sum,count等操作中,NaN值的值將被忽略,
我們可以通過使用Pandas DataFrame里的replace()函式,在感興趣的列的子集上 輕松地將缺失值標記為NaN ,
在我們標記了缺失值之后,我們可以使用isnull()函式將資料集中的所有NaN值標記為真,并獲取每列缺失值的計數,

運行每列中缺少值的數量,我們可以看到列1:5的列數與之前運行的零值相同,這表示我們已經正確標記了已識別的缺失值,
我們可以看到列1到5具有與上面標識的零值相同數量的缺失值,這是一個跡象,表示我們已經正確標記了已識別的缺失值,

這是一個很有用的總結,我總是喜歡看實際資料,以確認自己沒有弄錯,
以下是相同的例子,只是我們列印前20行的資料,

運行后我們可以清楚地看到列2,3,4和5中的NaN值,列1中只有5個丟失值,所以我們在前20行中沒有看到并不奇怪,
從原始資料可以看出,標記丟失值達到我們期望的效果,

在我們進一步處理缺失值之前,首先來看看資料集中缺失值可能會導致的問題,
3、缺少值導致問題
在資料集中缺少值可能會導致機器學習演算法產生錯誤,
在本節中,我們將嘗試評估帶有缺失值的資料對線性判別分析(LDA)演算法的影響,
當資料集中缺少值時,這種演算法將無效,
下面的例子標記了資料集中的缺失值,就像我們在上一節中所做的那樣,然后嘗試使用3倍交叉驗證來評估LDA,求平均精度,

運行示例會導致錯誤,如下所示:

正如我們所料,我們無法在有缺失值的資料集上評估LDA和其他一些演算法,
現在,我們來看看處理缺失值的方法,
4、洗掉缺失值的行
最簡單的方法就是洗掉包含缺失值的行,
我們可以通過創建一個新的Pandas DataFrame,其中缺失值的行已經被洗掉,
Pandas提供了dropna ( ) 函式,可用于洗掉列或缺少資料的行,我們可以使用dropna ( )來洗掉所有缺少資料的行,如下所示:

運行此示例,我們可以看到, 原始資料集中的768行大幅削減到了392行,所有都包含NaN的行都被洗掉了,

我們現在有一個資料集,我們可以使用它來評估LDA等對缺失值敏感的演算法,

例子運行成功,并能得到模型的準確性,

洗掉缺失值的行可能對不適用與某些預測建模問題,另一種方法則是估算丟失值,
5、估算缺失值
參考(imputing),指使用模型替換缺失值,
在替換缺少的值時可以考慮許多選擇,例如:
? 在域內具有含義的常量值,例如0,不同于其他所有值,
? 來自另一個隨機記錄的值,
? 該列的平均值,中值或模式值,
? 由另一預測模型估計的值,
如果最終模型需要做預測,那么所有對于訓練資料集進行的imputing都要應用到未來的新資料中,這會影響我們選擇如何估算缺失值,
例如,如果您選擇使用平均列值進行估算,這些平均值的列將需要存盤到檔案中,以備將來新資料含有缺失值時使用,
Pandas提供了fillna ( ) 函式來替換具有特定值的缺失值,例如,我們可以使用fillna ( ),平均值來替換每列的缺失值,如下所示:

運行每列中缺少值的計數,顯示缺失值為零,

scikit學習庫提供可用于替換缺失值的Imputer ( ) 預處理類,
這是一個很靈活的類,允許指定要替換的值(可以是NaN以外的)和用于替換它的東西(如平均值,中值或模式),Imputer類直接在NumPy陣列而不是DataFrame上運行,
下面的示例使用Imputer類平均值替換每列的缺失值,然后得到轉換矩陣中的NaN值的計數,

運行示例顯示所有NaN值成功歸因,

無論哪種情況,我們都可以對缺失值敏感的演算法(如LDA)使用轉化后的資料集進行訓練 ,
下面的例子顯示了在Imputer轉換資料集中訓練LDA演算法

得到轉換資料集上LDA的準確性,

嘗試用其他值替換缺少的值,并查看是否可以提升模型的表現,
也許缺少值在資料中是有意義的,
接下來,我們將使用將缺失值視為另一個值的做法,

6、支持缺失值的演算法
當缺少資料時,并不是所有的演算法都會失效,
有一些可以靈活對待缺失值的演算法,例如k-Nearest Neighbors,當值缺失時,它可以將其不計入距離測量,
另一些演算法,例如分類和回歸樹,可以在構建預測模型時將缺失值看作唯一且不同的值,
遺憾的是,決策樹和k-Nearest Neighbors對于缺失值并不友好,
不管怎樣,如果你考慮使用其他演算法(如xgboost)或開發自己的執行,這依然是一個選擇,
最后
今天給大家分享的如何使用Python處理Missing Data到這里就結束了,喜歡的小伙伴給個小愛心點點贊,下一章見啦,

轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/456138.html
標籤:其他
