1. 程式人生 > >【Trick】資料預處理的常用方法

【Trick】資料預處理的常用方法

前言

本篇博文將介紹資料預處理的常用方法,這些方法僅根據本人接觸過的資料探勘專案中總結而來,如有疏漏或不合適的,望大佬們提出。

資料預處理

與我們從課本中獲得的資料集不同,實際應用中遇到的資料集常常是帶有噪聲、帶有缺失值、不符合相應的資料探勘模型的,我們首先要做的事情就是對資料進行預處理,據統計,在整個資料探勘過程中,資料的預處理過程常常會佔到整個生命週期的60%-70%,還經常有一句話:Trash In Trash Out,意思是在資料探勘過程中,如果預處理做的不好,模型中輸入的資料帶有噪聲、異常值等Trash,那麼模型輸出的結果也將是Trash,由此可見資料預處理的重要性。
本文算是我自己的一個總結,方便以後查閱。

文字預處理

對於文字的資料探勘,常常要進行預處理,尤其是對段落、句子進行的挖掘,常用的基本方法有:中文分詞、機械去重、停用詞過濾、關鍵詞提取等。jieba是一個非常優秀的中文分詞Python第三方程式庫,相應的R中有jiebaR庫,以此可實現中文分詞;在機械去重階段,需要注意根據專案的實際情況確定是否需要進行去重處理,如果你只是要統計每個句子之間的關係,而不考慮句子中單詞出現的次數,就需要進行機械去重,但是如果你想要得到句子的情感程度,重複的表達情感的單詞則顯得尤為重要,因此在此階段遵循的原則只有一個:具體情況具體分析!停用詞過濾很常用,像正常文字中的“了”、“的”等詞,在實際建模過程中並沒有對模型有任何影響,這類詞就可以認為是停用詞,判斷停用詞的方法常用的有兩種:一是基於字典的,這種方法就比較普遍,常見的停用詞都會出現在字典中,只需比對樣本語句和字典,相同的刪除即可;二是針對特有資料集自己推匯出停用詞,停用詞的特點就是:你有我有全都有,在每個預料中都會出現,而它本身又不帶有多少資訊,根據這個特點,可以採用類似TF-IDF演算法進行判斷,正常的TF-IDF演算法是求語句相關程度的,可以把它應用在每個分詞中,如果分詞在單個語料中詞頻很高,在每個預料中都有涉及,則說明這些分詞是共有的,帶有的資訊較少,可以將其認為是停用詞。

圖片資料預處理

之前實習接觸過些深度學習的專案,處理的主要是計算機視覺的相關問題,輸入為圖片,主要是基於卷積神經網路實現圖片處理,輸入圖片經常需要進行預處理,主要的操作有:資料增強、設定batch size、BN、灰度處理等操作。

資料增強

資料增強(Data Augment)作為深度學習中最常用的資料預處理方法,具有多種優勢,其基本思想是通過對圖片的翻轉、平移、剪裁、縮放等操作,從而增加資料量。對於卷積神經網路而言,增大資料量可以緩解過擬合,提高模型的泛化能力,從而提升準確率。

設定batch size

設定批處理(batch size),每次輸入到模型中訓練的並不是全部資料,考慮到模型的複雜度和計算量,如果將全部資料一次性地輸入模型中可能會造成I/O過載,不可取,而設定批處理,每次只輸入訓練集或測試集的一個子集,模型對輸入的特徵把握並不會太低,計算量又不至於太高。

BN

批標準化(batch normalization,BN),常用在卷積神經網路的影象處理中。

灰度處理

數值型資料預處理

對於數值型資料的預處理,可分為多種情況:缺失值的處理、異常值/離群點檢測、資料標準化、文字數值化、資料不均勻等,接下來將依次介紹。

缺失值處理

實際接觸的資料集,常存在的問題是存在缺失值,處理缺失值的方法很多,本文介紹常用的幾種:
(1)用均值填充。
(2)用中位數填充。
(3)用眾數填充。
(4)應用時序模型填充。對於時間序列資料,可以根據時間序列應用指數平滑、趨勢外推等方法對缺失值進行預測。
(5)刪除屬性。看似暴力的方法,對於那些單個屬性存在很多缺失值,上述方法不能很好填補缺失值時使用。

異常值/離群點檢測

異常值/離群點對於某些演算法,如聚類演算法等具有距離測度屬性的演算法,如logistic迴歸等異常值敏感的演算法,很容易受其影響。
(1)畫圖觀察
在樣本點不是很多的情況下,可以直接plot出散點圖直接觀察,使用python的matplotlib庫就可以輕鬆實現
(2)LOF離群點檢測

資料標準化

(1)z-score規範化
假設樣本空間為 X ,則z-score標準化的公式如下:

z_score(xi)=xiμ(X)σ(X)
其中, μ 表示樣本的平均數, σ 表示樣本標準差,z-score標準化實際上就是樣本點減去樣本均值後除以樣本標準差的結果。
基於Python實現z-score標準化的程式碼如下:
sklearn.preprocessing.scale(X)

(2)最小最大規範化
最小最大規範化將資料範圍壓縮到[0,1]之間,假設樣本空間為 X對於樣本屬性 x 存在如下轉化公式:

min_max_scale(x)=xmin(X)max(X)min(X)
最小最大規範化保持了資料原有的基本特徵,將其對映到小的範圍空間中,這種方法在聚類分析中經常使用,下面給出基於Python的程式碼,非常簡單:
# pip install scikit-learn
import sklearn
min_max_scaler = sklearn.preprocessing.MinMaxScaler()
min_max_scaler.fit_transform(X_train)

(3)二值化

binarizer = sklearn.preprocessing.Binarizer(threshold=1)
binarizer.transform(X)

文字數值化

對於文字屬性,在合適時候可以轉換成為數值型,比如我在之前的一個web招聘資料分析專案,其中有一個對招聘企業的評分,涉及到一個屬性是企業狀態:天使、A、B、C、D輪融資、不需要融資、即將上市、已上市等,對於這些資料,可以將其進行數值化,分別數值化成1、2、3、4、5、6、7、8,之後進行評分建模分析。

資料不均勻

資料不均勻問題很常見,也很容易被忽視掉,資料不均勻會導致模型精度下降,需要重視,假設有一個數據集,是一個二分類資料集,包含的正負樣本的比例為10:1,可以採用如下中的一種進行處理:
(1)從正樣本中隨機抽取十分之一與負樣本組成訓練集。這種情況需要注意:一定要保證是在資料量足夠大的情況下,如果資料本身就很少,這樣做反而會更加麻煩。
(2)賦予負樣本十倍於正樣本權重。由於負樣本比較少,這時增加負樣本權重,會彌補由於負樣本數量少帶來的影響。
(3)將負樣本資料額外複製9份,並新增極小噪聲。
下面是一個例項介紹資料不均勻會帶來的影響,可能有點極端,但用來解釋這個問題很合適。資料集:正樣本9900個,負樣本100個,合計10000個樣本點,用來進行二分類研究,如果直接進行建模,可能出現的一種情況是:模型將所有輸入都預測為正樣本,最終依舊會得到很高(99%)的準確率,而對於負樣本的召回率為0,如果只是對模型精度進行判斷根本檢查不出異常,但這樣的模型又是萬萬不能在實際中應用的。

總結

資料預處理方法多種多樣,在不同的業務背景、不同的資料特徵下使用的方法也不同,所以最保險的方法就是多瞭解各種資料預處理方法,然後根據實際的資料特徵選擇適合的處理方法,這樣才能最大程度的發揮資料特徵帶來的優勢。