機器學習中資料清洗的藝術

dicksonjyl560101發表於2019-08-23
作者:George Seif
編譯:ronghuaiyang

導讀

資料清洗是大資料處理的第一步,很多同學對這一步感到沒有頭緒,不知道哪些該清洗掉,哪些不該,看看這篇文章,是不是能有點啟發?

像奧巴馬丟掉麥克風一樣丟掉壞資料

清理資料應該是資料科學(DS)或機器學習(ML)工作流的第一步。如果沒有清晰的資料,你將很難看到探索中真正重要的部分。一旦你最終開始訓練ML模型,那麼訓練它們就會變得不必要地更具挑戰性。主要的一點是,如果你希望最大限度地利用資料,那麼它應該是乾淨的。

在資料科學和機器學習的上下文中,資料清理意味著過濾和修改資料,使其更易於探索、理解和建模。過濾掉你不想要或不需要的部分,這樣你就不需要檢視或處理它們。修改你確實需要的部分,但它們的格式不是您需要的,以便您可以正確地使用它們。

在這裡,我們將瞭解一些我們通常希望在資料中清理的東西,以及你可以使用的panda程式碼!

資料缺失

大型資料集很少是完全完整的。這裡的完整指的是所有資料點的所有特徵變數都有值。通常會丟失一些值,當在panda中載入類似“pd.read_csv()”的值時,這些值被標記為NaN或None。有許多非常實際的原因可以解釋為什麼這些資料會丟失。收集資料的人可能只是忘記了,或者他們直到資料收集過程的一半才開始收集該特性變數。

在使用資料集之前,需要處理丟失的資料。例如,假設你正在做資料探索,發現關於資料的一些關鍵資訊來自某個特性變數,例如“變數F”。但之後你會發現資料集中95%的變數F值都是NaNs,你不可能從一個僅恰當地表示資料的5%的變數中對資料集作出任何具體的結論!當你開始訓練你的ML模型時,你的程式也可能將NaNs視為0或無窮大,從而導致了你的訓練出現問題!

在pandas中有一些方法可以處理丟失的資料:

檢查NANs: pd.isnull(object) 檢測資料中缺失的值,它同時檢測“NaN”和“None”

刪除丟失的資料: df.dropna(axis=0,how='any')返回資料幀,其中刪除了包含NaNs的任何資料點。

替換缺少的資料: df.replace(to_replace=None,value=None)如果你知道希望這個特性變數是什麼值,那麼這是非常有用的。

刪除一個特徵: df.drop('feature_variable_name',axis=1)如果你發現某個特性變數在資料集中有>90%的NaN,那麼從你的資料中刪除整個特徵是有意義的。

機器學習中資料清洗的藝術

丟掉那些不好的特徵,比如奧巴馬的麥克風

離群值

資料集中的異常值是混合的。一方面,它們可能包含關鍵資訊,因為它們與主要的群體非常不同。另一方面,他們拋棄了我們對主要群體的看法,因為我們必須看得如此之遠,只是為了看到離群值!在ML方面,包含異常值的訓練可以使你的模型很好地一般化,但也可以將其從你的大多數資料所在的主要群體中剔除。

一般來說,通常建議從兩個方面來考慮。研究有或沒有異常值的資料。如果你決定你的ML模型需要它們,那麼選擇一個足夠健壯的方法來處理它們。如果你發現這些離群值確實存在,並且對於獲取全域性資訊和資料建模沒有幫助,那麼最好像上一節所示的那樣刪除它們。

此外,如果你希望過濾出這些異常值,可以使用以下方法:

# Get the 98th and 2nd percentile as the limits of our outliers

upper_limit = np.percentile(train_df.logerror.values, 98)
lower_limit = np.percentile(train_df.logerror.values, 2)
# Filter the outliers from the dataframe
data[‘target’].loc[train_df[‘target’]>upper_limit] = upper_limit data[‘target’].loc[train_df[‘target’]<lower_limit] = lower_limit
機器學習中資料清洗的藝術

機器學習中資料清洗的藝術

包含異常值的圖(左)和剔除異常值的直方圖(右)

壞資料和重複資料

壞資料是指任何不應該存在的資料點或值,或者是完全錯誤的資料點或值。例如,假設你的一個特徵變數名為“gender”,其中大多數值是“male”或“female”。但是,當你瀏覽資料集時,您會注意到有幾個資料點的性別值為67.3 !顯然,67.3在這個變數中沒有任何意義。此外,如果你嘗試將“gender”特徵變數轉換為分類浮點數:male = 0.0, female = 1.0,那麼您將得到一個額外的浮點數:67.3 = 2.0!

重複僅僅是資料集中重複的資料點。如果有太多這樣的特徵,就會影響ML模型的訓練。正如我們前面看到的,重複資料可以簡單地從資料中刪除。

壞資料可以通過刪除或使用一些智慧替換來處理。例如,我們可以檢視性別為67.3的資料點,發現所有這些資料點的正確值都應該是“女性”。因此,我們只需將所有67.3值轉換為“女性”。這樣做的好處是,我們有效地為ML訓練重新獲得了這些資料點,而不是將它們丟棄。你可以使用pandas做這樣的轉換:

value_map = {'male': 'male', 'female': 'female', '67.3': 'female'}

pd_dataframe['gender'].map(value_map)


機器學習中資料清洗的藝術

小心重複的Loki資料

不相關的特徵

並非所有的特徵都是相同的。有些東西你可能根本不需要!例如,你可能正在檢視過去一年從Amazon購買的圖書的資料集,其中一個特性變數稱為“font-type”,表示書中使用的字型型別。這和預測一本書的銷量是毫無關係的!你可以安全地把這個功能丟棄,就像這樣:

df.drop('feature_variable_name', axis=1)

這樣做使你的資料探索更容易,因為你不需要檢視那麼多東西。由於你沒有處理那麼多的資料,它還有助於使ML模型的訓練變得更容易和更快。如果你不確定變數是否重要,那麼你可以一直等到開始研究資料集時再決定。計算特徵變數與目標輸出之間的相關矩陣有助於確定該變數的重要性。

機器學習中資料清洗的藝術

當你的特徵變數沒什麼用時…

標準化

每個特徵變數中的所有資料都應該採用相同的標準化格式。它將使資料探索和建模的技術方面更加容易。例如,讓我們再次以“gender”變數為例,它的值是“male”或“female”。如果資料是由人類收集的,你可能會得到許多你沒有預料到的不同的值:

  • male, female(這個不錯)
  • MALE, FEMALE(帶大寫鎖定)
  • Male, Female (有些人會大寫)
  • Make,Femall(拼寫錯誤!)

如果我們直接將特徵變數轉換為分類浮點數,我們會得到比我們想要的0和1更多的值!我們會得到這樣的結果:

{

'male': 0,
'female': 1,
'MALE': 2,
'FEMALE': 3,
'Male': 4,
'Female': 5,
'Make': 6,
'Femall': 7
}

處理這種情況有兩種方法。如果是一些簡單的事情,比如把第一個字母大寫或者小寫,就像這樣做:

# Make the whole string lower case

s.lower()
# Make the first letter capitalised
s.capitalize()

如果有拼寫錯誤,你會想要使用我們之前看到的對映函式:

value_map = {'Make': 'male', 'Femall': 'female'}

pd_dataframe['gender'].map(value_map)

英文原文:https://towardsdatascience.com/the-art-of-cleaning-your-data-b713dbd49726



https://www.toutiao.com/a6727984298994958855/

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/29829936/viewspace-2654662/,如需轉載,請註明出處,否則將追究法律責任。

相關文章