99999久久久久久亚洲,欧美人与禽猛交狂配,高清日韩av在线影院,一个人在线高清免费观看,啦啦啦在线视频免费观看www

熱線電話:13121318867

登錄
首頁精彩閱讀如何使用Python處理Missing Data
如何使用Python處理Missing Data
2017-06-05
收藏

如何使用Python處理Missing Data

現(xiàn)實世界的數(shù)據(jù)中常常包含缺失的數(shù)據(jù)。原因很多,比如觀察結果沒有記錄,或數(shù)據(jù)損壞。處理缺失的數(shù)據(jù)很重要,因為許多機器學習算法不支持具有缺失值的數(shù)據(jù)庫。

本教程將討論如何使用Python處理缺失的數(shù)據(jù)來進行機器學習
您將了解到:
- 如何在數(shù)據(jù)集中標記無效或損壞的值。
- 如何從數(shù)據(jù)集中刪除缺失數(shù)據(jù)的行。
- 如何使用數(shù)據(jù)集的均值估算缺失值。
注意:文章中的例子前提是安裝了Python 2或3,Pandas,NumPy和Scikit-Learn的;特別是scikit-learn版本0.18或更高版本。
概述
本教程分為6部分:
皮馬印度人糖尿病數(shù)據(jù)集:我們在哪里查看已知缺失值的數(shù)據(jù)集。
標記缺失值:我們學習如何在數(shù)據(jù)集中標記缺失值。
缺少值導致的問題: 機器學習算法如果包含缺少值,將會如何失敗。
刪除缺少值的行: 如何刪除包含缺失值的行。
估算缺失值:我們用合理的值替換缺失值。
允許缺失值的算法:哪些算法允許缺失值。
首先,我們來看看缺少值的示例數(shù)據(jù)集。
1、皮馬印度人糖尿病數(shù)據(jù)集
皮馬印第安人糖尿病數(shù)據(jù)集根據(jù)現(xiàn)有的醫(yī)療信息預測5年內皮馬印第安人糖尿病發(fā)作的概率。
這是兩類(2-class)分組問題,每組的觀察標本量不同。共有768個觀測值,8個輸入變量和1個輸出變量。變量名稱如下:
0.懷孕次數(shù)。
1. 口服葡萄糖耐量試驗中血漿葡萄糖濃度為2小時。
2. 舒張壓(mm Hg)。
3. 三頭肌組織褶厚度(mm)。
4. 2小時血清胰島素(μU/ ml)。
5. 體重指數(shù)(kg/ (身高(m))^ 2)。
6. 糖尿病系統(tǒng)功能。
7. 年齡(歲)。
8. 類變量(0或1)。
預測的標準是大約65%的分類精準度。最好結果的分類精度約為77%。

以下列出前5行的樣本。

已知此數(shù)據(jù)集具有缺失值。具體來說,某些列標記為零,即為缺少觀察值。
我們可以通過這些列的意義和這些度量值是否可能為零來證實這一點,例如體重指數(shù)或血壓為零是不可能的。
從這里下載數(shù)據(jù)集到當前工作目錄中,并命名為pima-indians-diabetes.csv的。
2、標記缺失值
在本節(jié)中,我們將識別并值標記缺失值。
我們可以使用圖表(plots)和匯總統(tǒng)計信息來幫助識別缺失或損壞的數(shù)據(jù)。

我們可以將數(shù)據(jù)集加載為Pandas DataFrame,并查看每個屬性的統(tǒng)計摘要。

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

讓我們來看看原始數(shù)據(jù),這個例子顯示出前20行的數(shù)據(jù)。

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

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

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

在我們標記了缺失值之后,我們可以使用isnull()函數(shù)將數(shù)據(jù)集中的所有NaN值標記為真,并獲取每列缺失值的計數(shù)。

運行每列中缺少值的數(shù)量,我們可以看到列1:5的列數(shù)與之前運行的零值相同。這表示我們已經正確標記了已識別的缺失值。

我們可以看到列1到5具有與上面標識的零值相同數(shù)量的缺失值。這是一個跡象,表示我們已經正確標記了已識別的缺失值。

這是一個很有用的總結。我總是喜歡看實際數(shù)據(jù),以確認自己沒有弄錯。

以下是相同的例子,只是我們打印前20行的數(shù)據(jù)。

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

在我們進一步處理缺失值之前,首先來看看數(shù)據(jù)集中缺失值可能會導致的問題。
3、缺少值導致問題
在數(shù)據(jù)集中缺少值可能會導致機器學習算法產生錯誤。
在本節(jié)中,我們將嘗試評估帶有缺失值的數(shù)據(jù)對線性判別分析(LDA)算法的影響。
當數(shù)據(jù)集中缺少值時,這種算法將無效。

下面的例子標記了數(shù)據(jù)集中的缺失值,就像我們在上一節(jié)中所做的那樣,然后嘗試使用3倍交叉驗證來評估LDA,求平均精度。

正如我們所料。我們無法在有缺失值的數(shù)據(jù)集上評估LDA和其他一些算法。
現(xiàn)在,我們來看看處理缺失值的方法。
4、刪除缺失值的行
最簡單的方法就是刪除包含缺失值的行。
我們可以通過創(chuàng)建一個新的Pandas DataFrame,其中缺失值的行已經被刪除。

Pandas提供了dropna ( ) 函數(shù),可用于刪除列或缺少數(shù)據(jù)的行。我們可以使用dropna ( )來刪除所有缺少數(shù)據(jù)的行,如下所示:

