一般來說,我們在擬合一個機器學習模型或是統計模型之前,總是要進行數據清理的工作。因爲沒有一個模型能用一些雜亂無章的數據來產生對項目有意義的結果。
數據清理或清除是指從一個記錄集、表或是數據庫中檢測和修改(或刪除)損壞或不準確的數據記錄的過程,它用於識別數據中不完整的、不正確的、不準確的或者與項目本身不相關的部分,然後對這些無效的數據進行替換、修改或者刪除等操作。
這是個很長的定義,不過描述的較爲簡單,容易理解。
爲了簡便起見,我們在Python中新創建了一個完整的、分步的指南,你將從中學習到如何進行數據查找和清理的一些方法:
-
缺失的數據;
-
不規則的數據(異常值);
-
不必要的數據——重複數據等;
-
不一致的數據——字母大小寫、地址等。
在本文中,我們將使用Kaggle提供的俄羅斯房地產數據集(
https://www.kaggle.com/c/sberbank-russian-housing-market/overview/description),目標是要預測一下俄羅斯近期的房價波動。我們不會去清理整個數據集,因爲本文只是會用到其中的一部分示例。
在對數據集開始進行清理工作之前,讓我們先簡單地看一下里面的數據。
從上述的結果中,我們瞭解到這個數據集總共有30471行和292列,還確定了特徵是數值變量還是分類變量,這些對我們來說都是有用的信息。
現在可以查看一下“dirty”數據類型的列表,然後逐個進行修復。
讓我們馬上開始。
缺失的數據
處理缺失的數據是數據清理中最棘手但也是最常見的一種情況。雖然許多模型可以適應各種各樣的情況,但大多數模型都不接受數據的缺失。
如何發現缺失的數據?
我們將爲你介紹三種技術,可以進一步瞭解在數據集中的缺失數據。
1、缺失數據的熱圖
當特徵數量較少的時候,我們可以通過熱圖來進行缺失數據的可視化工作。
下圖顯示了前30個特徵的缺失數據樣本。橫軸表示特徵的名稱;縱軸顯示觀測的數量以及行數;黃色表示缺失的數據,而其它的部分則用藍色來表示。
例如,我們看到特徵life_sq在許多行中是有缺失值的。而特徵floor在第7000行附近幾乎就沒有什麼缺失值。
缺失數據熱圖
2、缺失數據的百分比列表
當在數據集中有足夠多的特徵時,我們可以爲每個特徵列出缺失數據的百分比。
這將在下面形成一個列表,用來顯示每個特徵的缺失值的百分比。
具體來說,我們看到特徵life_sq缺失了21%的數據,特徵floor則只缺失了1%。這個列表是一個較爲有用的彙總,根據它就可以補充熱圖可視化了。
缺失數據的百分比列表——前30個特徵
3、缺失數據的直方圖
當我們有足夠多特徵的時候,缺失數據的直方圖也是一種技術。
爲了瞭解更多關於觀測數據的缺失值樣本的信息,我們可以使用直方圖來對它進行可視化操作。
這個直方圖有助於識別30471個觀測數據中的缺失值情況。
例如,有6000多個沒有缺失值的觀測數據,而將近4000個觀測數據中僅有一個缺失值。
缺失數據直方圖
我們應該怎麼做?
對於處理缺失的數據,沒有任何一致的解決辦法。我們必須在研究了特定的特徵和數據集之後,來決定處理它們的最佳方式。
在下文中,分別介紹了四種處理缺失數據的常見方法。但是,如果遇到更復雜的情況,我們就需要利用一些相對更加複雜的方法,比如缺失數據建模等。
1、放棄觀察
在統計學中,這種方法被稱爲列表刪除技術。在這個方案中,只要包含了一個缺失值,我們就要刪除整條的觀測數據。
只有當我們確定所缺失的數據沒有提供有用信息的時候,我們才能執行此操作。否則,我們應該考慮使用其它的辦法。
當然,也可以使用其它標準來刪除觀察數據。
例如,從缺失數據的直方圖中,我們可以看到總共缺失了至少35個以上的特徵觀測數據。我們可以創建一個新的數據集df_less_missing_rows,然後刪除具有35個以上缺失特徵的觀測數據。
2、刪除特徵
與方案一比較類似,我們只有在確定當前特徵沒有提供任何有用信息的時候才能執行這個操作。
例如,從缺失數據百分比的列表中,我們注意到hospital_beds_raion的缺失值百分比高達47%。那麼,我們就可以刪除整個特徵數據了。
3、填補缺失數據
當特徵是一個數值變量的時候,可以進行缺失數據的填補。我們會將缺失的值替換爲相同特徵數據中已有數值的平均值或是中值。
當特徵是一個分類變量的時候,我們可以通過模式(最頻繁出現的值)來填補缺失的數據。
以life_sq爲例,我們可以用它的中值來替換這個特徵的缺失值。
此外,我們還可以同時對所有的數字特徵使用相同的填補數據的方式。
比較幸運的是,我們的數據集中並沒有缺失分類特徵的值。然而,我們可以對所有的分類特徵進行一次性的模式填補操作。
4、替換缺失的數據
對於分類特徵,我們可以添加一個類似於“_MISSING_”這樣的值,這是一種新類型的值。對於數值特徵,我們可以使用-999這樣的特殊值來替換它。
這樣,我們仍然可以保留缺失值作爲有用的信息。
不規則的數據(異常值)
異常值是與其它的觀測值截然不同的數據,它們可能是真正的異常值或者是錯誤值。
如何發現不規則的數據?
根據特徵是數值的還是分類的,我們可以使用不同的技術來研究其分佈特點用以檢測它的異常值。
1、直方圖和方框圖
當特徵是數值的時候,我們可以使用直方圖或者是方框圖來檢測它的異常值。
下面是特徵life_sq的直方圖。
由於可能存在異常值,因此,數據準確性的差別看起來是異常顯著的。
直方圖
爲了更深入地研究這個特徵,下面我們來畫一個方框圖。
在這個圖中,我們可以看到一個超過7000的異常值。
方框圖
2、描述性統計數據
此外,對於數值特徵,異常值可能過於明顯,以致方框圖無法對其進行可視化。相反地,我們可以看看它們的描述性統計數據。
例如,對於特徵life_sq,我們可以看到最大值是7478,而75%的四分位數只有43。很明顯,7478值是一個異常值。
3、條形圖
對於分類特徵,我們可以使用條形圖來了解特徵的類別以及分佈的情況。
例如,特徵ecology具有合理的分佈,但是,如果有一個類別只有一個叫做“other”的值,那麼這肯定就是一個異常值。
條形圖
4、其它的技術
還有許多其它的技術也可以用來發現異常值,例如散點圖、z-score和聚類等等,在這裏將不會一一進行講解。
我們應該怎麼做?
雖然尋找異常值並不是什麼難事,但是我們必須確定正確的解決辦法來進行處理。它高度依賴於所使用的數據集和項目的目標。
處理異常值的方法有些類似於缺失數據的操作。我們要麼放棄、要麼調整、要麼保留它們。對於可能的解決方案,我們可以參考本文的缺失數據部分。
不必要的數據
在對缺失數據和異常值進行了所有的努力之後,讓我們看看關於不必要的數據,這就更簡單了。
首先,所有輸入到模型中的數據都應該爲項目的目標服務。不必要的數據就是數據沒有實際的數值。根據不同的情況,我們主要劃分了三種類型的不必要數據。
1、無信息或者重複值
有時,一個特徵沒有有用的信息,因爲太多的行具有相同的值。
如何發現無信息或者重複值?
我們可以創建一個具有相同數值的百分比較高的特徵列表。
例如,我們在下面指定顯示95%以上的具有相同值的行的特徵。
我們可以一個一個地研究這些變量,看看它們是否具有有價值的信息,在這裏就不顯示細節了。
我們應該怎麼做?
我們需要了解重複特徵背後的原因,當它們真的缺少有用信息的時候,就可以把它們放棄了。
2、不相關的數據
同樣,數據需要爲項目提供有用的信息。如果這些特徵數據與我們在項目中要解決的問題沒什麼關係,那麼它們就是不相關的。
如何發現不相關的數據?
首先,我們需要瀏覽一下這些特徵,以便之後能識別那些不相關的數據。
例如,一個記錄多倫多天氣的特徵數據並不能爲預測俄羅斯房價提供任何有用的信息。
我們應該怎麼做?
當這些特徵數據並不符合項目的目標時,我們就可以放棄它們了。
3、重複數據
重複數據是指存在多個相同的觀測值。
重複數據主要包含兩種類型。
(1)基於所有特徵的重複數據
如何發現基於所有特徵的重複數據?
當觀察到的所有特徵數據都相同的時候,就會發生這種重複現象,這是很容易發現的。
我們首先要去除數據集中的唯一標識符id,然後通過刪除重複數據來創建一個名爲df_dedupped的數據集。我們通過比較兩個數據集(df和df_deduped),找出有多少個重複行。
得出,10行是完全重複的觀察結果。
我們應該怎麼做?
我們應該刪除這些重複數據。
(2)基於關鍵特徵的重複數據
如何發現基於關鍵特徵的重複數據?
有時最好根據一組唯一的標識符來刪除那些重複的數據。
例如,同一建築面積、同一價格、同一建築年份的兩個房產交易同時發生的可能性幾乎爲零。
我們可以設置一組關鍵特徵作爲交易的唯一標識符,包括timestamp、 full_sq、life_sq、floor、build_year、num_room、price_doc,我們會檢查是否有基於這些標識符的副本(重複記錄)。
基於這組關鍵特徵,共有16個副本,也就是重複數據。
我們應該怎麼做?
我們可以根據關鍵特徵刪除這些重複數據。
我們在名爲df_dedupped2的新數據集中刪除了16個重複數據。
不一致的數據
讓數據集遵循特定的標準來擬合模型也是至關重要的。我們需要用不同的方法去探索數據,這樣就可以找出不一致的數據了。很多時候,這取決於細緻的觀察和豐富的經驗,並沒有固定的代碼用來運行和修復不一致的數據。
下面我們將介紹四種不一致的數據類型。
1、大小寫不一致
在分類值中存在着大小寫不一致的情況,這是一個常見的錯誤。由於Python中的數據分析是區分大小寫的,因此這就可能會導致問題的出現。
如何發現大小寫不一致?
先讓我們來看看特徵sub_area。
它用來存儲不同地區的名稱,看起來已經非常的標準化了。
但是,有時候在同一個特徵數據中存在着大小寫不一致的情況。舉個例子,“Poselenie Sosenskoe”和“pOseleNie sosenskeo”就可能指的是同一地區。
我們應該怎麼做?
爲了避免這種情況的發生,我們要麼所有的字母用小寫,要麼全部用大寫。
2、數據格式不一致
我們需要實行的另一個標準化是數據格式。這裏有一個例子,是將特徵從字符串(String)格式轉換爲日期時間(DateTime)格式。
如何發現不一致的數據格式?
特徵timestamp是以字符串的格式來表示日期的。
我們應該怎麼做?
我們可以使用下面的代碼進行轉換,並提取出日期或時間的值。之後,會更容易按年或月進行分組的交易量分析。
3、數據的分類值不一致
不一致的分類值是我們要討論的最後一種不一致數據的類型。分類特徵值的數量有限。有時候由於輸入錯誤等原因,可能會存在其它的值。
如何發現不一致的分類值?
我們需要仔細觀察一個特徵來找出不一致的值,在這裏,我們用一個例子來說明一下。
由於我們在房地產數據集中並不存在這樣的問題,因此,我們在下面創建了一個新的數據集。例如,特徵city的值被錯誤地定義爲“torontoo”和“tronto”。但它們兩個都指向了正確的值“toronto”。
一種簡單的確認方法是模糊邏輯(或是編輯間隔,edit distance)。它衡量了我們需要更改一個值的拼寫用來與另一個值進行匹配的字母差異數量(距離)。
我們知道這些類別應該只有“toronto”、“vancouver”、“montreal”以及“calgary”這四個值。我們計算了所有的值與單詞“toronto”(和“vancouver”)之間的距離。可以看到,那些有可能是打字錯誤的單詞與正確的單詞之間的距離較小,因爲它們之間只差了幾個字母而已。
我們應該怎麼做?
我們可以設置一個標準將這些錯誤的拼寫轉換爲正確的值。例如,下面的代碼將距離“toronto”2個字母以內的所有值都設置爲“toronto”。
4、地址數據不一致
地址特徵目前成爲了我們許多人最頭疼的問題。因爲人們經常在不遵循標準格式的情況下,就將數據輸入到數據庫中了。
如何發現不一致的地址?
我們可以通過查看數據來找到難以處理的地址。即使有時候我們發現不了任何問題,但我們還可以運行代碼,對地址數據進行標準化處理。
在我們的數據集中沒有屬於隱私的地址。因此,我們利用特徵address創建了一個新的數據集df_add_ex。
正如我們所看到的那樣,地址數據可是非常不規範的。
我們應該怎麼做?
我們運行下面的代碼,目的是將字母統一變成小寫的、刪除空格、刪除空行以及進行單詞標準化.
現在看起來好多了。
我們終於完成了,經過了一個很長的過程,清除了那些所有阻礙擬合模型的“dirty”數據。
原文鏈接:
https://towardsdatascience.com/data-cleaning-in-python-the-ultimate-guide-2020-c63b88bf0a0d