網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
你一定聽說(shuō)過(guò)這句著名的數(shù)據(jù)科學(xué)名言:
在數(shù)據(jù)科學(xué)項(xiàng)目中, 80% 的時(shí)間是在做數(shù)據(jù)處理。
如果你沒有聽過(guò),那么請(qǐng)記住:數(shù)據(jù)清洗是數(shù)據(jù)科學(xué)工作流程的基礎(chǔ)。 機(jī)器學(xué)習(xí)模型會(huì)根據(jù)你提供的數(shù)據(jù)執(zhí)行,混亂的數(shù)據(jù)會(huì)導(dǎo)致性能下降甚至錯(cuò)誤的結(jié)果,而干凈的數(shù)據(jù)是良好模型性能的先決條件。 當(dāng)然干凈的數(shù)據(jù)并不意味著一直都有好的性能,模型的正確選擇(剩余 20%)也很重要,但是沒有干凈的數(shù)據(jù),即使是再?gòu)?qiáng)大的模型也無(wú)法達(dá)到預(yù)期的水平。
在本文中將列出數(shù)據(jù)清洗中需要解決的問(wèn)題并展示可能的解決方案,通過(guò)本文可以了解如何逐步進(jìn)行數(shù)據(jù)清洗。
缺失值
當(dāng)數(shù)據(jù)集中包含缺失數(shù)據(jù)時(shí),在填充之前可以先進(jìn)行一些數(shù)據(jù)的分析。 因?yàn)榭諉卧癖旧淼奈恢每梢愿嬖V我們一些有用的信息。 例如:
- NA值僅在數(shù)據(jù)集的尾部或中間出現(xiàn)。 這意味著在數(shù)據(jù)收集過(guò)程中可能存在技術(shù)問(wèn)題。 可能需要分析該特定樣本序列的數(shù)據(jù)收集過(guò)程,并嘗試找出問(wèn)題的根源。
- 如果列NA數(shù)量超過(guò) 70–80%,可以刪除該列。
- 如果 NA 值在表單中作為可選問(wèn)題的列中,則該列可以被額外的編碼為用戶回答(1)或未回答(0)。
missingno這個(gè)python庫(kù)就可以用于檢查上述情況,并且使用起來(lái)非常的簡(jiǎn)單,例如下圖中的白線是 NA:
import missingno as msno msno.matrix(df)
對(duì)于缺失值的填補(bǔ)計(jì)算有很多方法,例如:
- 平均,中位數(shù),眾數(shù)
- kNN
- 零或常數(shù)等
不同的方法相互之間有優(yōu)勢(shì)和不足,并且沒有適用于所有情況的“最佳”技術(shù)。具體可以參考我們以前發(fā)布的文章
異常值
異常值是相對(duì)于數(shù)據(jù)集的其他點(diǎn)而言非常大或非常小的值。 它們的存在極大地影響了數(shù)學(xué)模型的性能。 讓我們看一下這個(gè)簡(jiǎn)單的示例:
在左圖中沒有異常值,我們的線性模型非常適合數(shù)據(jù)點(diǎn)。 在右圖中有一個(gè)異常值,當(dāng)模型試圖覆蓋數(shù)據(jù)集的所有點(diǎn)時(shí),這個(gè)異常值的存在會(huì)改變模型的擬合方式,并且使我們的模型不適合至少一半的點(diǎn)。
對(duì)于異常值來(lái)說(shuō)我們有必要介紹一下如何確定異常,這就要從數(shù)學(xué)角度明確什么是極大或極小。
大于Q3+1.5 x IQR或小于Q1-1.5 x IQR都可以作為異常值。 IQR(四分位距) 是 Q3 和 Q1 之間的差 (IQR = Q3-Q1)。
可以使用下面函數(shù)來(lái)檢查數(shù)據(jù)集中異常值的數(shù)量:
def number_of_outliers(df): df = df.select_dtypes(exclude = 'object') Q1 = df.quantile(0.25) Q3 = df.quantile(0.75) IQR = Q3 - Q1 return ((df < (Q1 - 1.5 * IQR)) | (df > (Q3 + 1.5 * IQR))).sum()
處理異常值的一種方法是可以讓它們等于 Q3 或 Q1。 下面的lower_upper_range 函數(shù)使用 pandas 和 numpy 庫(kù)查找其外部為異常值的范圍, 然后使用clip 函數(shù)將值裁剪到指定的范圍。
def lower_upper_range(datacolumn): sorted(datacolumn) Q1,Q3 = np.percentile(datacolumn , [25,75]) IQR = Q3 - Q1 lower_range = Q1 - (1.5 * IQR) upper_range = Q3 + (1.5 * IQR) return lower_range,upper_range for col in columns: lowerbound,upperbound = lower_upper_range(df[col]) df[col]=np.clip(df[col],a_min=lowerbound,a_max=upperbound)
數(shù)據(jù)不一致
異常值問(wèn)題是關(guān)于數(shù)字特征的,現(xiàn)在讓我們看看字符類型(分類)特征。 數(shù)據(jù)不一致意味著列的唯一類具有不同的表示形式。 例如在性別欄中,既有m/f,又有male/female。在這種情況下,就會(huì)有4個(gè)類,但實(shí)際上有兩類。
這種問(wèn)題目前沒有自動(dòng)處理的辦法,所以需要手動(dòng)進(jìn)行分析。 pandas 的unique函數(shù)就是為了這個(gè)分析準(zhǔn)備的,下面看一個(gè)汽車品牌的例子:
df['CarName'] = df['CarName'].str.split().str[0] print(df['CarName'].unique())
maxda-mazda, Nissan-nissan, porcshce-porsche, toyouta-toyota等都可以進(jìn)行合并。
df.loc[df['CarName'] == 'maxda', 'CarName'] = 'mazda' df.loc[df['CarName'] == 'Nissan', 'CarName'] = 'nissan' df.loc[df['CarName'] == 'porcshce', 'CarName'] = 'porsche' df.loc[df['CarName'] == 'toyouta', 'CarName'] = 'toyota' df.loc[df['CarName'] == 'vokswagen', 'CarName'] = 'volkswagen' df.loc[df['CarName'] == 'vw', 'CarName'] = 'volkswagen'
無(wú)效數(shù)據(jù)
無(wú)效的數(shù)據(jù)表示在邏輯上根本不正確的值。 例如,
- 某人的年齡是 560;
- 某個(gè)操作花費(fèi)了 -8 小時(shí);
- 一個(gè)人的身高是1200 cm等;
對(duì)于數(shù)值列,pandas的 describe 函數(shù)可用于識(shí)別此類錯(cuò)誤:
df.describe()
無(wú)效數(shù)據(jù)的產(chǎn)生原因可能有兩種:
1、數(shù)據(jù)收集錯(cuò)誤:例如在輸入時(shí)沒有進(jìn)行范圍的判斷,在輸入身高時(shí)錯(cuò)誤的輸入了1799cm 而不是 179cm,但是程序沒有對(duì)數(shù)據(jù)的范圍進(jìn)行判斷。
2、數(shù)據(jù)操作錯(cuò)誤
數(shù)據(jù)集的某些列可能通過(guò)了一些函數(shù)的處理。 例如,一個(gè)函數(shù)根據(jù)生日計(jì)算年齡,但是這個(gè)函數(shù)出現(xiàn)了BUG導(dǎo)致輸出不正確。
以上兩種隨機(jī)錯(cuò)誤都可以被視為空值并與其他 NA 一起估算。
重復(fù)數(shù)據(jù)
當(dāng)數(shù)據(jù)集中有相同的行時(shí)就會(huì)產(chǎn)生重復(fù)數(shù)據(jù)問(wèn)題。 這可能是由于數(shù)據(jù)組合錯(cuò)誤(來(lái)自多個(gè)來(lái)源的同一行),或者重復(fù)的操作(用戶可能會(huì)提交他或她的答案兩次)等引起的。 處理該問(wèn)題的理想方法是刪除復(fù)制行。
可以使用 pandas duplicated 函數(shù)查看重復(fù)的數(shù)據(jù):
df.loc[df.duplicated()]
在識(shí)別出重復(fù)的數(shù)據(jù)后可以使用pandas 的 drop_duplicate 函數(shù)將其刪除:
df.drop_duplicates()
數(shù)據(jù)泄漏問(wèn)題
在構(gòu)建模型之前,數(shù)據(jù)集被分成訓(xùn)練集和測(cè)試集。 測(cè)試集是看不見的數(shù)據(jù)用于評(píng)估模型性能。 如果在數(shù)據(jù)清洗或數(shù)據(jù)預(yù)處理步驟中模型以某種方式“看到”了測(cè)試集,這個(gè)就被稱做數(shù)據(jù)泄漏(data leakage)。 所以應(yīng)該在清洗和預(yù)處理步驟之前拆分?jǐn)?shù)據(jù):
以選擇缺失值插補(bǔ)為例。數(shù)值列中有 NA,采用均值法估算。在 split 前完成時(shí),使用整個(gè)數(shù)據(jù)集的均值,但如果在 split 后完成,則使用分別訓(xùn)練和測(cè)試的均值。
第一種情況的問(wèn)題是,測(cè)試集中的推算值將與訓(xùn)練集相關(guān),因?yàn)槠骄凳钦麄€(gè)數(shù)據(jù)集的。所以當(dāng)模型用訓(xùn)練集構(gòu)建時(shí),它也會(huì)“看到”測(cè)試集。但是我們拆分的目標(biāo)是保持測(cè)試集完全獨(dú)立,并像使用新數(shù)據(jù)一樣使用它來(lái)進(jìn)行性能評(píng)估。所以在操作之前必須拆分?jǐn)?shù)據(jù)集。
雖然訓(xùn)練集和測(cè)試集分別處理效率不高(因?yàn)橄嗤牟僮餍枰M(jìn)行2次),但它可能是正確的。因?yàn)閿?shù)據(jù)泄露問(wèn)題非常重要,為了解決代碼重復(fù)編寫的問(wèn)題,可以使用sklearn 庫(kù)的pipeline。簡(jiǎn)單地說(shuō),pipeline就是將數(shù)據(jù)作為輸入發(fā)送到的所有操作步驟的組合,這樣我們只要設(shè)定好操作,無(wú)論是訓(xùn)練集還是測(cè)試集,都可以使用相同的步驟進(jìn)行處理,減少的代碼開發(fā)的同時(shí)還可以減少出錯(cuò)的概率。
原文鏈接:https://blog.csdn.net/huang5333/article/details/123791204
相關(guān)推薦
- 2022-11-08 服務(wù)器nginx權(quán)限被拒絕解決案例_nginx
- 2023-04-09 利用Matplotlib實(shí)現(xiàn)單畫布繪制多個(gè)子圖_python
- 2022-07-27 SQL解決未能刪除約束問(wèn)題drop?constraint_MsSql
- 2022-07-18 SpringBoot之定時(shí)任務(wù)三種實(shí)現(xiàn)方法
- 2022-12-14 C語(yǔ)言程序設(shè)計(jì)之指針的應(yīng)用詳解_C 語(yǔ)言
- 2022-02-24 Kubernetes究竟是個(gè)容器應(yīng)用程序還是集群操作系統(tǒng),它這么復(fù)雜的原因出在哪?
- 2023-03-29 python中文字符如何轉(zhuǎn)url編碼_python
- 2023-03-23 Android?View的事件分發(fā)機(jī)制深入分析講解_Android
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支