我們現(xiàn)在有一個數(shù)據(jù)集,我們可以使用它來評估LDA等對缺失值敏感的算法。

刪除缺失值的行可能對不適用與某些預測建模問題,另一種方法則是估算丟失值。
5、估算缺失值
引用(imputing),指使用模型替換缺失值。
在替換缺少的值時可以考慮許多選擇,例如:
? 在域內具有含義的常量值,例如0,不同于其他所有值。
? 來自另一個隨機記錄的值。
? 該列的平均值,中值或模式值。
? 由另一預測模型估計的值。
如果最終模型需要做預測,那么所有對于訓練數(shù)據(jù)集進行的imputing都要應用到未來的新數(shù)據(jù)中。這會影響我們選擇如何估算缺失值。
例如,如果您選擇使用平均列值進行估算,這些平均值的列將需要存儲到文件中,以備將來新數(shù)據(jù)含有缺失值時使用。

Pandas提供了fillna ( ) 函數(shù)來替換具有特定值的缺失值。例如,我們可以使用fillna ( ),平均值來替換每列的缺失值,如下所示:

運行每列中缺少值的計數(shù),顯示缺失值為零。

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

無論哪種情況,我們都可以對缺失值敏感的算法(如LDA)使用轉化后的數(shù)據(jù)集進行訓練 。

下面的例子顯示了在Imputer轉換數(shù)據(jù)集中訓練LDA算法

嘗試用其他值替換缺少的值,并查看是否可以提升模型的表現(xiàn)。
也許缺少值在數(shù)據(jù)中是有意義的。
接下來,我們將使用將缺失值視為另一個值的做法。
6、支持缺失值的算法
當缺少數(shù)據(jù)時,并不是所有的算法都會失效。
有一些可以靈活對待缺失值的算法,例如k-Nearest Neighbors,當值缺失時,它可以將其不計入距離測量。
另一些算法,例如分類和回歸樹,可以在構建預測模型時將缺失值看作唯一且不同的值。
遺憾的是,決策樹和k-Nearest Neighbors對于缺失值并不友好。

不管怎樣,如果你考慮使用其他算法(如xgboost)或開發(fā)自己的執(zhí)行,這依然是一個選擇

數(shù)據(jù)分析咨詢請掃描二維碼

若不方便掃碼,搜微信號:CDAshujufenxi

數(shù)據(jù)分析師考試動態(tài)
數(shù)據(jù)分析師資訊
更多

OK
客服在線
立即咨詢
客服在線
立即咨詢
') } function initGt() { var handler = function (captchaObj) { captchaObj.appendTo('#captcha'); captchaObj.onReady(function () { $("#wait").hide(); }).onSuccess(function(){ $('.getcheckcode').removeClass('dis'); $('.getcheckcode').trigger('click'); }); window.captchaObj = captchaObj; }; $('#captcha').show(); $.ajax({ url: "/login/gtstart?t=" + (new Date()).getTime(), // 加隨機數(shù)防止緩存 type: "get", dataType: "json", success: function (data) { $('#text').hide(); $('#wait').show(); // 調用 initGeetest 進行初始化 // 參數(shù)1:配置參數(shù) // 參數(shù)2:回調,回調的第一個參數(shù)驗證碼對象,之后可以使用它調用相應的接口 initGeetest({ // 以下 4 個配置參數(shù)為必須,不能缺少 gt: data.gt, challenge: data.challenge, offline: !data.success, // 表示用戶后臺檢測極驗服務器是否宕機 new_captcha: data.new_captcha, // 用于宕機時表示是新驗證碼的宕機 product: "float", // 產品形式,包括:float,popup width: "280px", https: true // 更多配置參數(shù)說明請參見:http://docs.geetest.com/install/client/web-front/ }, handler); } }); } function codeCutdown() { if(_wait == 0){ //倒計時完成 $(".getcheckcode").removeClass('dis').html("重新獲取"); }else{ $(".getcheckcode").addClass('dis').html("重新獲取("+_wait+"s)"); _wait--; setTimeout(function () { codeCutdown(); },1000); } } function inputValidate(ele,telInput) { var oInput = ele; var inputVal = oInput.val(); var oType = ele.attr('data-type'); var oEtag = $('#etag').val(); var oErr = oInput.closest('.form_box').next('.err_txt'); var empTxt = '請輸入'+oInput.attr('placeholder')+'!'; var errTxt = '請輸入正確的'+oInput.attr('placeholder')+'!'; var pattern; if(inputVal==""){ if(!telInput){ errFun(oErr,empTxt); } return false; }else { switch (oType){ case 'login_mobile': pattern = /^1[3456789]\d{9}$/; if(inputVal.length==11) { $.ajax({ url: '/login/checkmobile', type: "post", dataType: "json", data: { mobile: inputVal, etag: oEtag, page_ur: window.location.href, page_referer: document.referrer }, success: function (data) { } }); } break; case 'login_yzm': pattern = /^\d{6}$/; break; } if(oType=='login_mobile'){ } if(!!validateFun(pattern,inputVal)){ errFun(oErr,'') if(telInput){ $('.getcheckcode').removeClass('dis'); } }else { if(!telInput) { errFun(oErr, errTxt); }else { $('.getcheckcode').addClass('dis'); } return false; } } return true; } function errFun(obj,msg) { obj.html(msg); if(msg==''){ $('.login_submit').removeClass('dis'); }else { $('.login_submit').addClass('dis'); } } function validateFun(pat,val) { return pat.test(val); }